“ESP32-Audio-Kit”的版本间的差异
(未显示同一用户的19个中间版本) | |||
第1行: | 第1行: | ||
{{Product | {{Product | ||
|images=[[File:ESP32-Audio-Kit.jpg|400px]] | |images=[[File:ESP32-Audio-Kit.jpg|400px]] | ||
− | |categories={{Category|WiFi}} | + | |categories= |
− | |brand= | + | {{Category|WiFi}} |
+ | {{Category|音频}} | ||
+ | {{Category|Espressif}} | ||
+ | {{Category|ESP32}} | ||
+ | |brand=安信可 | ||
|interfaces= | |interfaces= | ||
− | {{Category|UART接口}}{{Category|SDIO接口}} | + | {{Category|UART接口}} |
+ | {{Category|SDIO接口}} | ||
|related= | |related= | ||
{{ESP32 Related}} | {{ESP32 Related}} | ||
第12行: | 第17行: | ||
{{FULLPAGENAME}} 是基于 [[ESP32-A1S]] 模组开发的小型音频开发板。大多数音频外设分布在开发板两侧,支持TF卡,耳机输出,两路麦克风输入和两路喇叭输出。方便开发人员迅速开发。 | {{FULLPAGENAME}} 是基于 [[ESP32-A1S]] 模组开发的小型音频开发板。大多数音频外设分布在开发板两侧,支持TF卡,耳机输出,两路麦克风输入和两路喇叭输出。方便开发人员迅速开发。 | ||
− | == | + | == 板载资源 == |
* 耳机口(earphone):插入3.5mm耳机插口,支持左右声道输出。 | * 耳机口(earphone):插入3.5mm耳机插口,支持左右声道输出。 | ||
* 左右声道扬声器(left channel of speaker/right channel of speaker):支持最大输出4Ω3W喇叭输出,同时支持双声道输出。 | * 左右声道扬声器(left channel of speaker/right channel of speaker):支持最大输出4Ω3W喇叭输出,同时支持双声道输出。 | ||
第37行: | 第42行: | ||
* 电源输入(POWER):最大支持5V2A电源输入,支持同时锂电池充电。 | * 电源输入(POWER):最大支持5V2A电源输入,支持同时锂电池充电。 | ||
* 串口(UART):支持micro usb串口输入输出,最大支持921600波特率。 | * 串口(UART):支持micro usb串口输入输出,最大支持921600波特率。 | ||
− | * 下载按钮(BOOT):下载时请拉低。由于IO0提供codec时钟,程序正常运行时请勿按下,否则影响codec工作。 | + | * 下载按钮(BOOT):下载时请拉低。由于IO0提供codec时钟,程序正常运行时请勿按下,否则影响codec工作。 |
* 复位按钮(EN):按此按钮可以重置系统。 | * 复位按钮(EN):按此按钮可以重置系统。 | ||
* 供电方式:1.Micro USB端口 5V/2A;2.锂电池供电。 | * 供电方式:1.Micro USB端口 5V/2A;2.锂电池供电。 | ||
+ | |||
+ | == 使用说明 == | ||
+ | * [https://github.com/donny681/esp-adf SDK例子] | ||
+ | * 更多教程请参考 [https://docs.espressif.com/projects/esp-adf/en/latest/get-started/index.html#about-esp-adf ESP-ADF API文档] 里面Ai-example例子。 | ||
+ | |||
+ | 下面将讲解如何使用 ESP32-Audio-Kit (ESP32-A1S开发板)轻松的实现离线语音控制LED灯。 | ||
+ | |||
+ | === 离线语音框架 === | ||
+ | 1. '''算法模型 WakeNet 和 识别模型 MultiNet''' | ||
+ | |||
+ | 既然是语音唤醒,本地识别,就离不开算法模型和识别模型,而ESP32-A1S是基于乐鑫一个仓库esp_sr为基础的。而 esp_sr 提供语音识别相关方向算法模型,目前主要包括三个模块: | ||
+ | * 唤醒词识别模型 WakeNet | ||
+ | * 语音命令识别模型 MultiNet | ||
+ | * 声学算法:集成了回声消除 AEC(Acoustic Echo Cancellation),自动增益调节 AGC(automatic_gain_control),噪声抑制 NS(Noise Suppression),语音活动检测 VAD(Voice Activity Detection) 和麦克风阵列算法(Mic Array Processing)。 | ||
+ | |||
+ | 2. '''唤醒词识别''' | ||
+ | |||
+ | 唤醒词模型 [https://github.com/espressif/esp-sr/blob/master/wake_word_engine/README_cn.md WakeNet],致力于提供一个低资源消耗的的高性能模型,支持类似“Alexa”,“天猫精灵”,“小爱同学”等唤醒词的识别。 | ||
+ | |||
+ | 目前,ESP32的唤醒词仅仅开放了如下几个:“Hi,乐鑫”,“你好小智”,“你好小鑫”,“hi,Jeson”等唤醒词。 | ||
+ | |||
+ | 3. '''语音命令识别''' | ||
+ | |||
+ | 命令词识别模型 [https://github.com/espressif/esp-sr/blob/master/speech_command_recognition/README_cn.md MultiNet],致力于提供一个灵活的离线语音命词识别框架。用户可方便根据需求自定义语音命令,无需重新训练模型。 | ||
+ | |||
+ | 目前模型支持类似“打开空调”,“打开卧室灯”等中文命令词识别,自定义语音命令词最大个数为 100。 | ||
+ | |||
+ | 英文命令词定义将在下一版提供支持。 | ||
+ | |||
+ | === 编译步骤 === | ||
+ | 固件是基于ESP32的SDK开发为基础,仓库代码已经开发了支持ESP32-A1S开发板简单控制的demo。 | ||
+ | |||
+ | 参考资料:[https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html# ESP32 Linux开发环境搭建教程] | ||
+ | |||
+ | 1. 下载源代码 | ||
+ | |||
+ | git clone 方式: | ||
+ | <pre> | ||
+ | git clone --recursive https://github.com/Ai-Thinker-Open/Ai-Thinker-Open_ESP32-A1S_ASR_SDK.git | ||
+ | </pre> | ||
+ | |||
+ | 如果速度较慢,可以直接下载: | ||
+ | * [[:File:Ai-Thinker-Open_ESP32-A1S_ASR_SDK-master.zip]] | ||
+ | |||
+ | 2. 把 esp-skainet-AI 和 ESP IDF 依赖路径加入环境变量中。 | ||
+ | <pre> | ||
+ | export IDF_PATH=~/esp32/esp-skainet-AI/esp-idf/ | ||
+ | </pre> | ||
+ | 路径应以实际情况为准。或者写入 .bashrc 中。 | ||
+ | |||
+ | 3. 把编译需要的工具链写入 .bashrc 中。 | ||
+ | |||
+ | [[File:ESP32-Audio-Kit_2.png]] | ||
+ | |||
+ | 4. 打开工程里的 examples/Smart_home_scene_AI,通过 make menuconfig 配置,选择开发板为 ESP32-A1S。 | ||
+ | |||
+ | [[File:ESP32-Audio-Kit_3.gif]] | ||
+ | |||
+ | 5. 通过串口连接电脑之后,给串口赋予 777 权限,并开始编译。 | ||
+ | <pre> | ||
+ | sudo chmod 777 /dev/ttyUSB0 | ||
+ | make flash monitor -8j | ||
+ | </pre> | ||
+ | |||
+ | 6. 编译成功。 | ||
+ | |||
+ | [[File:ESP32-Audio-Kit_4.png]] | ||
+ | |||
+ | 7. 然后,对开发板说 “你好,小智” ,这时候,红色指示灯会亮起来,说明唤醒成功,然后接着说 “打开客厅的灯”,客厅的灯就会亮起。 | ||
+ | |||
+ | === 代码分析 === | ||
+ | 本地能识别的词语列表,可以看到是一个一个词语的拼音: | ||
+ | <pre> | ||
+ | [0;32mI (321) MN: ---------------------SPEECH COMMANDS--------------------- | ||
+ | [0;32mI (328) MN: Command ID0, phrase 0: da kai yi hao deng | ||
+ | [0;32mI (333) MN: Command ID1, phrase 1: da kai er hao deng | ||
+ | [0;32mI (339) MN: Command ID2, phrase 2: da kai san hao deng | ||
+ | [0;32mI (345) MN: Command ID3, phrase 3: da kai si hao deng | ||
+ | [0;32mI (351) MN: Command ID4, phrase 4: da kai wu hao deng | ||
+ | [0;32mI (356) MN: Command ID5, phrase 5: da kai ke ting de deng | ||
+ | [0;32mI (363) MN: Command ID6, phrase 6: guan bi ke ting de deng | ||
+ | [0;32mI (369) MN: Command ID7, phrase 7: da kai wo shi de deng | ||
+ | [0;32mI (375) MN: Command ID8, phrase 8: guan bi wo shi de deng | ||
+ | [0;32mI (381) MN: Command ID9, phrase 9: da kai chu fang de deng | ||
+ | [0;32mI (387) MN: Command ID10, phrase 10: guan bi chu fang de deng | ||
+ | [0;32mI (393) MN: Command ID11, phrase 11: da kai zou lang de deng | ||
+ | [0;32mI (400) MN: Command ID12, phrase 12: guan bi zou lang de deng | ||
+ | [0;32mI (406) MN: Command ID13, phrase 13: da kai ce suo de deng | ||
+ | [0;32mI (412) MN: Command ID14, phrase 14: guan bi ce suo de deng | ||
+ | [0;32mI (419) MN: Command ID15, phrase 15: da kai wei sheng jian de deng | ||
+ | [0;32mI (425) MN: Command ID16, phrase 16: guan bi wei sheng jian de deng | ||
+ | [0;32mI (432) MN: Command ID17, phrase 17: da kai quan bu de deng | ||
+ | [0;32mI (439) MN: Command ID18, phrase 18: guan bi quan bu de deng | ||
+ | [0;32mI (445) MN: Command ID19, phrase 19: quan bu da kai | ||
+ | [0;32mI (450) MN: Command ID20, phrase 20: quan bu guan bi | ||
+ | [0;32mI (457) MN: Command ID83, phrase 21: quan bu | ||
+ | [0;32mI (461) MN: Command ID84, phrase 22: guan bi wu hao deng | ||
+ | [0;32mI (467) MN: Command ID85, phrase 23: guan bi si hao deng | ||
+ | [0;32mI (473) MN: Command ID86, phrase 24: guan bi san hao deng | ||
+ | [0;32mI (479) MN: Command ID87, phrase 25: guan bi er hao deng | ||
+ | [0;32mI (485) MN: Command ID88, phrase 26: guan bi yi hao deng | ||
+ | [0;32mI (491) MN: Command ID89, phrase 27: guan bi tai deng | ||
+ | [0;32mI (497) MN: Command ID90, phrase 28: da kai tai deng | ||
+ | [0;32mI (502) MN: Command ID91, phrase 29: guan bi shu fang de deng | ||
+ | [0;32mI (509) MN: Command ID92, phrase 30: da kai shu fang de deng | ||
+ | [0;32mI (515) MN: Command ID93, phrase 31: guan bi | ||
+ | [0;32mI (520) MN: Command ID94, phrase 32: da kai | ||
+ | [0;32mI (525) MN: Command ID95, phrase 33: da kai shi hao deng | ||
+ | [0;32mI (531) MN: Command ID96, phrase 34: da kai jiu hao deng | ||
+ | [0;32mI (537) MN: Command ID97, phrase 35: da kai ba hao deng | ||
+ | [0;32mI (543) MN: Command ID98, phrase 36: da kai qi hao deng | ||
+ | [0;32mI (549) MN: Command ID99, phrase 37: da kai liu hao deng | ||
+ | --------------------------------------------------------- | ||
+ | </pre> | ||
+ | 处理代码如下: | ||
+ | <source lang="C"> | ||
+ | bool speech_commands_action(int command_id) | ||
+ | { | ||
+ | printf("Commands ID: %d.\n", command_id); | ||
+ | switch (command_id) | ||
+ | { | ||
+ | case 5: | ||
+ | printf("打开客厅的灯\n"); | ||
+ | open_light(50000); | ||
+ | break; | ||
+ | case 6: | ||
+ | printf("关闭客厅的灯\n"); | ||
+ | close_light(50000); | ||
+ | break; | ||
+ | case 7: | ||
+ | printf("打开卧室的灯\n"); | ||
+ | open_light(50001); | ||
+ | break; | ||
+ | case 8: | ||
+ | printf("关闭卧室的灯\n"); | ||
+ | close_light(50001); | ||
+ | break; | ||
+ | case 9: | ||
+ | printf("打开厨房的灯\n"); | ||
+ | open_light(50002); | ||
+ | break; | ||
+ | case 10: | ||
+ | printf("关闭厨房的灯\n"); | ||
+ | close_light(50002); | ||
+ | break; | ||
+ | case 11: | ||
+ | printf("打开走廊的灯\n"); | ||
+ | open_light(50003); | ||
+ | break; | ||
+ | case 12: | ||
+ | printf("关闭走廊的灯\n"); | ||
+ | close_light(50003); | ||
+ | break; | ||
+ | |||
+ | |||
+ | case 19: | ||
+ | printf("全部打开\n"); | ||
+ | open_light(50000); | ||
+ | vTaskDelay(50 / portTICK_PERIOD_MS); | ||
+ | open_light(50001); | ||
+ | vTaskDelay(50 / portTICK_PERIOD_MS); | ||
+ | open_light(50002); | ||
+ | vTaskDelay(50 / portTICK_PERIOD_MS); | ||
+ | open_light(50003); | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 20: | ||
+ | printf("全部关闭\n"); | ||
+ | close_light(50000); | ||
+ | vTaskDelay(50 / portTICK_PERIOD_MS); | ||
+ | close_light(50001); | ||
+ | vTaskDelay(50 / portTICK_PERIOD_MS); | ||
+ | close_light(50002); | ||
+ | vTaskDelay(50 / portTICK_PERIOD_MS); | ||
+ | close_light(50003); | ||
+ | break; | ||
+ | |||
+ | default: | ||
+ | return false; | ||
+ | break; | ||
+ | } | ||
+ | return true; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == 资源下载 == | ||
+ | * [https://docs.ai-thinker.com/esp32 ESP32 系列模组专题] | ||
+ | * [[:File:esp32-audio-kit_v2.2_sch.pdf|ESP32-Audio-Kit 原理图]] | ||
+ | * [[:File:esp32-a1s_product_specification_zh.pdf|ESP32-A1S 规格书]] | ||
+ | * [[:File:Audio-Kit-BT-SD-V1_0.zip|出厂固件]] | ||
+ | * [https://github.com/donny681/esp-adf SDK例子] | ||
+ | * [https://docs.espressif.com/projects/esp-adf/en/latest/get-started/index.html#about-esp-adf ESP-ADF API文档] | ||
+ | |||
+ | === ESP32-A1S ASR SDK === | ||
+ | <pre> | ||
+ | git clone https://github.com/Ai-Thinker-Open/Ai-Thinker-Open_ESP32-A1S_ASR_SDK | ||
+ | </pre> | ||
+ | 或直接下载 | ||
+ | * [[:File:Ai-Thinker-Open_ESP32-A1S_ASR_SDK-master.zip]] | ||
+ | |||
+ | == FAQ == | ||
+ | {{ESP32-A1S FAQ}} | ||
+ | {{Service00}} |
2021年9月18日 (六) 17:51的最新版本
| |||||||||||||||||||
| |||||||||||||||||||
| |||||||||||||||||||
|
产品概述
ESP32-Audio-Kit 是基于 ESP32-A1S 模组开发的小型音频开发板。大多数音频外设分布在开发板两侧,支持TF卡,耳机输出,两路麦克风输入和两路喇叭输出。方便开发人员迅速开发。
板载资源
- 耳机口(earphone):插入3.5mm耳机插口,支持左右声道输出。
- 左右声道扬声器(left channel of speaker/right channel of speaker):支持最大输出4Ω3W喇叭输出,同时支持双声道输出。
- SD卡:最大支持64G SD卡读写
- 按键(KEY):支持6路按键输入,默认出厂以下接入方式
名称 | IO |
---|---|
KEY1 | IO36 |
KEY2 | IO13 |
KEY3 | IO19 |
KEY4 | IO23 |
KEY5 | IO18 |
KEY6 | IO5 |
- 麦克风:两路模拟麦克风,分别作为音频输入。
- 耳麦输入(LINEIN):支持耳机麦克风输入。
- 锂电池(battery):支持3.7伏锂电池输入。
- 电源输入(POWER):最大支持5V2A电源输入,支持同时锂电池充电。
- 串口(UART):支持micro usb串口输入输出,最大支持921600波特率。
- 下载按钮(BOOT):下载时请拉低。由于IO0提供codec时钟,程序正常运行时请勿按下,否则影响codec工作。
- 复位按钮(EN):按此按钮可以重置系统。
- 供电方式:1.Micro USB端口 5V/2A;2.锂电池供电。
使用说明
- SDK例子
- 更多教程请参考 ESP-ADF API文档 里面Ai-example例子。
下面将讲解如何使用 ESP32-Audio-Kit (ESP32-A1S开发板)轻松的实现离线语音控制LED灯。
离线语音框架
1. 算法模型 WakeNet 和 识别模型 MultiNet
既然是语音唤醒,本地识别,就离不开算法模型和识别模型,而ESP32-A1S是基于乐鑫一个仓库esp_sr为基础的。而 esp_sr 提供语音识别相关方向算法模型,目前主要包括三个模块:
- 唤醒词识别模型 WakeNet
- 语音命令识别模型 MultiNet
- 声学算法:集成了回声消除 AEC(Acoustic Echo Cancellation),自动增益调节 AGC(automatic_gain_control),噪声抑制 NS(Noise Suppression),语音活动检测 VAD(Voice Activity Detection) 和麦克风阵列算法(Mic Array Processing)。
2. 唤醒词识别
唤醒词模型 WakeNet,致力于提供一个低资源消耗的的高性能模型,支持类似“Alexa”,“天猫精灵”,“小爱同学”等唤醒词的识别。
目前,ESP32的唤醒词仅仅开放了如下几个:“Hi,乐鑫”,“你好小智”,“你好小鑫”,“hi,Jeson”等唤醒词。
3. 语音命令识别
命令词识别模型 MultiNet,致力于提供一个灵活的离线语音命词识别框架。用户可方便根据需求自定义语音命令,无需重新训练模型。
目前模型支持类似“打开空调”,“打开卧室灯”等中文命令词识别,自定义语音命令词最大个数为 100。
英文命令词定义将在下一版提供支持。
编译步骤
固件是基于ESP32的SDK开发为基础,仓库代码已经开发了支持ESP32-A1S开发板简单控制的demo。
参考资料:ESP32 Linux开发环境搭建教程
1. 下载源代码
git clone 方式:
git clone --recursive https://github.com/Ai-Thinker-Open/Ai-Thinker-Open_ESP32-A1S_ASR_SDK.git
如果速度较慢,可以直接下载:
2. 把 esp-skainet-AI 和 ESP IDF 依赖路径加入环境变量中。
export IDF_PATH=~/esp32/esp-skainet-AI/esp-idf/
路径应以实际情况为准。或者写入 .bashrc 中。
3. 把编译需要的工具链写入 .bashrc 中。
4. 打开工程里的 examples/Smart_home_scene_AI,通过 make menuconfig 配置,选择开发板为 ESP32-A1S。
5. 通过串口连接电脑之后,给串口赋予 777 权限,并开始编译。
sudo chmod 777 /dev/ttyUSB0 make flash monitor -8j
6. 编译成功。
7. 然后,对开发板说 “你好,小智” ,这时候,红色指示灯会亮起来,说明唤醒成功,然后接着说 “打开客厅的灯”,客厅的灯就会亮起。
代码分析
本地能识别的词语列表,可以看到是一个一个词语的拼音:
[0;32mI (321) MN: ---------------------SPEECH COMMANDS--------------------- [0;32mI (328) MN: Command ID0, phrase 0: da kai yi hao deng [0;32mI (333) MN: Command ID1, phrase 1: da kai er hao deng [0;32mI (339) MN: Command ID2, phrase 2: da kai san hao deng [0;32mI (345) MN: Command ID3, phrase 3: da kai si hao deng [0;32mI (351) MN: Command ID4, phrase 4: da kai wu hao deng [0;32mI (356) MN: Command ID5, phrase 5: da kai ke ting de deng [0;32mI (363) MN: Command ID6, phrase 6: guan bi ke ting de deng [0;32mI (369) MN: Command ID7, phrase 7: da kai wo shi de deng [0;32mI (375) MN: Command ID8, phrase 8: guan bi wo shi de deng [0;32mI (381) MN: Command ID9, phrase 9: da kai chu fang de deng [0;32mI (387) MN: Command ID10, phrase 10: guan bi chu fang de deng [0;32mI (393) MN: Command ID11, phrase 11: da kai zou lang de deng [0;32mI (400) MN: Command ID12, phrase 12: guan bi zou lang de deng [0;32mI (406) MN: Command ID13, phrase 13: da kai ce suo de deng [0;32mI (412) MN: Command ID14, phrase 14: guan bi ce suo de deng [0;32mI (419) MN: Command ID15, phrase 15: da kai wei sheng jian de deng [0;32mI (425) MN: Command ID16, phrase 16: guan bi wei sheng jian de deng [0;32mI (432) MN: Command ID17, phrase 17: da kai quan bu de deng [0;32mI (439) MN: Command ID18, phrase 18: guan bi quan bu de deng [0;32mI (445) MN: Command ID19, phrase 19: quan bu da kai [0;32mI (450) MN: Command ID20, phrase 20: quan bu guan bi [0;32mI (457) MN: Command ID83, phrase 21: quan bu [0;32mI (461) MN: Command ID84, phrase 22: guan bi wu hao deng [0;32mI (467) MN: Command ID85, phrase 23: guan bi si hao deng [0;32mI (473) MN: Command ID86, phrase 24: guan bi san hao deng [0;32mI (479) MN: Command ID87, phrase 25: guan bi er hao deng [0;32mI (485) MN: Command ID88, phrase 26: guan bi yi hao deng [0;32mI (491) MN: Command ID89, phrase 27: guan bi tai deng [0;32mI (497) MN: Command ID90, phrase 28: da kai tai deng [0;32mI (502) MN: Command ID91, phrase 29: guan bi shu fang de deng [0;32mI (509) MN: Command ID92, phrase 30: da kai shu fang de deng [0;32mI (515) MN: Command ID93, phrase 31: guan bi [0;32mI (520) MN: Command ID94, phrase 32: da kai [0;32mI (525) MN: Command ID95, phrase 33: da kai shi hao deng [0;32mI (531) MN: Command ID96, phrase 34: da kai jiu hao deng [0;32mI (537) MN: Command ID97, phrase 35: da kai ba hao deng [0;32mI (543) MN: Command ID98, phrase 36: da kai qi hao deng [0;32mI (549) MN: Command ID99, phrase 37: da kai liu hao deng ---------------------------------------------------------
处理代码如下:
bool speech_commands_action(int command_id)
{
printf("Commands ID: %d.\n", command_id);
switch (command_id)
{
case 5:
printf("打开客厅的灯\n");
open_light(50000);
break;
case 6:
printf("关闭客厅的灯\n");
close_light(50000);
break;
case 7:
printf("打开卧室的灯\n");
open_light(50001);
break;
case 8:
printf("关闭卧室的灯\n");
close_light(50001);
break;
case 9:
printf("打开厨房的灯\n");
open_light(50002);
break;
case 10:
printf("关闭厨房的灯\n");
close_light(50002);
break;
case 11:
printf("打开走廊的灯\n");
open_light(50003);
break;
case 12:
printf("关闭走廊的灯\n");
close_light(50003);
break;
case 19:
printf("全部打开\n");
open_light(50000);
vTaskDelay(50 / portTICK_PERIOD_MS);
open_light(50001);
vTaskDelay(50 / portTICK_PERIOD_MS);
open_light(50002);
vTaskDelay(50 / portTICK_PERIOD_MS);
open_light(50003);
break;
case 20:
printf("全部关闭\n");
close_light(50000);
vTaskDelay(50 / portTICK_PERIOD_MS);
close_light(50001);
vTaskDelay(50 / portTICK_PERIOD_MS);
close_light(50002);
vTaskDelay(50 / portTICK_PERIOD_MS);
close_light(50003);
break;
default:
return false;
break;
}
return true;
}
资源下载
ESP32-A1S ASR SDK
git clone https://github.com/Ai-Thinker-Open/Ai-Thinker-Open_ESP32-A1S_ASR_SDK
或直接下载
FAQ
|
|
|
|
|
|
|