热词外语版开发说明文档

背景

本工程在 duilite-sdk-android 的本地热词引擎上开发,旨在对外提供热词作为快捷唤醒词场景的版本。当前已支持 11 个语种:

  • 中文
  • 英语
  • 葡萄牙语
  • 西班牙语
  • 俄语
  • 德语
  • 日语
  • 泰语
  • 越南语
  • 阿拉伯语
  • 印度英语

Demo 体验:

对接方式

在说明对接方式之前,先了解授权模式,请根据具体的需求,选择对应的授权方式!

非常重要!!!

非常重要!!!

非常重要!!!

授权模式

目前热词提供 3 种授权模式(初始化流程不同):

  1. 扫码授权模式(推荐)
    • 如未授权过的设备,进入apk后,先二维码授权界面,等客户扫码授权/输入授权码,授权成功之后再进入主界面。
    • 如已授权过的设备,进入apk后,直接进入主界面。
    • 如已授权过的设备,但被恢复出厂设置/清空存储,进入apk后,如有网络,先会后台去查询是否曾经授权成功,如是,则直接进入主界面;如否,则进入二维码界面。
  2. apiKey授权模式

    • api联网授权模式,联网即在DUI后台登记信息,给予授权,授权设备信息可在DUI后台查询。
  3. 预分配授权模式

    • 初始化的时候,读取设备上的特定内置license,再进行授权。(内置license请联系思必驰商务经理获取)

客户对接有 2 种方式:

  • apk方式
  • sdk 方式

    apk 方式

  • 客户提供对接接口,思必驰开发 apk,客户再 集成 apk。其中客户需提供的相关信息有:

    • 提供 deviceId 获取方式,刷机不会变的唯一标示
    • 约定授权方式:扫描授权、api授权、取预分配授权
    • 如果是预分配授权模式,约定 licenceId获取方式:wifi 名称或分销商名(设备有区分分销商方式)等等
    • 希望能提供一个恢复出厂不会被格式化的路径(授权文件保存的路径),如果没有就用我们默认的。但可能刷机或者恢复出厂后,授权文件会丢失,必须连网之后才能重新激活。
    • 提供每个热词指令对应动作对接协议
    • 约定来电录音机关闭录音机方式:电话时需要约定关闭热词引擎,挂断重启引擎的协议
    • 约定开机启动方式
    • 约定倒车的对接方式:倒车时需要约定关闭热词引擎,结束倒车重启引擎的协议
    • adb 可调试的机器
  • 输出内容:

    • hotwords-xxx.apk

sdk 方式

  1. 思必驰输出 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\ 路径下
  2. 输出内容:

    • 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
    }
  ]
}
  1. vad

  2. res: vad 资源

  3. enable: 是否开启 vad,正常录音模式下,必须开启检测人声

  4. audio

  5. srcPath:feed 音频模式,原始音频目录。结合 customFeed 使用

  6. backupPath:保存送 vad 和送 asr 的音频目录。默认关闭

  7. asrAudioPath:保存 asr 过了置信度之后的音频目录。依赖于必须同时设置 backupPath,默认关闭

  8. customFeed:是否开启 feed 音频到热词引擎,默认关闭

  9. feedIntervalTime:每次 feed 的音频间隔

  10. res 当前语种的识别资源,必须和语种对应上。当前 app 会优先寻找 /sdcard/lyra/res下的资源,如果没有找到,则会去 assets目录寻找

  11. thresh 当前语种设置的全局统一阈值,当热词引擎 ASR.CALLBACK 中的置信度 conf > thresh 时,判定为有效的识别。

  12. 此阈值为当前演示版测试参考,具体项目可能需要结合实际效果可做微调。

  13. 需要说明的是:阈值过高,识别率降低;阈值过低,误识别率会增加。故该字段是热词识别效果的非常重要的关键指标

  14. words

  15. command:注册到热词引擎的指令词,请特别注意事项:
    • 英语、日语部分指令需要空格分词
    • 英语、日语部分指令需要空格分词
    • 英语、日语部分指令需要空格分词
  16. commandTips: 展示在 UI 界面的指令词,根据具体 ui 设计需求,有些要求小写,有些要求首字母大写,故特意增加此字段
  17. action:具体执行动作的映射,可通过此字符串反射到对应的动作实现执行类
  18. thresh:对单个词设置指定阈值,如果设置该字段,会优先于上面的统一阈值
  19. 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

    • 语音设置
      • 唤醒开关设置
      • 语言切换
    • 语音指令:展示当前注册的热词指令
    • 关于:版本介绍

其他补充

  1. 保存资源有 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

  1. 如果需要调整阈值,或者热词指令,可以修改 conf 对应的语种的配置文件。重启进程即可

  2. 数据统计,每次开关唤醒开关,都会保存当前识别记录到 /sdcard/lyra/xxx.json。具体逻辑可参考:FeedAudioHelper

常见问题

  1. 授权失败
  2. 来电时,如何关闭热词录音机?
    • 与蓝牙电话约定如广播或其他协议,热词 app 收到消息后,停止/开启引擎。
  3. 倒车时,如何关闭热词录音机?
    • 与倒车事件约定如广播或其他协议,热词 app 收到消息后,停止/开启引擎。
  4. 断开ACC时,如何彻底关闭热词录音机?
    • 与ACC事件约定如广播或其他协议,热词 app 收到消息后,停止(stop/destroy)引擎。
  5. 其他问题请参阅:http://car.aispeech.com/duilite/docs/duilite/qi-ta/chang-jian-wen-ti.html

results matching ""

    No results matching ""