You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Dialogflow Webhook结合SSML提问时遇Google Assistant报错求助

解决Dialogflow + Google Actions中SSML响应报错问题

我来帮你排查这个SSML的问题,看起来你踩了两个常见的坑,咱们一步步来解决:

问题根源分析

  1. 第一次尝试直接传转义字符串:当你把带<break>的字符串直接传给conv.ask()时,Google Assistant会把它当成纯文本处理,所以会把<break>这些字符直接朗读出来,而不是解析成停顿指令。
  2. 第二次使用Text构造器但报错:你传入的ssml参数是HTML转义后的字符串(用&lt;代替了<),Google Assistant无法识别这种格式的SSML,导致它无法正确解析你的响应,最终抛出MalformedResponse错误。

具体解决方案

1. 使用未转义的SSML标签

直接在代码中写原始的SSML标签,不需要做HTML转义(比如直接写<break time="500ms"/>,而不是&lt;break time="500ms"/&gt;)。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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:11:27