我们经常谈到的移动互联网是与智能手机密不可分的,iPhone 这样的智能手机改变了人们使用手机的交互方式——由功能机(feature phone)的按键式交互变成了触控式交互。对于开发者而言, 意味着嵌入式应用框架的转变,详情可以参考《探索嵌入式应用框架(EAF)》。
Android 和 iOS 成为了移动互联网上的两大主流开发环境,大多数的开发者和企业都有着自己的Android App,那么,如何让这些安卓App 成为DuerOS 上支持语音交互的多模态技能呢?
DBP 上的 App 技能
App技能同样是一种DBP的自定义技能,与其他自定义技能的区别在于需要开发者开发或调整自己的安卓App。DBP 平台上 APP技能的推出使得Android App 可以很快地成为DuerOS 设备上的技能,使安卓系统的App生态能够与DuerOS的技能生态水乳交融,为用户带来更多的价值。
正像老码农在以往技术大会上所讲的那样,APP技能的接入和DBP自定义技能的开发类似,同样遵循六个步骤:
-
开发者认证
-
技能创建
-
技能开发
-
技能调试
-
技能审核
-
技能上线
目前,DBP 平台推出的App技能作为Preview feature 开放给广大企业开发者,遵循预览版的相关审核和流程规范。
1. 开发者认证
开发者需要在DBP平台上传身份证、个人邮箱、手机号等信息,通过审核后成为认证开发者。目前DBP 平台采用了百度AI的证照自动识别技术,可以实现分钟级的身份认证,使开发者能够迅速成为DuerOS 的认证开发者。当然,非认证开发者同样可以创建并调试自定义技能,但只有认证开发者才能完成技能的上线。
对应企业开发者而言,还要上传企业的营业执照扫描件,通过审核后成为认证开发者。
需要注意的是,当前,DBP平台APP 技能的开发只对认证的企业开发者开放。
2. APP技能创建
APP 技能目前作为Preview feature 开放,开发者在创建APP 技能的时候首先要阅读并确认《DBP应用开发者协议》。
然后,填写技能名称等相关信息,提交后,等候Preivew 的审核。
在Preview 审核通过后,即表示APP 技能创建完成,可以对技能的意图/槽位/词典等进行配置操作了,详情参见《感知自然语言理解(NLU)》。
3. APP技能的开发
APP 技能开发包括两部分:技能(bot) 服务的开发和 APP 客户端的开发。
3.1 技能服务的开发
APP 技能的bot 服务开发与DBP 上其他自定义技能的开发类似,尤其与交互模型的建立,关于意图、槽位、词典、常用表达等参考《技能交互模型》。
目前,多数APP 技能都采用了DBP 平台的代理服务AVC(App Voice Control),这样无需独立部署服务器即可使用语音交互的能力。简单地说, 设计并填写完交互模型,就可以认为是开发完成了。AVC 将语音交互的结果以结构化数据返回给APP 客户端,由客户端完成对应的操作。
对于复杂交互的APP 技能而言,同样可以部署自己的物理bot,在自己的技能服务中实现更复杂的逻辑。
3.2 APP 客户端的开发
针对语音交互的复杂程度,APP 客户端的开发可以分为4个等级:
-
L1: 只支持打开/退出的语音指令
-
L2: 支持有限的语音指令
-
L3: 支持多种意图\槽位\词典\常用表达的语音指令
-
L4: 支持用户话术的内容直达以及使用自己的物理bot处理更复杂的语音指令
从客户端的维度看,可以分为集成Bot App SDK 的APP 技能和未集成Bot App SDK 的APP 技能。L1等级的APP技能没有集成Bot APP SDK,L2/L3/L3等级的APP技能集成了Bot APP SDK。
3.2.1 L1 APP 技能的开发
在DBP 平台的控制台,依次选择 【创建技能】->【自定义技能】->【Android App 技能】, 填写技能名称和APP 包名,如图所示:
一步完成,待开发者App自身完成开发后,即可进入L1 APP 技能的调试阶段。
3.2.2 L2 APP 技能的开发
L2 技能使用了本地自定义交互模型,意思就是用户语音指令和意图匹配关系,定义在本地代码中。
参考示例代码(https://github.com/dueros/AndroidBotSdkDemo)将Bot App SDK 集成到开发者的APP 技能中。
开发者只需要参考代码组装UIContextPayload对象,就可以完成本地自定义交互模型的构建,示例代码如下:
// 1.创建UIContextPayload对象开始组装
UiContextPayload payload = new UiContextPayload();
// 2.定义用户语音意图集合(尽可能丰富的收集用户表达,常用同音异字表达都加上,比如“登录”&“登陆”)
String[] loginWords = {"开始","点击开始","开始游戏","启动游戏","进行游戏"};
// 3.可以定义支持的话术
payload.addHyperUtterance(“sdkdemo://startGame”, Arrays.asList(loginWords), null, null);
// 重复步骤2.3 可以添加多个交互组件。比如开始,退出,登录,注册......
BotSdk.getInstance().updateUiContext(payload);
用户的语音表达,命中自定义交互组件中定义的具体话术后,云端匹配成功,并封装url为ClickLink指令下发到设备端。设备端收到ClickLink指令,通过回调方法onClickLink,把匹配结果分发给App,示例代码如下:
/**
* 云端返回的UIContext匹配结果
* @param url 自定义交互描述中的url
* @param paramMap 对于系统内建类型,参数列表。参数就是从query中通过分词取得的关键词。这个参数配合type,params字段使用
*/
@Override
public void onClickLink(String url, HashMap paramMap) {
if ("sdkdemo://startGame".equals(url)) {
//TODO 执行开始游戏逻辑,比如是startGameBtn.performClick()
}
}
开发者完成Android App开发后,即可进入L1 APP 技能的调试阶段。
3.2.3 L3 APP 技能的开发
L3技能使用了DBP 平台的自定义交互模型,关于如何构建交互模型,可以参考《技能交互模型》。
参考示例代码(https://github.com/dueros/AndroidBotSdkDemo)将Bot App SDK 集成到开发者的APP 技能中。
在客户端APP 中, 会通过Bot App SDK的 回调方法handleIntent在App中处理意图的内容,示例代码如下:
/***
* 云端意图返回结果
* @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 = "\n指令名称:%s\n槽位信息:%s";
Log.i("HandleIntentTAG", "intent result:" + intentResult);
if ("queryWeather".equals(intent.name)) {
String loactionOfWeather;
if (intent.slots != null) {
for (BotIntent.Slot slot : intent.slots) {
// 遍历槽位列表,找到需要的槽位值
if ("sys.city".equals(slot.name)) {
loactionOfWeather = slot.value;
}
}
}
// TODO 使用localtionOfWeather 参数查询天气
}
}
开发者完成Android App开发后,即可进入L3 APP 技能的调试阶段。
3.2.4 L4 APP 技能的开发
L4 的APP 技能还在内测阶段,需要联系DBP 的产品经理进行完整的接入流程。
4. APP技能调试
目前,APP 技能还处于Preview feature 阶段,因此只能在真机上进行技能调试。
4.1 真机调试开发环境的安装
创建好APP技能后,点击【测试验证】 → 点击【真机测试】→ 点击【新增设备SN】,添加自己的小度设备SN。
开发者在配置好设备SN之后,可以对真机设备说,“小度小度,打开技能开发助手”,在技能的菜单中选择【升级为开发版ROM】,根据语音提示进行后续操作即可。
注意:如果以上操作都完成还是提示申请升级失败,请确认设备上的账号和DBP平台登录的账号是否一致,要确保使用相同的账号。
4.2 真机调试密钥的获取和使用
在开发环境安装成功之后, 需要下载开发环境的密钥本地。
真机调试密钥的使用方法如下:
1)替换到设备本地的 ~/.android 目录中
2)执行命令重启adb:
adb kill-server
adb start-server
4.3 在真机上安装目标应用
在真机的调试环境和调试密钥都安装成功后, 就可以使用 adb 命令安装目标APP了。
4.4 在技能Debug 模式下进行调试
在保持开发者账号和小度设备账号一致的前提下,开启技能调试模式的按钮,对设备说,“开启技能调试”。
在技能调试模式下, 开发者就可以使用语音交互来调试APP 技能了。
5. APP 技能审核
为了确保用户体验,APP 技能需要通过严格审核才能发布上线。
5.1 技能审核的一般规则
APP 技能申请上线的方式与一般的自定义技能类似,具体可以参考《技能发布》。
APP 技能与一般的自定义技能区别在于要明确客户端APP 的版本号(形如a.b.c.d),并上传APP 的客户端包。
5.2 APP技能审核的特殊性
APP 技能的审核遵从DuerOS 技能审核的一般原则,包括技能元数据审核,功能性测试和技能交互信息测试等,具体可以参考《技能审核规范》。
5.3 开发者申请上线审核
APP 技能的审核还包括了客户端的安全检查和性能压测等验证方式。
同时,APP 还涉及权限申请,例如camera、录音、手势等,在审核的时候会分别给予确认。
5.4 开发者对审核结果的解读
开发者在【发布管理】->【版本管理】中可以看到审核的结果,如果没有通过审核的话,可以查看失败的原因。
另外,开发者也可以在【个人中心】->【消息中心】中查看审核的相关信息。
6. APP 技能上线与升级
技能审核通过后,即处于上线状态,全网上线在2个工作日内完成。
6.1 首次上线
APP 技能在首次上线的时候,需要上传客户端的APP包,并明确APP技能的客户端版本(形如a.b.c.d), 并明确技能交互的模型的版本,这对APP技能的后续升级至关重要。
6.2 APP 技能升级
APP 技能升级一般包括3种情况:
-
只升级APP 客户端
-
只升级技能交互模型
-
既升级APP 客户端又升级技能交互模型
6.2.1 只升级APP 客户端
如果只是客户端APP的升级,需要重新上传APP包,更新版本号,即可申请上线审核。
6.2.2 只升级技能交互模型
如果只升级交互模型,无需重新上传APP包,只需要更新交互模型的版本号,即可申请上线审核。
6.2.3 既升级APP 客户端又升级技能交互模型
对于升级APP 客户端又升级技能交互模型的情形,需要对APP客户端的版本号和交互模型的版本号,同时上传更新的APP包,形同初次上线。
小结
综上所述,App 技能的接入与开发流程同样分为6个阶段,开发者认证->技能创建->代码开发->技能调试->技能审核->上线商用。如果开发者的Android App 自身没有什么问题的话(例如,安全问题,内测泄露等等),一般可以在3~5天内完成App技能的上线,进而使开发者的App迅速地使用DuerOS 的多模态交互能力, 在数千万DuerOS 设备上为广大用户带来更丰富的用户体验。