基于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实体转义,把标签尖括号、引号替换成了
<、>、"这类转义字符,程序拿到内容后会当成纯文本处理,无法识别合法的语音合成标签结构 - API调用方式错误:旧版
session.send是适配文本聊天通道的方法,直接传入整段SSML会被当成普通文本内容发送,语音通道无法正确触发语音合成流程 - 语音资源不兼容:代码中使用的
ja-JP-Ayumi-Apollo为预览版语音模型,ACS Telephony通道的正式生产环境未对该模型做全量适配,会触发资源校验失败导致程序崩溃
修正方案
- 还原SSML字符串的转义内容,保证标签结构完全符合W3C语音合成规范,无多余转义字符
- 替换预览版语音名称为通道正式支持的稳定版模型,将
ja-JP-Ayumi-Apollo替换为正式商用的ja-JP-NanamiNeural - 替换API调用方式,弃用旧版
session.send,改用Bot Framework 4.x版本的context.sendActivity方法,将SSML内容赋值给活动的speak字段,避免把SSML当成纯文本发送 - 检查本地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
相关产品推荐
相关产品推荐

