文章目录

  • 一、前言;
  • 二、修改唤醒词;
  • 三、修改命令词;
  • 四、搭建针对语音命令的动作函数
  • 五、其他
  • 5.1 编译和运行
  • 5.2 唤醒板子
  • 5.3 语音命令词识别
  • 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,欢迎留言哈!也欢迎加群讨论!



esp32tensorflow 语音 esp32离线语音_esp32tensorflow 语音

一、前言;


     前天,我在博客分享了如何入门 esp-skainet,很多群友都对此感兴趣,今天也是双十一,今天您剁手了么?还是准备老老实实跟着我敲代码?继续学习本地语音唤醒离线识别这个框架?

     最近也发现自己有点散光了,很痛苦,又要去配眼镜或者视力检查了,如果有机会,我一定不做 “程序猿”久坐对着电脑不会适量运动;


二、修改唤醒词;


     前面说了,唤醒词是只有几个,因为考虑到商业问题,官方也就开放出来几个而已,包括“Hi 乐鑫”,“您好小智”… …等几个,那么我们如何修改自定义唤醒词呢?

     打开工程配置 make menuconfig ,从下面可以看到只有“Hi 乐鑫”,“您好小智” 这2个唤醒词;英文版的唤醒词,还要等待官网添加进去;

      进入 Component config -> 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);

esp32tensorflow 语音 esp32离线语音_离线_02


三、修改命令词;


     修改命令词是什么意思?比如我要它识别到 “我要开空调”、“我要开飞机”、“我要开推土机”,然后把识别后的意图转化为代码做对应的动作;

     上篇博文说了,自定义命令词仅仅支持 100 个,而且目前为止只是中文词汇,非英文词汇,很好!

     目前,MultiNet 模型中已经预定义了四个命令词。用户可以通过 menuconfig -> Component config -> ESP Speech Recognition -> Add speech commands and The number of speech commands来定义自己的语音命令词和语音命令的数目。注意,在填充命令词时应该使用拼音,并且每个字的拼音拼写间要间隔一个空格。比如“打开空调”,应该填入 “da kai kong tiao”.

  • 一个语音命令 ID 可以对应多条语音指令短语;
  • 最多支持 100 个语音命令 ID 或者命令短语;
  • 同一个语音命令 ID 对应的多条语音指令短语之间要使用“,”隔开
  • 比如下面的动图,我做了5个语音命令 ID12个命令短语

esp32tensorflow 语音 esp32离线语音_esp32 离线唤醒_03


四、搭建针对语音命令的动作函数


     用户可以通过 void speech_commands_action(int command_id) 函数定义针对每个语音命令的动作,因为前面我们看到了每个命令短语对应一个ID,所以,识别出来的结果,我们判断id就知道它的意图是什么了,比如:

void speech_commands_action(int command_id)
{
    printf("Commands ID: %d.\n", command_id);
    switch (command_id)
    {
    case 0:
        printf("开灯 \n");
        led_on(CW_LED_GPIO);
        led_on(WW_LED_GPIO);
        break;
    case 1:
        printf("关灯 \n");
        led_off(CW_LED_GPIO);
        led_off(WW_LED_GPIO);
        break;
    case 2:
        printf("冷色光\n");
        led_on(CW_LED_GPIO);
        led_off(WW_LED_GPIO);
        break;
    case 3:
        printf("暖色光\n");
        led_off(CW_LED_GPIO);
        led_on(WW_LED_GPIO);
        break;
    case 4:
        printf("中性光\n");
        led_on(CW_LED_GPIO);
        led_on(WW_LED_GPIO);
        break;
    default:
        break;
    }
}

五、其他


5.1 编译和运行

运行 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-----------

5.2 唤醒板子

可以通过板子的输出打印找到支持的唤醒词。在这个示例中,唤醒词是 “Hi Lexin" [Ləsɪ:n].

然后,说出 “Hi Lexin" ([Ləsɪ:n]) 来唤醒板子,唤醒后打印如下信息:

hilexin DETECTED.
-----------------LISTENING-----------------

5.3 语音命令词识别

然后,板子会进入侦听状态,等待语音命令词。

目前,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-----------