-
DuerOS开放平台
-
技能开放平台
-
自定义技能
- 自定义技能简介
- 自定义技能创建
-
有屏技能
-
技能交互模型
-
自定义技能协议
- 处理DuerOS发送的请求
-
技能部署
-
技能开发样例
- 账户关联
-
技能测试
-
技能发布
-
技能付费
-
个性化服务
-
内容播报技能
-
小技能
-
平台能力扩展
-
SDK
-
预览版功能
- 全双工(Preview)
-
APP技能(Preview)
-
-
智能家居开放平台
- 品牌使用规范
-
开发者服务条款
版本号 | 变更时间 | 变更描述 |
---|---|---|
1.1.0 | 2019-07-31 | PlayCommandIssued、PauseCommandIssued、NextCommandIssued、PreviousCommandIssued事件增加dialogRequestId字段 |
如果设备有播放、暂停、上一首、下一首等固定按键(实体物理按键,或者是模拟实体物理按键的虚拟按键),应该实现本接口,在用户按下对应按键之后,上报对应事件到服务端,通知服务端用户的按键行为。
注意,在有屏设备上,在播放音乐的界面中播放、暂停等按键并非为设备固定按键,不属于本端能力范畴。
当用户按了设备端上的播放按钮时,上报PlayCommandIssued事件,并为这次按钮操作创建一个唯一的dialogRequestId。 为了提升物理按键反馈的即时性,建议设备端在按键后立即播放设备缓存的流媒体资源,云端收到PlayCommandIssued事件后会给设备端下发Play指令,设备端对比Play指令中dialogRequestId与当前活跃对话的dialogRequestId是否一致,若dialogRequestId相同,且Play指令中stream url与设备端缓存的流媒体资源地址一致,则不执行Play指令。否则设备遵循端上约定逻辑处理新的Play指令。 说明一下这种设备的参考实现的逻辑: 1.为什么设备端不等收到云端Play指令后再进行播放? 这种设备端的实现有事件上报和指令下行的延迟,设备播放状态变更不能与按键保持实时的同步,体验较差。 2.为什么不能直接不执行Play指令,只播放设备端本地缓存的流媒体资源? 原因是设备端缓存的流媒体地址可能会失效,如果缓存地址失效,需要从新下发的Play指令里获取最新的有效的stream url。 3.为什么要判断dialogRequestId一致性的条件? dialogRequestId是用来判断设备端收到的Play指令与用户按键行为的关联性的。若dialogRequestId一致说明当前设备端收到的Play指令是由用户按了播放按钮触发的,由于此时端上已经处于有效的播放状态,可不执行云端的Play指令,避免端上播放状态的突然抖动。 此方案既考虑了用户使用物理按键后反馈的即时性,又兼容了流媒体地址的有效性,推荐设备端参考实现。
"clientContext": [
{{ai.dueros.device_interface.alerts.AlertsState}},
{{ai.dueros.device_interface.audio_player.PlaybackState}},
{{ai.dueros.device_interface.speaker_controller.VolumeState}},
{{ai.dueros.device_interface.voice_output.SpeechState}}
],
"event": {
"header": {
"namespace": "ai.dueros.device_interface.playback_controller",
"name": "PlayCommandIssued",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
}
}
本事件需要设备端上报所有端上状态。
当用户按了设备端上的暂停按钮时,上报PauseCommandIssued事件。 为了提升物理按键反馈的即时性,建议设备端在按键后立即停止音频播放。云端收到PauseCommandIssued事件后会给设备端下发Stop指令,若此时设备端音频播放器已经处在STOPPED状态,则不再执行Stop指令。
"clientContext": [
{{ai.dueros.device_interface.alerts.AlertsState}},
{{ai.dueros.device_interface.audio_player.PlaybackState}},
{{ai.dueros.device_interface.speaker_controller.VolumeState}},
{{ai.dueros.device_interface.voice_output.SpeechState}}
],
"event": {
"header": {
"namespace": "ai.dueros.device_interface.playback_controller",
"name": "PauseCommandIssued",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
}
}
本事件需要设备端上报所有端上状态。
当用户按了设备端上的下一首按钮时,上报NextCommandIssued事件。
"clientContext": [
{{ai.dueros.device_interface.alerts.AlertsState}},
{{ai.dueros.device_interface.audio_player.PlaybackState}},
{{ai.dueros.device_interface.speaker_controller.VolumeState}},
{{ai.dueros.device_interface.voice_output.SpeechState}}
],
"event": {
"header": {
"namespace": "ai.dueros.device_interface.playback_controller",
"name": "NextCommandIssued",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
}
}
本事件需要设备端上报所有端上状态。
当用户按了设备端上的上一首按钮时,上报PreviousCommandIssued事件。
"clientContext": [
{{ai.dueros.device_interface.alerts.AlertsState}},
{{ai.dueros.device_interface.audio_player.PlaybackState}},
{{ai.dueros.device_interface.speaker_controller.VolumeState}},
{{ai.dueros.device_interface.voice_output.SpeechState}}
],
"event": {
"header": {
"namespace": "ai.dueros.device_interface.playback_controller",
"name": "PreviousCommandIssued",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
}
}
本事件需要设备端上报所有端上状态。