热词外语版开发说明文档
背景
本工程在 duilite-sdk-android 的本地热词引擎上开发,旨在对外提供热词作为快捷唤醒词场景的版本。当前已支持 11 个语种:
- 中文
- 英语
- 葡萄牙语
- 西班牙语
- 俄语
- 德语
- 日语
- 泰语
- 越南语
- 阿拉伯语
- 印度英语
Demo 体验:
手机浏览器扫码下载:
对接方式
在说明对接方式之前,先了解授权模式,请根据具体的需求,选择对应的授权方式!
非常重要!!!
非常重要!!!
非常重要!!!
授权模式
目前热词提供 3 种授权模式(初始化流程不同):
- 扫码授权模式(推荐)
- 如未授权过的设备,进入apk后,先二维码授权界面,等客户扫码授权/输入授权码,授权成功之后再进入主界面。
- 如已授权过的设备,进入apk后,直接进入主界面。
- 如已授权过的设备,但被恢复出厂设置/清空存储,进入apk后,如有网络,先会后台去查询是否曾经授权成功,如是,则直接进入主界面;如否,则进入二维码界面。
apiKey授权模式
- api联网授权模式,联网即在DUI后台登记信息,给予授权,授权设备信息可在DUI后台查询。
预分配授权模式
- 初始化的时候,读取设备上的特定内置license,再进行授权。(内置license请联系思必驰商务经理获取)
客户对接有 2 种方式:
- apk方式
- sdk 方式
apk 方式
客户提供对接接口,思必驰开发 apk,客户再 集成 apk。其中客户需提供的相关信息有:
- 提供 deviceId 获取方式,刷机不会变的唯一标示
- 约定授权方式:扫描授权、api授权、取预分配授权
- 如果是预分配授权模式,约定 licenceId获取方式:wifi 名称或分销商名(设备有区分分销商方式)等等
- 希望能提供一个恢复出厂不会被格式化的路径(授权文件保存的路径),如果没有就用我们默认的。但可能刷机或者恢复出厂后,授权文件会丢失,必须连网之后才能重新激活。
- 提供每个热词指令对应动作对接协议
- 约定来电录音机关闭录音机方式:电话时需要约定关闭热词引擎,挂断重启引擎的协议
- 约定开机启动方式
- 约定倒车的对接方式:倒车时需要约定关闭热词引擎,结束倒车重启引擎的协议
- adb 可调试的机器
输出内容:
- hotwords-xxx.apk
sdk 方式
思必驰输出 sdk ,客户自己对接,我们提供技术支持:
- 根据客户具体需求建议授权方式
- 根据设备是否支持回路,建议是否开启 AEC
- 公版源码开源
- 需要替换定制化的资源:(可以搜索 //todo 定位到)
- 在build.gradle 替换签名密钥
- 在App(Application)替换CrashReport.initCrashReport 的id
- 替换相关的productId、apiKey、productKey、productSecret
- 在build.gradle 选择对应的授权方式
- 在@dest\res\asr\资源拷贝替换到 @dest\sample\app\src\main\assets\ 路径下
- 在@dest\libs\里面的资源拷贝替换到 \@dest\sample\app\libs\ 路径下
输出内容:
- sample源码
- libs:最新版的 sdk-xxx.jar
- res下最新的语种资源
- README.md:本开发说明文档
开源代码
下载地址:http://aispeech-lyra.oss-cn-hangzhou.aliyuncs.com/hotwords_hand/hotwords-Demo-20201012-153021.zip
源码结构
代码结构主要分为 4 部分:
- 配置文件
- 动作执行
- 热词识别
- UI展示
配置文件
以上代码都是结合配置文件来使用,具体配置文件位于 sample/app/src/main/assets/conf。英文 en.json 配置示例:
{
"vad": {
"res": "vad_aicar_v0.16.bin",
"enable": true
},
"audio": {
"srcPath": "/sdcard/lyra/audio_en",
"backupPath": "/sdcard/lyra/audio_en_backup",
"asrAudioPath": "/sdcard/lyra/audio_en_asr",
"customFeed": false,
"feedSize": 6400,
"feedIntervalTime": 100
},
"res": "fsmn_comm2020_wrdpiece_dymc_201223.bin",
"thresh": 0.54,
"words": [
{
"refer": "打开导航",
"command": "TURN ON NAVIGATION",
"commandTips": "turn on navigation",
"action": "action.navi.TurnOnNavigation",
"thresh": 0.50
},
{
"refer": "关闭导航",
"command": "TURN OFF NAVIGATION",
"commandTips": "turn off navigation",
"action": "action.navi.TurnOffNavigation",
"thresh": 0.52
}
]
}
vad
res: vad 资源
enable: 是否开启 vad,正常录音模式下,必须开启检测人声
audio
srcPath:feed 音频模式,原始音频目录。结合 customFeed 使用
backupPath:保存送 vad 和送 asr 的音频目录。默认关闭
asrAudioPath:保存 asr 过了置信度之后的音频目录。依赖于必须同时设置 backupPath,默认关闭
customFeed:是否开启 feed 音频到热词引擎,默认关闭
feedIntervalTime:每次 feed 的音频间隔
res 当前语种的识别资源,必须和语种对应上。当前 app 会优先寻找 /sdcard/lyra/res下的资源,如果没有找到,则会去 assets目录寻找
thresh 当前语种设置的全局统一阈值,当热词引擎 ASR.CALLBACK 中的置信度 conf > thresh 时,判定为有效的识别。
此阈值为当前演示版测试参考,具体项目可能需要结合实际效果可做微调。
需要说明的是:阈值过高,识别率降低;阈值过低,误识别率会增加。故该字段是热词识别效果的非常重要的关键指标
words
- command:注册到热词引擎的指令词,请特别注意事项:
- 英语、日语部分指令需要空格分词
- 英语、日语部分指令需要空格分词
- 英语、日语部分指令需要空格分词
- commandTips: 展示在 UI 界面的指令词,根据具体 ui 设计需求,有些要求小写,有些要求首字母大写,故特意增加此字段
- action:具体执行动作的映射,可通过此字符串反射到对应的动作实现执行类
- thresh:对单个词设置指定阈值,如果设置该字段,会优先于上面的统一阈值
- refer:中文的参考指令词(一般很少使用)
动作执行
代码位于 com.aispeech.hotwords.action 报下,通过反射实例化具体执行类,根据指令类型,分为 4 类:
- 系统控制
- 多媒体控制
- 导航控制
- 车身控制
实现示例:
public class TurnOnNavigation implements IAction {
@Override
public void execute() {
LogUtils.d("execute TurnOnNavigation");
// 默认打开高德地图
AppUtils.launchApp(PKG_NAVI_AMAP);
}
}
具体的指令请参考对应的需求表,客户可参考此模块实现:
- 必须在热词指令 action 对应的类,实现具体的执行动作
- 必须在热词指令 action 对应的类,实现具体的执行动作
- 必须在热词指令 action 对应的类,实现具体的执行动作
3. 热词识别
代码位于 com.aispeech.hotwords.speech 包下:
LiteService,主要包含初始化授权,以及 与 UI 消息交互
**进阶功能:
Hotwords,热词引擎封装,通过解析配置文件形式,注册指令到热词引擎,引擎回调识别结果。不同语种需要加载不同的识别资源,资源路径 @dest\res\asr\
- ebnfr.dymc.char.v02.bin,中文
- fsmn_comm2020_wrdpiece_dymc_201223.bin,英语
- ebnfr_ru_v06.bin,俄语
- ebnfr_pt_v6.bin,葡萄牙语
- ebnfr_es_v06.bin,西班牙语
- ebnfr_de_v4.bin,德语
- ebnfr_jp_v06.bin,日语
- eebnfr_th_v04.bin,泰语
- ebnfr_vn_v3.bin,越南语
- ebnfr_ar_v3.bin,阿拉伯语
- ebnfr_indian_03.bin,印度英语
- aitts_sent_dict_local.db,tts 相关资源
- local_front.bin,tts 相关资源
- zhilingf_common_back_ce_local.v2.1.0.bin,tts 音色资源
SpeechController,在配置文件中,不同语言的热词指令定义统一的 action,通过反射映射到具体的执行类,如:
action.navi.TurnOnNavigation
- LocalTTS,英文离线 tts 播报,目前效果还在优化中,不建议使用。
- FeedAudioHelper,测试送音频的工具类,默认线上版本应该录音模式,一般用不到此工具。
4. UI 展示
代码位于 com.aispeech.hotwords.ui 包下,主要功能:
有三个Activity:
- AuthorizeActivity
- InfoActivity
- MainActivity
AuthorizeActivity: 用于扫码授权(可选,如需扫码授权,在build.gradle里面设置:buildConfigField 'String', 'authorizationType', '"QRAuth"'即可)
InfoActivity: 依附于AuthorizeActivity,进行扫描授权的功能介绍和切换语言
MainActivity:语音主页面,有三个fragment
- 语音设置
- 唤醒开关设置
- 语言切换
- 语音指令:展示当前注册的热词指令
- 关于:版本介绍
- 语音设置
其他补充
保存资源有 2 种方式:
- 1.1 使用内部资源,优点:方便快捷集成开发。相关的资源(vad/、 asr/ 、aec/)都放到了sample/app/assets 下,随着sample直接使用即可。
1.2 使用外部资源,优点:方便快速调试。支持外部 sdcard 存放资源,把 conf、res 文件夹放到 /sdcard/lyra/ 下:
127|rk3399:/sdcard/lyra $ ls audio conf res tts
如果需要调整阈值,或者热词指令,可以修改 conf 对应的语种的配置文件。重启进程即可
数据统计,每次开关唤醒开关,都会保存当前识别记录到 /sdcard/lyra/xxx.json。具体逻辑可参考:FeedAudioHelper
常见问题
- 授权失败
- 根据失败授权码,可查询对应失败的原因:https://www.duiopen.com/docs/ct_errorcode_Android
- 来电时,如何关闭热词录音机?
- 与蓝牙电话约定如广播或其他协议,热词 app 收到消息后,停止/开启引擎。
- 倒车时,如何关闭热词录音机?
- 与倒车事件约定如广播或其他协议,热词 app 收到消息后,停止/开启引擎。
- 断开ACC时,如何彻底关闭热词录音机?
- 与ACC事件约定如广播或其他协议,热词 app 收到消息后,停止(stop/destroy)引擎。
- 其他问题请参阅:http://car.aispeech.com/duilite/docs/duilite/qi-ta/chang-jian-wen-ti.html