阿里云语音
通过阿里云语音服务 SingleCallByTts 给值班同学打电话播报告警,新人可按步骤直接完成配置。
概述
阿里云语音通知媒介利用 阿里云 语音服务(VMS) · 语音通知(SingleCallByTts) API,把告警以 TTS(文字转语音)的方式自动拨打到值班人员的手机上。一般用于"必须被叫醒"的 P0 级告警。
- 适用场景:夜间/节假日的严重告警,电话比 IM 更容易把人叫醒。
- 你需要准备:
- 一个已实名认证、开通语音服务的阿里云账号;
- 阿里云 AccessKey ID / AccessKey Secret(建议用 RAM 子账号,只授予语音服务的发送权限);
- 已通过审核的 TTS 语音模板(
TtsCode/TTS_1234567); - 可选)已申请的被叫显号(
CalledShowNumber),如果没申请会显示阿里云官方号码。
- 整个配置分三步:①在阿里云开通语音服务并申请 TTS 模板 → ②在夜莺新建阿里云语音通知媒介 → ③给用户配置手机号,通知规则里选择接收人。
阿里云语音服务对于 TTS 模板、显号等需要工单审核,审核周期通常 1~3 个工作日,建议提前 1 周启动。
第一步:在阿里云控制台准备资料
-
登录 阿里云语音服务控制台,首次使用需要开通服务。
-
创建 TTS 模板(语音模板):
-
进入 国内语音 → 语音模板管理 → 添加模板;
-
模板类型选"文本转语音模板";
-
关键:变量名要叫
incident,因为夜莺预置的请求体里写的是TtsParam = {"incident":"故障{{$tpl.incident}},一键认领请按1"}——也就是说,最终会把"故障 + 规则名 + ,一键认领请按1"这一整段文本作为${incident}的取值传给阿里云; -
推荐模板内容(最简单、最能避免变量长度问题):
您有一条告警 ${incident}审核通过后实际播报会是:
您有一条告警 故障CPU使用率超阈值,一键认领请按1。 -
提交审核,通过后得到模板编号
TTS_XXXXXXXX。
-
-
(可选)申请被叫显号:进入 号码管理 → 号码申请,申请一个专属号码
CalledShowNumber。没申请的话走的是阿里云默认外呼号码。 -
在 RAM 访问控制 创建一个子账号,授予权限
AliyunDyvmsFullAccess,记下 AccessKey ID 与 AccessKey Secret(Secret 只显示一次,务必保存好)。
第二步:在夜莺新建阿里云语音通知媒介
-
登录夜莺 → 左侧菜单 通知 → 通知媒介。
-
在左侧类型面板中点击 阿里云语音,进入新建页面(URL
/notification-channels/add?ident=ali-voice)。 -
填写基础信息:

区块 字段 是否需要改 说明 基础配置 名称 需要 例如 阿里云语音,在通知规则里选媒介时看到的就是这个名字变量配置 联系方式 保持默认 Phone语音通知必须以用户的手机号作为 $sendtoHTTP 配置 URL 保持默认 https://dyvmsapi.aliyuncs.com(语音服务固定域名)HTTP 配置 请求方法 POSTHTTP 配置 请求头 保持默认 Content-Type: application/json、Host: dyvmsapi.aliyuncs.com,签名时需要,不要删 -
往下滚动到"请求参数",这里是唯一需要改的地方:

把预置字段里的占位符替换成你的实际值:
参数名 值 说明 AccessKeyId 你的 AK ID 在第一步 RAM 控制台拿到的 LTAI5t...AccessKeySecret 你的 AK Secret 对应的 Secret,保存好不要泄露 CalledNumber {{ $sendto }}保持默认,发送时会替换成接收人的手机号 CalledShowNumber 你的显号 或 留空 没申请显号就把这一整行删掉,阿里云会用默认号呼出 TtsCode TTS_XXXXXXXX第一步申请到的语音模板编号 TtsParam {"incident":"故障{{$tpl.incident}},一键认领请按1"}模板里的变量赋值,JSON 字符串;左边 key(这里是 incident)必须和阿里云 TTS 模板里的${xxx}变量名完全一致。{{$tpl.incident}}来自系统自带的Aliyun Voice消息模板(默认就是{{$event.RuleName}})夜莺后端会自动用你填的 AK/SK 计算 ACS3-HMAC-SHA256 签名,并在发送前把
AccessKeyId / AccessKeySecret从请求中移除,不会明文出现在调用里。 -
点击 保存。
第三步:给用户配置手机号 & 通知规则
- 进入 人员组织 → 用户管理,给需要接电话的用户填写手机号字段(必须是 11 位中国手机号;如需国际漫游请在阿里云单独开通)。
- 进入 通知 → 通知规则 → 新增:
- 通知媒介:选择阿里云语音媒介;
- 消息模板:选系统自带的
Aliyun Voice——它的incident字段默认渲染为{{$event.RuleName}}(仅规则名,最短)。和默认请求体TtsParam = {"incident":"故障{{$tpl.incident}},一键认领请按1"}配合,最终送到阿里云的变量值约等于故障<规则名>,一键认领请按1; - 接收人 / 接收团队:选目标用户(用户必须已填手机号);
- 适用级别:建议只勾一级报警(Critical);
- 保存。
- 点击"通知测试",测试机应当在 10 秒内响起并播报一段 TTS 告警语音。
阿里云侧的计费与配额
- 语音通知按通话时长计费,具体价格参考 阿里云语音服务定价。
- 每个自然日同一号码呼叫次数有默认上限(可工单申请调高)。被叫接通率、接听时长都可以在阿里云控制台的"用量统计"里查看。
- 接通后如果对方按键(如按"1"认领),阿里云会把按键事件回调给你预留的回调地址——夜莺 v8 默认不处理这种回调;如果确需认领,需要自行接收回调 Webhook。
常见问题
Q1:返回 InvalidAccessKeyId.NotFound / SignatureDoesNotMatch?
A:AK 填错或者 Secret 填错。常见原因:
- 把子账号的 Display Name 当成 AK ID 填了;
- 粘贴 AK Secret 时带了多余的空格 / 换行;
- 子账号所在 RAM 策略未授权语音服务,
AliyunDyvmsFullAccess没挂上去。
Q2:返回 isv.SMART_INVALID_APP_KEY / TtsCode Invalid?
A:TtsCode 填错或语音模板没审核通过。登录语音服务控制台 → 语音模板管理,确认模板状态为 审核通过。
Q3:TtsParam 报错 TtsParam variable not match?
A:TtsParam 里的 key 必须和语音模板里 ${xxx} 部分一模一样,并且所有变量都要给值。例如模板 您有一条告警 ${incident},请按 ${button} 认领,TtsParam 必须写 {"incident":"...","button":"1"}。
Q4:isv.MOBILE_NUMBER_ILLEGAL?
A:用户填的手机号格式不对。语音服务要求不带国家码的 11 位中国手机号;国际号码需要单独工单申请。