阿里云语音

通过阿里云语音服务 SingleCallByTts 给值班同学打电话播报告警,新人可按步骤直接完成配置。

概述

阿里云语音通知媒介利用 阿里云 语音服务(VMS) · 语音通知(SingleCallByTts) API,把告警以 TTS(文字转语音)的方式自动拨打到值班人员的手机上。一般用于"必须被叫醒"的 P0 级告警。

  • 适用场景:夜间/节假日的严重告警,电话比 IM 更容易把人叫醒。
  • 你需要准备:
    • 一个已实名认证、开通语音服务的阿里云账号;
    • 阿里云 AccessKey ID / AccessKey Secret(建议用 RAM 子账号,只授予语音服务的发送权限);
    • 通过审核的 TTS 语音模板TtsCode / TTS_1234567);
    • 可选)已申请的被叫显号CalledShowNumber),如果没申请会显示阿里云官方号码。
  • 整个配置分三步:①在阿里云开通语音服务并申请 TTS 模板 → ②在夜莺新建阿里云语音通知媒介 → ③给用户配置手机号,通知规则里选择接收人

阿里云语音服务对于 TTS 模板、显号等需要工单审核,审核周期通常 1~3 个工作日,建议提前 1 周启动。

第一步:在阿里云控制台准备资料

  1. 登录 阿里云语音服务控制台,首次使用需要开通服务。

  2. 创建 TTS 模板(语音模板):

    • 进入 国内语音 → 语音模板管理 → 添加模板

    • 模板类型选"文本转语音模板";

    • 关键:变量名要叫 incident,因为夜莺预置的请求体里写的是 TtsParam = {"incident":"故障{{$tpl.incident}},一键认领请按1"} ——也就是说,最终会把"故障 + 规则名 + ,一键认领请按1"这一整段文本作为 ${incident} 的取值传给阿里云;

    • 推荐模板内容(最简单、最能避免变量长度问题):

      您有一条告警 ${incident}
      

      审核通过后实际播报会是:您有一条告警 故障CPU使用率超阈值,一键认领请按1

    • 提交审核,通过后得到模板编号 TTS_XXXXXXXX

  3. (可选)申请被叫显号:进入 号码管理 → 号码申请,申请一个专属号码 CalledShowNumber。没申请的话走的是阿里云默认外呼号码。

  4. RAM 访问控制 创建一个子账号,授予权限 AliyunDyvmsFullAccess记下 AccessKey ID 与 AccessKey Secret(Secret 只显示一次,务必保存好)。

第二步:在夜莺新建阿里云语音通知媒介

  1. 登录夜莺 → 左侧菜单 通知 → 通知媒介

  2. 在左侧类型面板中点击 阿里云语音,进入新建页面(URL /notification-channels/add?ident=ali-voice)。

  3. 填写基础信息:

    阿里云语音基础配置

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

    阿里云语音请求参数

    把预置字段里的占位符替换成你的实际值:

    参数名 说明
    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 从请求中移除,不会明文出现在调用里。

  5. 点击 保存

第三步:给用户配置手机号 & 通知规则

  1. 进入 人员组织 → 用户管理,给需要接电话的用户填写手机号字段(必须是 11 位中国手机号;如需国际漫游请在阿里云单独开通)。
  2. 进入 通知 → 通知规则 → 新增
    • 通知媒介:选择阿里云语音媒介;
    • 消息模板:选系统自带的 Aliyun Voice——它的 incident 字段默认渲染为 {{$event.RuleName}}(仅规则名,最短)。和默认请求体 TtsParam = {"incident":"故障{{$tpl.incident}},一键认领请按1"} 配合,最终送到阿里云的变量值约等于 故障<规则名>,一键认领请按1
    • 接收人 / 接收团队:选目标用户(用户必须已填手机号);
    • 适用级别:建议只勾一级报警(Critical);
    • 保存。
  3. 点击"通知测试",测试机应当在 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 位中国手机号;国际号码需要单独工单申请。

参考资料

更新时间 2026-04-25

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云