用户自定义指令词工具使用说明*
注意
- 当前脚本在 ubuntu22.04 下测试通过,其他环境未测试。
- SDK链接网址:http://gitlab.nationalchip.com/nationalchip/voice-wifi-solution/ovp_aiot/
- 工具位于SDK的路径:
tools/kws_setup_tool/
- 注意:此链接需要访问权限,请联系国芯微处理。
该脚本用于生成配置GX8006自定义指令词的串口配置命令。
根据自己需求修改 config.yaml
文件,然后运行脚本,将输出的配置命令串口发送到8006,完成自定义指令词的配置。
1.配置文件介绍*
# cpu 核数,设置需要求取阈值的指令词个数超过1时生效
cpu_num: 1
# 模型路径
model_path: gxmodel/v0.1.0
# 是否使用默认的指令词(固件未设置指令词时使用的指令词)
use_default_command_words: false # true / false
# 设置指令词,若需要包含默认的指令词请自己手动添加
# word : 用户自定义指令词
# type : 0 表示指令词; 1 表示唤醒词
# event_id : 唤醒词的id, 会通过离线语音唤醒事件上报(0x08)
# misactive_number: 允许误唤醒次数
# threshold : 使用指定的阈值,设置此参数后,将不再根据误唤醒次数计算阈值,而是直接使用此值,需要计算请设置null或不设置此字段
user_kws_list:
- word: 小好小好
type: 1
event_id: 101
misactive_number: 1
threshold: 750 # 指定后不再根据误唤醒次数计算阈值,而是直接使用此值
- word: 小好同学
type: 1
event_id: 102
misactive_number: 1
# threshold: 750 # 未设置此字段,将根据误唤醒次数计算阈值
2.命令参数说明*
$ python main.py -h
usage: main.py [-h] [-v] [-i INPUTCONFIGPATH] [-o OUTPUT] [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
[--debug]
用户自定义指令词设置生成工具
options:
-h, --help show this help message and exit
-v, -V, --version 显示版本信息
-i INPUTCONFIGPATH, --inputConfigPath INPUTCONFIGPATH
config.yaml 配置路径
-o OUTPUT, --output OUTPUT
输出文件保存路径
--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
设置日志等级
--debug 启用调试模式
3.运行说明*
3.1. 运行打包的可执行文件*
3.1.1.修改config.yaml
配置文件*
3.1.2.运行*
- 默认使用主目录下的
config.yaml
,临时文件生成在output
下:$ ./main
3.2.运行源码*
3.2.1.环境准备*
-
测试环境使用的 Ubuntu 22.04,Python 版本为 3.10.12
$ python --version Python 3.10.12
-
创建虚拟环境,避免与系统其他 Python 环境冲突::
python3 -m venv .venv
-
激活虚拟环境:
source .venv/bin/activate
-
使用 pip 安装依赖:
pip3 install -r requirements.txt
3.2.2.修改config.yaml
配置文件*
3.2.3.运行*
- 默认使用主目录下的config.yaml,临时文件生成在output下:
$ python3 main.py
4.脚本输出使用说明*
- 每次下发设置命令将会重置之前设置的词条,所以需要一次性设置完所有词条设置。
- 若芯片掉电设置数据也会丢失。
- 输出示例,可以直接通过串口发送完整协议帧到设备进行测试。
$ python main.py ...... 不需要获取阈值的指令词: ['小好小好'] 需要自动获取阈值的指令词: ['小好同学'] ...... 最终阈值结果: {'小好小好': 750, '小好同学': 824} 不使用默认指令词 指令词: 小好小好, 长度: 12, 标签长度: 8, 标签值: [14, 38, 11, 37, 14, 38, 11, 37] 指令词: 小好同学, 长度: 12, 标签长度: 8, 标签值: [14, 38, 11, 37, 6, 51, 14, 35] 完整协议帧(二进制): bytearray(b'U\xaa\x00\x92\x00\\\x11\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00e\x00\x00\x02\xee\x00\x00\x00\x01\x0c\xe5\xb0\x8f\xe5\xa5\xbd\xe5\xb0\x8f\xe5\xa5\xbd\x10\x00\x0e\x00&\x00\x0b\x00%\x00\x0e\x00&\x00\x0b\x00%\x00\x00\x00f\x00\x00\x038\x00\x00\x00\x01\x0c\xe5\xb0\x8f\xe5\xa5\xbd\xe5\x90\x8c\xe5\xad\xa6\x10\x00\x0e\x00&\x00\x0b\x00%\x00\x06\x003\x00\x0e\x00#@') 完整协议帧(十六进制): 55aa0092005c110000000000000200000065000002ee000000010ce5b08fe5a5bde5b08fe5a5bd10000e0026000b0025000e0026000b00250000006600000338000000010ce5b08fe5a5bde5908ce5ada610000e0026000b002500060033000e002340 子命令之后的串口数据,不包括子命令和校验和(二进制): bytearray(b'\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00e\x00\x00\x02\xee\x00\x00\x00\x01\x0c\xe5\xb0\x8f\xe5\xa5\xbd\xe5\xb0\x8f\xe5\xa5\xbd\x10\x00\x0e\x00&\x00\x0b\x00%\x00\x0e\x00&\x00\x0b\x00%\x00\x00\x00f\x00\x00\x038\x00\x00\x00\x01\x0c\xe5\xb0\x8f\xe5\xa5\xbd\xe5\x90\x8c\xe5\xad\xa6\x10\x00\x0e\x00&\x00\x0b\x00%\x00\x06\x003\x00\x0e\x00#') 子命令之后的串口数据,不包括子命令和校验和(十六进制): 0000000000000200000065000002ee000000010ce5b08fe5a5bde5b08fe5a5bd10000e0026000b0025000e0026000b00250000006600000338000000010ce5b08fe5a5bde5908ce5ada610000e0026000b002500060033000e0023 指令词设置命令已生成,请使用 0x11 命令发送到设备 程序执行完成
5.FAQ*
5.1.一般使用流程是什么?*
┌──────────────┐
│ 用户操作 |
└──────┬───────┘
│ [HTTP]
▼
┌──────────────┐
│ 云服务端 |
└──────┬───────┘
│ [加载配置]
▼
┌──────────────┐
│ config.yaml │
└──────┬───────┘
│ [执行]
▼
┌──────────────┐
│自定义指令词工具 │
└──────┬───────┘
│ [输出]
▼
┌──────────────┐
│ 串口指令 │
└──────┬───────┘
│ [MQTT]
▼
┌──────────────┐
│ WIFI模组 │
└──────┬───────┘
│ [串口]
▼
┌──────────────┐
│ MCU设备 │
└──────────────┘
5.2.如何手动设置指令词的阈值?*
为了可以手动设置指令词的阈值,需要在配置文件config.yaml
中设置指令词的threshold
字段。
如下:
user_kws_list:
- word: 你好小智
type: 1
event_id: 101
misactive_number: 1
threshold: 750 # 指定后不再根据误唤醒次数计算阈值,而是直接使用此值
5.3.如何控制是否使用固件中默认的指令词?*
固件中默认的指令词是指默认固件中自带的指令词(固件未设置指令词时使用的指令词),如标准固件中的你好小智
、小智同学
等。
可以通过配置文件config.yaml
中的use_default_kws
字段控制是否使用固件中默认的指令词。
如下:
# 是否使用默认的指令词(固件未设置指令词时使用的指令词)
use_default_command_words: false # true / false
5.4.如何修改固件中默认的指令词?*
如果需要修改固件中默认的指令词,需要修改固件的源码,重新烧录固件。
需要修改的源码路径位于ovp/vpa/olab_panda/vui/kws_engine/model_fst/*/kws_list.h
。(*
位置是使用的模型包名称)
kws_list.h
文件说明:
const static OVP_KWS_PARAM g_ctc_kws_param_list[] = {
#ifdef CONFIG_ENABLE_NI_HAO_XIAO_ZHI
{"你好小智", {7, 21, 11, 37, 14, 38, 63, 21}, 8, 687+80, 100, 1},
#endif
#ifdef CONFIG_ENABLE_XIAO_ZHI_TONG_XUE
{"小智同学", {14, 38, 63, 21, 6, 51, 14, 35}, 8, 650+80, 100, 1},
#endif
#ifdef CONFIG_ENABLE_XIAO_MEI_XIAO_MEI
{"小美小美", {14, 38, 3, 33, 14, 38, 3, 33}, 8, 702+80, 100, 1},
#endif
};
以{"你好小智", {7, 21, 11, 37, 14, 38, 63, 21}, 8, 687+80, 100, 1},
为例,各字段说明:
你好小智
:指令词。{7, 21, 11, 37, 14, 38, 63, 21}
:指令词对应的标签值,通过在config.yml文件中设置需要的指令词从log输出中获取。8
:指令词的标签长度。687+80
:指令词唤醒阈值,可通过在config.yml文件中设置需要的指令词从log输出中获取。100
:唤醒后上报的ID。1
:指令词类型,0表示指令词,1表示唤醒词。
修改说明:
- 删除,直接注释掉不需要的指令词数组即可。
- 增加,请按照上述说明增加相应的数组元素。
- 修改,请按照上述说明修改相应的字段。