java - Google 操作不会发送 actions.intent.MEDIA_STATUS
问题描述
这是我关于 Stack Overflow 的第一个问题,所以如果我搞砸了,请告诉我!
我正在构建一个能够播放播客的谷歌操作,并且我想在播客结束时播放结束的音频剪辑。据我从文档(https://developers.google.com/actions/assistant/responses#media_responses)中得知,在音频播放结束时,设备应发送包含 actions.intent.MEDIA_STATUS 意图的请求. 然后我想用结束音频回应这个,但我从来没有收到请求。
至于我到目前为止设置的内容:我使用 dialogflow 来设置对话,然后将请求发送到 AWS Lambda,在那里我设置了一些 java 代码来发回播客 url。我让媒体响应的那部分工作正常——它可以播放、暂停、向前跳过和返回。到目前为止,为了获得下一个音轨,我已经完成了以下操作:
- 在 Dialogflow 中创建一个意图(我称之为 AudioCompleteIntent)
- 将 actions_intent_MEDIA_STATUS 添加到意图的“事件”部分(如在对话流中处理音频播放完成回调(媒体响应)中所示)
- 添加一个虚拟训练短语。不确定这是否有必要,但这是我可以让 AudioCompleteIntent 与“操作”部分中的谷歌操作集成的唯一方法。否则它不会出现。我认为在“操作”部分中包含意图对于设备发送请求是必要的,但也许它仅适用于用户发起的意图。
- 在履行过程中,我选择了“为此意图启用 webhook 调用”,以便我可以将请求发送到 AWS Lambda 函数。Lambda 函数已将所有请求记录到日志中
我在 Dialogflow 中附上了我的意图的屏幕截图。训练短语仍然不总是与动作同步,但初始化对话的意图似乎工作,无论对话流意图是否显示在谷歌操作控制台中AudioCompleteIntent 截图
问题是,我没有看到来自设备的任何带有 actions.intent.MEDIA_STATUS 意图的请求。在播客完成自行播放后(而不是在用户停止播放时),我希望设备向 Dialogflow 发送一个 actions.intent.MEDIA_STATUS 意图,然后 dialogflow 将通过将 AudioCompleteIntent 发送到 aws lambda 函数来处理这个问题。我在对话流“历史”部分和 aws 日志中都没有看到我的 AudioCompleteIntent 请求或任何类型的 actions.intent.MEDIA_STATUS 意图。两个 dialogflow/AWS 都显示了开始播客的对话记录——播客结束时什么也没有。
我一直在用我的像素(2016 年的像素 1)手机的谷歌助手进行测试。显然,根据Google 行动 MediaResponse 无法在某些设备上运行,存在一些设备无法发送请求的错误,但这个问题已经存在将近一年了,所以我认为这个问题已经得到解决,我的问题搞砸了结尾。我没有足够的声誉来评论该帖子并询问解决方案,所以我想我会询问我的设置
解决方案
我最终让它工作。我缺少的主要部分是我需要将“expectUserResponse”设置为 True 并提供建议筹码。由于缺少建议筹码,当前文档中的示例(截至 2019 年 2 月)将无法播放。我"expectUserResponse": true
从示例中删除并让它播放,但它没有发送actions.intent.MEDIA_STATUS
响应。重新引入"expectUserResponse": true
和添加建议芯片确实起到了作用
我无法包含我发送的实际响应,但这里是文档中代码示例的编辑版本。具体来说,我在https://developers.google.com/actions/assistant/responses#media_responses提供的 DIALOGFLOW JSON 选项卡的“示例代码”部分下的示例中添加了建议芯片:
{
"payload": {
"google": {
"expectUserResponse": true,
"richResponse": {
"items": [
{
"mediaResponse": {
"mediaType": "AUDIO",
"mediaObjects": [
{
"contentUrl": "https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3",
"description": "A funky Jazz tune",
"icon": {
"url": "https://storage.googleapis.com/automotive-media/album_art.jpg",
"accessibilityText": "Ocean view"
},
"name": "Jazz in Paris"
}
]
}
}
],
"suggestions": [
{
"title": "pause"
},
{
"title": "start over"
}
]
},
"userStorage": "{\"data\":{}}"
}
},
"outputContexts": [
{
"name": "/contexts/_actions_on_google",
"lifespanCount": 99,
"parameters": {
"data": "{}"
}
}
]
}
感谢https://github.com/actions-on-google/actions-on-google-nodejs/issues/247#issuecomment-439617878中的 BoneGoat 提出在 node.js 端寻找用户响应的重要性东西的。希望这个问题能帮助其他 Java 开发人员!
推荐阅读
- amazon-web-services - docker 中的相同应用程序组成配置映射 AWS EC2 实例上的不同端口
- angular - 如何存储 OTP 控制器输入的变量?
- clearcase - 如何获取组件的基础基线?
- c# - 为什么我们必须等待一段时间才能从 UserPrincipal.GetAuthorizationGroups 方法获取最新的组信息?
- php - 我如何计算laravel中特定id的总金额?
- reactjs - 如何删除视频上的状态栏和重叠图标?
- ruby-on-rails - 无法正确呈现 rails 关联中的编辑和删除按钮
- javascript - 使用基于 PC 的外部数据库在 Android 上测试 Cordova 应用程序
- go - Golang os.使用嵌套目录创建路径
- azure - 架构问题 - Azure 服务总线和消息顺序保证