使用Bot Framework SDK开发的Cortana Skill为何无法朗读提示语?
解决Cortana Skill提示语不朗读的问题
完全可以实现Cortana朗读自定义提示语的功能,你遇到的问题大概率是因为返回给Cortana的消息没有正确配置朗读相关的属性。下面是具体的解决方法和代码示例:
核心原理
Cortana会优先读取Bot返回消息中的Speak属性内容来进行朗读,而不是默认读取显示用的Text字段。所以只要在回复消息时显式设置这个属性,就能触发语音朗读。
具体操作步骤
1. 为回复消息添加Speak属性
不管你用的是C#还是Python版本的Bot Framework SDK,都可以在构造回复消息时直接设置Speak字段,支持纯文本或SSML(语音合成标记语言)格式。
C# 示例代码:
// 基础纯文本朗读 var reply = MessageFactory.Text("请告诉我你的需求"); reply.Speak = "请告诉我你的需求"; // 或者用SSML实现更自然的朗读效果(比如停顿、语气调整) reply.Speak = "<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='zh-CN'>请告诉我你的需求</speak>"; await turnContext.SendActivityAsync(reply, cancellationToken);
Python 示例代码:
# 基础纯文本朗读 reply = MessageFactory.text("请告诉我你的需求") reply.speak = "请告诉我你的需求" # SSML增强版 reply.speak = "<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='zh-CN'>请告诉我你的需求</speak>" await turn_context.send_activity(reply)
2. 用SSML优化朗读体验
如果需要更自然的语音输出(比如添加停顿、强调特定内容),可以使用SSML标记来控制。举个例子:
<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='zh-CN'> <p>欢迎使用我的技能<break time='500ms'/>请问你需要什么帮助?</p> </speak>
把这段代码放到Speak属性中,Cortana就会按照设置的停顿来朗读。
3. 卡片消息的特殊处理
如果你的回复是卡片(比如Hero Card、Adaptive Card),Cortana不会自动朗读卡片里的文本内容,需要单独在Activity的Speak属性中设置朗读内容:
var heroCard = new HeroCard { Title = "欢迎界面", Text = "请选择你要执行的操作" }; var reply = MessageFactory.Attachment(heroCard.ToAttachment()); // 手动设置Cortana要朗读的内容 reply.Speak = "欢迎使用我的技能,请选择你要执行的操作"; await turnContext.SendActivityAsync(reply, cancellationToken);
4. 检查基础配置
- 确保你的Cortana技能发布配置中没有禁用语音输出选项;
- 测试时确认设备的语音功能正常,Cortana音量未被静音;
- 注意
xml:lang属性要匹配你的技能语言(比如中文用zh-CN,英文用en-US),避免朗读语言不匹配的问题。
常见误区
- 不要只设置
Text字段而忽略Speak:Cortana不会默认朗读Text内容; - SSML格式要正确:如果标记写错,可能导致朗读失败,建议参考官方SSML规范编写;
- 避免过长的朗读内容:太长的文本会影响用户体验,尽量拆分或精简。
按照上面的方法调整你的Bot回复逻辑,就能让Cortana正常朗读你设置的提示语了。
内容的提问来源于stack exchange,提问作者Bruno Alves
相关产品推荐
相关产品推荐

