仅在 SSML 中播放音频转化回复?

Only play audio conv reply in SSML?

我想知道是否可以不在我的 SSML 中包含文本,因为我的音频文件说 'Are you ready to play?',我不需要 google 助手本身的任何语音。

app.intent('Default Welcome Intent',(conv) =>{

  const reply = `<speak>
  <audio src="intro.mp3"></audio>
   </speak>`;
  conv.ask(reply);

});

上面的代码会产生错误,因为我没有任何文本输入。

为此找到了一个 hacky 解决方法,通过添加一个非常短的字符串,然后将它放在一个带有静音音量的韵律标签中:

app.intent('Default Welcome Intent',(conv) =>{
  const reply = `<speak>
  <audio src="intro.mp3"></audio>
  <prosody volume ="silent">a</prosody> </speak>`;
  conv.ask(reply);

});

这会播放音频但不会说出 'a' 文字。

您可能遇到的错误类似于

expected_inputs[0].input_prompt.rich_initial_prompt.items[0].simple_response: 'display_text' must be set or 'ssml' must have a valid display rendering.

正如它所指出的,在某些情况下,助手会在带有显示屏的设备(例如您的 phone)上运行,并且它应该显示与音频播放的内容基本相同的消息。

您有几个适合这些情况的选项。

首先,您可以在 <audio> 标签内提供可选文本,这些文本将显示但不会读出(除非由于某种原因无法加载音频文件)。

<speak>
  <audio src="intro.mp3">Are you ready to play?</audio>
</speak>

或者,您可以提供单独的字符串来表示您所说内容的 SSML 版本和纯文本版本。

const ssml = `<speak><audio src="intro.mp3"></audio></speak>`;
const text = "Are you ready to play?";
conv.ask( new SimpleResponse({
  speech: ssml,
  text: text
}) );

另一种欺骗方式,尝试使用空白 space 来避免出现 No Response 错误(...现在没有响应)

conv.ask(new SimpleResponse(" "))
const reply = `<speak>
  <audio src="intro.mp3"></audio>
   </speak>`;
conv.ask(reply);