You need to enable JavaScript to run this app. 基于Node.js使用ACS与Bot Framework开发Telephony Bot发送SSML响应失败
优惠活动
大模型
产品
解决方案
定价
更多

基于Node.js使用ACS与Bot Framework开发Telephony Bot发送SSML响应失败

Node.js 下ACS+Bot Framework Telephony Bot 运行异常修正方案

当前开发场景与问题

  • 开发环境:Node.js 技术栈,基于Azure Communication Services(ACS)、Bot Framework搭建电话接入类机器人(Telephony Bot)
  • 异常表现:程序无法正常运行,对应的语音响应发送逻辑存在格式、API调用层面的问题

问题代码

let speech = `<speak
                version="1.0"
                xmlns="https://www.w3.org/2001/10/synthesis"
                xmlns:mstts="https://www.w3.org/2001/mstts"
                xml:lang="en-US">
                <voice name="en-US-JessaNeural">
                  <mstts:express-as type="cheerful">That'd be just amazing!</mstts:express-as>
                </voice>
                <voice name="ja-JP-Ayumi-Apollo">
                  <prosody pitch="+150%">素晴らしい!</prosody>
                </voice>
              </speak>`
session.send(speech);

原始代码中的speech字符串存在HTML实体转义残留,实际运行时会导致SSML解析失败

核心问题定位

  • SSML内容转义错误:原始代码中的speech字符串被做了HTML实体转义,把标签尖括号、引号替换成了&lt;、&gt;、&quot;这类转义字符,程序拿到内容后会当成纯文本处理,无法识别合法的语音合成标签结构
  • API调用方式错误:旧版session.send是适配文本聊天通道的方法,直接传入整段SSML会被当成普通文本内容发送,语音通道无法正确触发语音合成流程
  • 语音资源不兼容:代码中使用的ja-JP-Ayumi-Apollo为预览版语音模型,ACS Telephony通道的正式生产环境未对该模型做全量适配,会触发资源校验失败导致程序崩溃

修正方案

  1. 还原SSML字符串的转义内容,保证标签结构完全符合W3C语音合成规范,无多余转义字符
  2. 替换预览版语音名称为通道正式支持的稳定版模型,将ja-JP-Ayumi-Apollo替换为正式商用的ja-JP-NanamiNeural
  3. 替换API调用方式,弃用旧版session.send,改用Bot Framework 4.x版本的context.sendActivity方法,将SSML内容赋值给活动的speak字段,避免把SSML当成纯文本发送
  4. 检查本地ACS、Bot Framework相关依赖版本,确保和Telephony Bot的兼容版本匹配

修正后参考代码

const { ActivityTypes } = require('botbuilder');

// 构造合法可解析的SSML内容
const speechContent = `<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-JessaNeural">
    <mstts:express-as type="cheerful">That'd be just amazing!</mstts:express-as>
  </voice>
  <voice name="ja-JP-NanamiNeural">
    <prosody pitch="+150%">素晴らしい!</prosody>
  </voice>
</speak>`;

// 发送适配语音通道的响应活动
await context.sendActivity({
  type: ActivityTypes.Message,
  text: 'That\'s great! 太棒了!',
  speak: speechContent
});

内容的提问来源于stack exchange,提问作者Sahil Saini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 19:36:05