APP 技能的开发
<p>[TOC]</p>
<p>APP 技能开发包括两部分: bot 服务的开发和 APP 客户端的开发。</p>
<h3>1 Bot 服务的开发</h3>
<ol>
<li>APP 技能的 bot 服务开发与 DBP 上其他自定义技能的开发类似,尤其与交互模型的建立,关于意图、槽位、词典、常用表达等参考《技能交互模型》。</li>
<li>目前,多数 APP 技能都采用了 DBP 平台的代理服务 AVC(App Voice Control),这样无需独立部署服务器即可使用语音交互的能力。简单地说, 设计并填写完交互模型,就可以认为是开发完成了。AVC 将语音交互的结果以结构化数据返回给 APP 客户端,由客户端完成对应的操作。</li>
<li>对于复杂交互的 APP 技能而言,同样可以部署自己的物理 bot,接入流程联系<code>dueros-bd@baidu.com</code></li>
</ol>
<h3>2 APP 客户端的开发</h3>
<p>针对语音交互的复杂程度,APP 客户端的开发可以分为 4 个等级:</p>
<ul>
<li>L1: 只支持打开/退出的语音指令</li>
<li>L2: 支持有限的语音指令</li>
<li>L3: 支持多种意图\槽位\词典\常用表达的语音指令</li>
<li>L4: 支持用户话术的内容直达以及使用自己的物理 bot 处理更复杂的语音指令</li>
</ul>
<p>从客户端的维度看,可以分为集成 Bot App SDK 的 APP 技能和未集成 Bot APP SDK 的 APP 技能。L1 等级的 APP 技能没有集成了 Bot APP SDK,L2/L3/L4 等级的 APP 技能集成了 Bot APP SDK。</p>
<h4>2.1 L1 APP 技能的开发</h4>
<p>在 DBP 平台的控制台,依次选择 【创建技能】->【自定义技能】->【Android App 技能】, 填写技能名称和 APP 包名,待开发者 App 自身完成开发后,即可进入 L1 APP 技能的调试阶段。
[<code>详细见:APP技能创建文档</code>](<a href="https://www.showdoc.com.cn/2104324603939229/9459790437553728">https://www.showdoc.com.cn/2104324603939229/9459790437553728</a> "<code>详细见:APP技能创建文档</code>")</p>
<h4>2.2 L2 APP 技能的开发</h4>
<p>L2 技能使用了本地自定义交互模型,意思就是用户语音指令和意图匹配关系,定义在本地代码中。</p>
<ul>
<li>
<p>参考示例代码 <a href="https://github.com/dueros/AndroidBotSdkDemo">https://github.com/dueros/AndroidBotSdkDemo</a> 将 Bot App SDK 集成到开发者的 APP 技能中。</p>
</li>
<li>
<p>开发者只需要参考代码组装 UIContextPayload 对象,就可以完成本地自定义交互模型的构建,示例代码如下:</p>
<pre><code>// 1.创建UIContextPayload对象开始组装
UiContextPayload payload = new UiContextPayload();
// 2.定义用户语音意图集合(尽可能丰富的收集用户表达,常用同音异字表达都加上,比如“登录”&amp;“登陆”)
String[] loginWords = {&quot;开始&quot;,&quot;点击开始&quot;,&quot;开始游戏&quot;,&quot;启动游戏&quot;,&quot;进行游戏&quot;};
// 3.可以定义支持的话术
payload.addHyperUtterance(“sdkdemo://startGame”, Arrays.asList(loginWords), null, null);
// 重复步骤2.3 可以添加多个交互组件。比如开始,退出,登录,注册......
BotSdk.getInstance().updateUiContext(payload);</code></pre>
</li>
<li>用户语音表达,命中自定义交互组件后,云端匹配匹配成功,并封装 url 为 ClickLink 指令下发到设备端。设备端收到 ClickLink 指令,通过回调方法 onClickLink,把匹配结果分发给 App,示例代码如下:</li>
</ul>
<pre><code class="language-java">/**
* 云端返回的UIContext匹配结果
* @param url 自定义交互描述中的url
* @param paramMap 对于系统内建类型,参数列表。参数就是从query中通过分词取得的关键词。这个参数配合type,params字段使用
*/
@Override
public void onClickLink(String url, HashMap&lt;String, String&gt; paramMap) {
if (&quot;sdkdemo://startGame&quot;.equals(url)) {
//TODO 执行开始游戏逻辑,比如是startGameBtn.performClick()
}
}</code></pre>
<p>待开发者 app 自身完成开发后,即可进入 L2 APP 技能的调试阶段。</p>
<h4>2.3 L3 APP 技能的开发</h4>
<p>L3 技能使用了 DBP 平台的自定义交互模型,关于如何构建交互模型,可以参考《技能交互模型》。</p>
<ul>
<li>
<p>参考示例代码 <a href="https://github.com/dueros/AndroidBotSdkDemo">https://github.com/dueros/AndroidBotSdkDemo</a> 将 Bot client SDK 集成到开发者的 APP 技能中。</p>
</li>
<li>在客户端 APP 中, 会通过 Bot APP SDK 的 回调方法 handleIntent 在 App 中处理意图内容,示例代码如下:</li>
</ul>
<pre><code class="language-java">/***
* 云端意图返回结果
* @param intent 意图内容,参考{@link BotIntent} 包含意图名称和槽位参数结构如下
* {@link BotIntent#name} 意图名称,对应于云端创建意图的 意图标识名
* {@link BotIntent#slots} 槽位列表 对应于云端创建意图的 槽位信息,数量(0~n)
* 槽位信息结构如下:
* {@link com.baidu.duer.botsdk.BotIntent.Slot#name} 槽位名称
* {@link com.baidu.duer.botsdk.BotIntent.Slot#value} 槽位值
* @param customData 自定义数据,暂时不用
*/
@Override
public void handleIntent(BotIntent intent, String customData) {
String intentResult = &quot;\n指令名称:%s\n槽位信息:%s&quot;;
Log.i(&quot;HandleIntentTAG&quot;, &quot;intent result:&quot; + intentResult);
if (&quot;queryWeather&quot;.equals(intent.name)) {
String loactionOfWeather;
if (intent.slots != null) {
for (BotIntent.Slot slot : intent.slots) {
// 遍历槽位列表,找到需要的槽位值
if (&quot;sys.city&quot;.equals(slot.name)) {
loactionOfWeather = slot.value;
}
}
}
// TODO 使用localtionOfWeather 参数查询天气
}
}
</code></pre>
<ul>
<li>待开发者 App 自身完成开发后,即可进入 L3 APP 技能的调试阶段。</li>
</ul>
<h4>2.4 L4 APP 技能的开发</h4>
<p>L4 的 APP 技能与自定义技能类似,可以挂接开发者自己的 bot 服务,如下所示:
<img src="http://dumi-dueros-bj-tob.cdn.bcebos.com/amis/2022-10/1666244242374/apk_L4.png" alt="" /></p>
<ul>
<li>L4 的 APP 技能使用开发者自己的 bot 服务,通过 DuerOS 开放平台与 App 的客户端进行通信,可以充分利用 DuerOS 的各种能力,为用户提供更好的用户体验。</li>
</ul>