ESP32-S3语音助手:添加自定义唤醒词与指令
硬件准备ESP32-S3开发板:需支持I2S接口(如ESP32-S3-DevKitC)麦克风模块:推荐I2S数字麦克风(如INMP441)连接方式ESP32-S3↔麦克风GPIO18↔BCK (时钟)GPIO17↔WS (声道选择)GPIO16↔DATA (数据)
·
ESP32-S3语音助手:添加自定义唤醒词与指令
1. 硬件准备
- ESP32-S3开发板:需支持I2S接口(如ESP32-S3-DevKitC)
- 麦克风模块:推荐I2S数字麦克风(如INMP441)
- 连接方式:
ESP32-S3 ↔ 麦克风 GPIO18 ↔ BCK (时钟) GPIO17 ↔ WS (声道选择) GPIO16 ↔ DATA (数据) 3.3V ↔ VDD GND ↔ GND
2. 软件框架选择
使用 ESP-Skainet(乐鑫官方语音识别框架):
git clone --recursive https://github.com/espressif/esp-sr.git
3. 自定义唤醒词训练
步骤:
-
收集语音样本:
- 录制至少50条唤醒词语音(如"小智")
- 包含不同音调/语速/背景噪音
- 保存为16kHz/16bit单声道WAV文件
-
训练模型:
python esp_sr/train_wake_word.py \ --data_dir your_wakeword_samples/ \ --model_name my_wakeword \ --epochs 50- 输出:
my_wakeword_v1.bin(模型文件)
- 输出:
-
部署到ESP32-S3:
- 将模型文件放入工程
/components/model/ - 修改
CMakeLists.txt:set(MODEL_PATH "components/model/my_wakeword_v1.bin")
- 将模型文件放入工程
4. 自定义指令实现
离线指令识别(使用MultiNet模型):
// 在main.c中添加指令回调
static void speech_cmd_cb(const char *text) {
if(strstr(text, "开灯")) {
gpio_set_level(LED_PIN, 1);
}
else if(strstr(text, "关灯")) {
gpio_set_level(LED_PIN, 0);
}
}
// 注册中文指令集
const esp_mn_iface_t *multinet = &MULTINET_MODEL;
esp_mn_commands_add(multinet, CN_MULTINET_COMMANDS);
5. 完整代码示例
#include "esp_afe_sr.h"
#include "esp_mn.h"
#include "driver/gpio"
#define LED_PIN 4
void app_main() {
// 初始化LED
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
// 初始化语音前端
esp_afe_sr_iface_t *afe_handle = esp_afe_sr_create(&AFE_CONFIG_DEFAULT);
// 加载自定义唤醒词模型
esp_wn_iface_t *wake_word = wake_word_model_create(&WAKEWORD_CONFIG);
wake_word->load(wake_word, "my_wakeword_v1");
// 初始化指令识别
const esp_mn_iface_t *multinet = &MULTINET_MODEL;
esp_mn_commands_add(multinet, CN_MULTINET_COMMANDS);
while(1) {
// 采集音频
int16_t *audio_data = afe_handle->fetch(afe_handle);
// 唤醒词检测
if(wake_word->detect(wake_word, audio_data) > 0) {
printf("唤醒成功!\n");
// 指令识别
esp_mn_results_t *result = multinet->detect(multinet, audio_data);
if(result->command_id >= 0) {
speech_cmd_cb(result->command_str);
}
}
}
}
6. 关键配置
在sdkconfig中设置:
CONFIG_ESP32_S3_KORVO_V3_BOARD=y
CONFIG_AFE_SR_HANDLE_BUFFER_SIZE=1024
CONFIG_SR_WN_WAKEWORD="my_wakeword"
CONFIG_SR_MN_CN_MULTINET=y
7. 优化建议
-
功耗控制:
- 启用深度睡眠模式
- 唤醒后启动语音识别
esp_sleep_enable_ext0_wakeup(GPIO_NUM_15, 1); esp_deep_sleep_start(); -
噪声抑制:
afe_config_t afe_config = AFE_CONFIG_DEFAULT(); afe_config.aec_init = true; // 开启回声消除 afe_config.denoise_level = 3; // 降噪强度(1-5) -
多唤醒词支持:
// 注册多个唤醒词 wake_word->add("my_wakeword_v1", 0.85); // 阈值85% wake_word->add("backup_wakeword", 0.90);
8. 调试技巧
- 使用
idf.py monitor查看实时日志 - 关键调试信息:
ESP_LOGI(TAG, "音频能量: %d", afe_handle->get_energy(afe_handle)); ESP_LOGW(TAG, "识别结果: %s", result->command_str);
注意:自定义模型训练需要至少500MB RAM,建议在x86服务器进行。实际部署时唤醒词识别延迟约150ms,指令识别延迟约800ms。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)