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. 自定义唤醒词训练

步骤

  1. 收集语音样本

    • 录制至少50条唤醒词语音(如"小智")
    • 包含不同音调/语速/背景噪音
    • 保存为16kHz/16bit单声道WAV文件
  2. 训练模型

    python esp_sr/train_wake_word.py \
      --data_dir your_wakeword_samples/ \
      --model_name my_wakeword \
      --epochs 50
    

    • 输出:my_wakeword_v1.bin(模型文件)
  3. 部署到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. 优化建议
  1. 功耗控制

    • 启用深度睡眠模式
    • 唤醒后启动语音识别
    esp_sleep_enable_ext0_wakeup(GPIO_NUM_15, 1);
    esp_deep_sleep_start();
    

  2. 噪声抑制

    afe_config_t afe_config = AFE_CONFIG_DEFAULT();
    afe_config.aec_init = true;   // 开启回声消除
    afe_config.denoise_level = 3; // 降噪强度(1-5)
    

  3. 多唤醒词支持

    // 注册多个唤醒词
    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。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐