Node.js Google操作无法使用MediaResponse解析JSON

Node.js Google操作无法使用MediaResponse解析JSON,node.js,actions-on-google,Node.js,Actions On Google,我正试图返回一个MediaResponse对象,一个包含google Node SDK v2上操作的MediaObject数组,根据 在我的手机上,我刚刚收到一个通用的“现在不响应”错误,控制台中没有显示任何特定的信息,但是在模拟器上运行时,我看到了这个错误: UnparseableJsonResponse API Version 2: Failed to parse JSON response string with 'INVALID_ARGUMENT' error: "(expected_i

我正试图返回一个
MediaResponse
对象,一个包含google Node SDK v2上操作的MediaObject数组,根据

在我的手机上,我刚刚收到一个通用的“现在不响应”错误,控制台中没有显示任何特定的信息,但是在模拟器上运行时,我看到了这个错误:

UnparseableJsonResponse API Version 2:
Failed to parse JSON response string with 'INVALID_ARGUMENT' error: "(expected_inputs[0].input_prompt.rich_initial_prompt.items[1].media_response.media_objects[0]) media_objects: Cannot find field.". 
下面是我试图运行的代码:

return conv.ask('<speak>some text</speak>')
    .add(new MediaResponse({
        objects: [
            new MediaObject({
                url: '{url}',
                name: '{title}'
            })
        ],
        type: 'AUDIO'
    })
)
返回conv.ask('some text')
.add(新媒体响应)({
对象:[
新媒体对象({
url:“{url}”,
名称:“{title}”
})
],
键入:“音频”
})
)
如果我只发送
MediaObject
,而不将其包装在MediaResponse中,它就可以工作,但我希望能够在一个响应中传递多个MediaObject。

如下图所示:

媒体响应支持单个媒体对象

因此,在开发操作时,不能使用多种媒体响应。考虑到用户没有屏幕,他们如何知道返回了多少媒体响应,或者如何选择播放哪一个,这是有意义的

如果要播放多个声音或层声音效果,可以尝试使用SSML。显然,您会有一个时间和大小限制(最长持续时间为120秒,文件大小限制为5 MB),但在播放选项方面更灵活

Leon Nicholls在AoG平台上使用SSML构建复杂的声音合成

编辑:它不能处理一个媒体对象的原因可能是缺少建议芯片。如合同中所述

如果答复不是最终答复,您的行动必须包括建议筹码

基本上,如果你不打算结束对话,你需要在回复中添加建议芯片

另一个原因可能是协议错误。同样,从文档中:

播放的媒体文件必须指定为HTTPS URL

如果您的mp3文件使用HTTP url,它将无法播放。

如下图所示:

媒体响应支持单个媒体对象

因此,在开发操作时,不能使用多种媒体响应。考虑到用户没有屏幕,他们如何知道返回了多少媒体响应,或者如何选择播放哪一个,这是有意义的

如果要播放多个声音或层声音效果,可以尝试使用SSML。显然,您会有一个时间和大小限制(最长持续时间为120秒,文件大小限制为5 MB),但在播放选项方面更灵活

Leon Nicholls在AoG平台上使用SSML构建复杂的声音合成

编辑:它不能处理一个媒体对象的原因可能是缺少建议芯片。如合同中所述

如果答复不是最终答复,您的行动必须包括建议筹码

基本上,如果你不打算结束对话,你需要在回复中添加建议芯片

另一个原因可能是协议错误。同样,从文档中:

播放的媒体文件必须指定为HTTPS URL


如果您的mp3文件使用HTTP url,它将无法播放。

我不太确定您的代码片段来自何处。文件表明,提供媒体回应的正确方式是:

if (!conv.surface.capabilities.has('actions.capability.MEDIA_RESPONSE_AUDIO')) 
{
  conv.ask('Sorry, this device does not support audio playback.');
  return;
}

conv.ask(new MediaObject({
  name: 'Jazz in Paris',
  url: 'https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3',
  description: 'A funky Jazz tune',
  icon: new Image({
    url: 'https://storage.googleapis.com/automotive-media/album_art.jpg',
    alt: 'Album cover of an ccean view',
  }),
}));

如前所述,在任何给定时间只能返回一个媒体对象。您不能提供大于1的任何大小的对象数组。

我不太确定您的代码片段来自何处。文件表明,提供媒体回应的正确方式是:

if (!conv.surface.capabilities.has('actions.capability.MEDIA_RESPONSE_AUDIO')) 
{
  conv.ask('Sorry, this device does not support audio playback.');
  return;
}

conv.ask(new MediaObject({
  name: 'Jazz in Paris',
  url: 'https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3',
  description: 'A funky Jazz tune',
  icon: new Image({
    url: 'https://storage.googleapis.com/automotive-media/album_art.jpg',
    alt: 'Album cover of an ccean view',
  }),
}));

如前所述,在任何给定时间只能返回一个媒体对象。您不能提供任何大于1的对象数组。

有趣-似乎意味着多个(“媒体对象列表”)。无论哪种方式,即使阵列中只有一个MediaResponse对象(如代码片段),它也不会播放。我的目的是让多个对象一个接一个地播放,就像各种播放列表一样(但不必每次都处理MEDIA_状态)。正如我所解释的,您无法传递多个媒体响应。您的问题意味着它在一个响应中正常工作,您可能需要编辑它。我正在相应地编辑我的回复。如果您只想背靠背播放mp3文件,也许您可以在将它们提供给操作之前合并它们?它可能不是最好的用户体验(封面图片和标题不会改变等),但它们会背靠背播放。有趣的是,似乎意味着多重(“媒体对象列表”)。无论哪种方式,即使阵列中只有一个MediaResponse对象(如代码片段),它也不会播放。我的目的是让多个对象一个接一个地播放,就像各种播放列表一样(但不必每次都处理MEDIA_状态)。正如我所解释的,您无法传递多个媒体响应。您的问题意味着它在一个响应中正常工作,您可能需要编辑它。我正在相应地编辑我的回复。如果您只想背靠背播放mp3文件,也许您可以在将它们提供给操作之前合并它们?它可能不是最好的用户体验(封面图片和标题不会改变等),但它们会背靠背播放。