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文件,也许您可以在将它们提供给操作之前合并它们?它可能不是最好的用户体验(封面图片和标题不会改变等),但它们会背靠背播放。