# 端上语音控制能力
我们提供了一种在端上进行注册语音话术来提供基础页面语音交互能力的规范和基础框架,通过更易懂易使用的高级 API,让用户可以快速在组件上赋予更丰富的语音交互能力;
相较于将需要支持的话术 Intent 化,然后 Bot 订阅 Intent 然后执行相应 Action 的云端意图语音识别能力,在 dpl 中采用的端话术识别语音支持具有如下特点:
以组件为单位,不同组件中同样话术后者覆盖前者。最终作为端状态中的同一份注册信息上报给云端;
基于端上注册的内容,存在不同的执行方式
- 注册内容不包含 url, 语音query匹配注册的相应内容时,服务端下发指令到设备端,设备端执行对应的行为(如执行点击(Container)、滚动(List、ScrollView)、翻页(Pager)等)。
- 注册内容包含 url(注:url 需要是以 dueros:// 开头的内部链接地址), 语音query匹配注册的相应内容时,云端会根据此意图转换query请求为打给对应技能的 LinkClicked 事件。
# 通用语音容器 Container
我们提供了 Container 组件作为支持通用语音的容器组件;
# enableVoice
标明了是否开启该容器注册的语音能力
# voiceAction
用来声明,该容器上支持哪些语音交互行为:
- click
- 在节点上模拟用户点击
- select
- 触发该 action 的组件的 onClick 事件
# voiceConfig
对于每一个 voiceAction 都有行为特定的配置:
- name
- 语音话术内容
- index
- 该 action 在列表里处于第几个,从1开始
- url
- 对应的 url 链接地址,添加这个配置可以使语音话术响应不需要经过设备端上的回调,可以加速响应
- utterances
- 单容器组件多话术匹配,精准匹配,云端不会再进行内容识别泛化,与 name、url 属性冲突,不能同时使用
# 样例
- 使用 voiceAction: click, voiceConfig: name,实现当 query 对应 name 话术时,执行点击 onClick 事件,如:
{
"type":"Container",
"componentId":"container-box",
"props": {
"enableVoice": true,
"voiceAction": "click",
"voiceConfig": "click.name: 苹果;"
},
"events": {
"onClick": [{
"type":"SendEvent",
"componentId":"container-box"
}]
}
}
- 使用 voiceAction: select, voiceConfig: index, name,实现当 query 对应 name 话术/第几个时,执行点击 onClick 事件,如:
{
"type":"Container",
"componentId":"container-box",
"props": {
"enableVoice": true,
"voiceAction": "select",
"voiceConfig": "select.name: 苹果;select.index: 1;"
},
"events": {
"onClick": [{
"type":"SendEvent",
"componentId":"container-box"
}]
}
}
- 使用 voiceAction: select, voiceConfig: index, name, url,(注:url 需要是以 dueros:// 开头的内部链接地址)实现当 query 响应云端识别后转换 query 请求为打给对应技能的 LinkClicked 事件,如:
{
"type":"Container",
"componentId":"container-box",
"props": {
"enableVoice": true,
"voiceAction": "select",
"voiceConfig": "select.name: 苹果;select.index: 1;select.url: XXXX"
},
"events": {
"onClick": [{
"type":"SendEvent",
"componentId":"container-box"
}]
}
}
- 使用 voiceAction: select, voiceConfig: utterances,实现执行点击 onClick 事件,如:
{
"type":"Container",
"componentId":"container-box",
"props": {
"enableVoice": true,
"voiceAction": "select",
"voiceConfig": "select.utterances: 苹果,香蕉,芒果;"
},
"events": {
"onClick": [{
"type":"SendEvent",
"componentId":"container-box"
}]
}
}
# 实践
- 更新 hello-dpl.json 为:
{
"type": "DPL",
"version": "2.0",
"duration": 120000,
"mainTemplate": {
"parameters": [
"payload"
],
"items": [
{
"type": "Container",
"props": {
"enableVoice": true,
"voiceAction": "click",
"voiceConfig": "click.name: 测试页面;"
},
"styles": {
"flex": 1,
"background-color": "#222"
},
"events": {
"onClick": [
{
"type": "SetState",
"state": "text",
"value": "Hello DPL!",
"componentId": "show-tap-text"
}, {
"type": "SendEvent",
"delay": 2000
}
]
},
"items": [
{
"type": "Background",
"props": {
"src": "https://duerstatic.cdn.bcebos.com/swan/square/square_bg.webp"
}
},{
"type": "Text",
"componentId": "show-tap-text",
"props": {
"text": "测试页面"
},
"styles": {
"font-size": "28dp",
"color": "#fff"
}
}
]
}
]
}
}
- 重新渲染 DPL 页面,在端上的日志中通过
adb logcat | grep 'hyperUtterances'
可以看到如下内容,则表示对应项的语音控制注册成功:
{
"enableGeneralUtterances": true,
"customData": {
"domain": "vsl"
},
"hyperUtterances": [{
"url": "1",
"type": "button",
"params": {
"name": "测试页面",
"index": "",
"prefix": ""
}
}]
}
- 接下来就可以通过语音控制,效果图如: