跳转至

用户自定义指令词工具使用说明*

注意

该脚本用于生成配置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表示唤醒词。

修改说明:

  • 删除,直接注释掉不需要的指令词数组即可。
  • 增加,请按照上述说明增加相应的数组元素。
  • 修改,请按照上述说明修改相应的字段。