ESP-Skainet 使用指南 [English]
目前,基于乐鑫 ESP32 的语音命令词识别模型 MultiNet 支持 100 个以内的中文或英文自定义命令词。
这个示例展示了使用 ESP32-LyraT-Mini 或 ESP32-Korvo V1.1 进行语音命令词识别的基本流程。请参考以下流程:
获取更多关于 ESP32-LyraT-Mini 或者 ESP32-Korvo V1.1 的信息,请参考 ESP32-LyraT-Mini Getting Started Guide 或者 ESP32-Korvo V1.1 Getting Started Guide
如果使用 ESP32-Lyrat Mini V1.1 开发板,进入 Audio Media HAL
,按照指示配置以下参数:
Audio hardware board
: 选择 ESP32-Lyrat Mini V1.1
;
如果使用 ESP32-Korvo V1.1 开发板,进入 Audio Media HAL
,按照指示配置以下参数:
Audio hardware board
: 选择 ESP32-Korvo V1.1
;
进入 ESP Speech Recognition
,按照指示配置以下参数:
Wake word engine
: 选择WakeNet 5 (quantized)
;Wake word name
: 选择hilexin (WakeNet5)
;speech commands recognition model to us
: 选择MultiNet 1 (quantized)
;langugae
: 选择chinese (MultiNet1)
,如果使用英文命令词识别,请选择english (MultiNet1)
;The number of speech commands
-> The number of speech commands ID;Add speech commands
-> Add the speech commands.
最后保存退出即可。
目前,MultiNet 模型中已经预定义了一些命令词。用户可以通过 menuconfig -> Component config -> ESP Speech Recognition -> Add speech commands
and The number of speech commands
来定义自己的语音命令词和语音命令的数目。
在填充命令词时应该使用拼音,并且每个字的拼音拼写间要间隔一个空格。比如“打开空调”,应该填入 "da kai kong tiao".
在填充命令词时应该使用特定音标,请使用 skainet 根目录 tools
目录下的 general_label_EN/general_label_en.py
脚本生成命令词对应的音标,具体使用方法请参考 音标生成方法 .
注意:
- 一个语音命令 ID 可以对应多条语音指令短语;
- 最多支持 100 个语音命令 ID 或者命令短语;
- 同一个语音命令 ID 对应的多条语音指令短语之间要使用“,”隔开
用户可以通过 void speech_commands_action(int command_id)
函数定义针对每个语音命令的动作,比如:
void speech_commands_action(int command_id)
{
printf("Commands ID: %d.\n", command_id);
switch (command_id) {
case 0:
// action0();
break;
case 1:
// action1();
break;
case 2:
// action2();
break;
case 3:
// action3();
break;
// ...
default:
break;
}
}
当我们选择使用中文命令词识别,运行 make flash monitor
来编译烧写该示例,并且检查以下输出打印:
Quantized wakeNet5: wakeNet5_v1_hilexin_5_0.95_0.90, mode:0
Quantized MN1
I (153) MN: ---------------------SPEECH COMMANDS---------------------
I (163) MN: Command ID0, phrase 0: da kai kong tiao
I (163) MN: Command ID1, phrase 1: guan bi kong tiao
I (173) MN: Command ID2, phrase 2: da kai dian deng
I (173) MN: Command ID3, phrase 3: guan bi dian deng
I (183) MN: ---------------------------------------------------------
chunk_num = 200
-----------awaits to be waken up-----------
可以通过板子的输出打印找到支持的唤醒词。在这个示例中,唤醒词是 “Hi Lexin" [Ləsɪ:n].
然后,说出 “Hi Lexin" ([Ləsɪ:n]) 来唤醒板子,唤醒后打印如下信息:
hilexin DETECTED.
-----------------LISTENING-----------------
然后,板子会进入侦听状态,等待语音命令词。
目前,MultiNet 已经预定义了 20 个词,可以参考 MultiNet.
-
如果命令词存在于命令词列表中,会打印如下 log:
-----------------LISTENING----------------- phrase ID: 0, prob: 0.866630 Commands ID: 0 -----------awaits to be waken up-----------
-
如果命令词不存在于命令词列表中,会打印如下 log:
-----------------LISTENING----------------- cannot recognize any speech commands -----------awaits to be waken up-----------
当板子结束当前的识别过程并且进入等待唤醒状态时,会再次打印 -----------awaits to be waken up-----------
注意: 板子在侦听状态持续 6 s之后,会结束当前的识别过程并且再次进入等待唤醒状态。因此,用户必须在板子被唤醒后 6 s 内发出语音命令词。
用户不需要任何特殊用途的开发板即可运行** WakeNet 和 MultiNet **示例。 目前,乐鑫已经发布了数种音频开发板,其中 ESP32-LyraT-Mini 和 ESP32-Korvo V1.1 是我们在本示例中使用的开发板。
关于 ESP32-LyraT-Mini 开发板和 ESP32-Korvo V1.1 开发板的初始化,请参考 components/hardware_driver 的代码。
如果用户选择其他的开发板,请参考 esp-adf, ESP-ADF 提供更多关于硬件驱动和应用搭建的细节。
板子在等待唤醒状态时,需要向 WakeNet 逐帧输入来自板载麦克风的音频数据流,需要满足(30 ms, 16 KHz, 16 bit, mono)的格式。
目前,用户不能自己自定义唤醒词,如果有自定义唤醒词的需求,请参考乐鑫语音唤醒词定制流程。
在识别阶段,需要向 MultiNet 逐帧输入来自板载麦克风的音频数据流,需要满足(30 ms, 16 KHz, 16 bit, mono)的格式。然后 MultiNet 会将接收到的命令词和预存的命令词列表中的命令词进行对比,并且返回识别结果。
关于如何自定义语音命令词参考 1.5 小节。