使用Dialogflow Webhook结合SSML提问时遇Google Assistant报错求助
解决Dialogflow + Google Actions中SSML响应报错问题
我来帮你排查这个SSML的问题,看起来你踩了两个常见的坑,咱们一步步来解决:
问题根源分析
- 第一次尝试直接传转义字符串:当你把带
<break>的字符串直接传给conv.ask()时,Google Assistant会把它当成纯文本处理,所以会把<break>这些字符直接朗读出来,而不是解析成停顿指令。 - 第二次使用
Text构造器但报错:你传入的ssml参数是HTML转义后的字符串(用<代替了<),Google Assistant无法识别这种格式的SSML,导致它无法正确解析你的响应,最终抛出MalformedResponse错误。
具体解决方案
1. 使用未转义的SSML标签
直接在代码中写原始的SSML标签,不需要做HTML转义(比如直接写<break time="500ms"/>,而不是<break time="500ms"/>)。dialogflow-fulfillment库会自动处理JSON序列化时的引号转义,确保传给Google Assistant的是正确格式的内容。
2. 正确构造Text响应
修改你的代码如下:
const { WebhookClient, Text } = require('dialogflow-fulfillment'); function yourIntentHandler(agent) { const conv = agent.conv(); // 也可以用client.conv(),看你的代码结构 // 纯文本版本(用于屏幕显示) const displayText = 'Hi Can I help you?'; // SSML版本(用于语音朗读,直接用原始标签) const ssmlSpeech = 'Hi <break time="500ms"/> Can I help you?'; // 用Text类同时传入显示文本和语音SSML conv.ask(new Text({ text: displayText, ssml: ssmlSpeech })); agent.add(conv); }
3. 验证返回的Payload格式
正确的响应Payload应该类似这样(注意SSML标签是原始的<break>,在JSON中仅转义了双引号):
{ "payload": { "google": { "expectUserResponse": true, "richResponse": { "items": [ { "displayText": "Hi Can I help you?", "textToSpeech": "Hi <break time=\"500ms\"/> Can I help you?" } ] } } } }
额外小贴士
- 在Google Actions模拟器测试时,切换到Fulfillment标签页,查看返回的Payload是否符合上面的格式,重点检查
textToSpeech字段里的SSML有没有多余的HTML转义字符。 - 如果需要使用更复杂的SSML(比如插入音频、调整语调),直接遵循标准SSML语法即可,不需要做任何额外转义。
内容的提问来源于stack exchange,提问作者Vineet
相关产品推荐
相关产品推荐

