唤醒词检测系统代码分析

这段代码实现了一个基于ESP32平台的唤醒词检测系统,主要功能包括音频采集、唤醒词识别、语音活动检测(VAD)及音频编码。以下是代码的逐层解析:


一、核心模块概览

模块 功能描述
WakeWordDetect 主类,管理整个唤醒词检测流程
AudioDetectionTask FreeRTOS任务,持续处理音频流并检测唤醒词
Feed() 接收原始音频数据并分块传递给音频前端处理
EncodeWakeWordData 将检测到的唤醒词音频编码为Opus格式

二、关键数据结构

// 成员变量
esp_afe_sr_data_t* afe_detection_data_;  // 音频前端处理句柄
std::deque<std::vector<int16_t>> wake_word_pcm_;  // 存储唤醒词PCM数据
std::deque<std::vector<uint8_t>> wake_word_opus_; // 存储Opus编码结果
EventGroupHandle_t event_group_;         // 控制检测启停的事件组

三、工作流程解析

1. 初始化阶段 (Initialize)

  • 模型加载
    • 通过esp_srmodel_init("model")加载存储在SPIFFS/NVS中的唤醒词模型文件
    • 解析模型名称获取支持的唤醒词列表(如"xiaozhi;alexa")
  • 音频前端配置
    afe_config_t afe_config = {
        .wakenet_model_name = "wn9_hilexin",  // 唤醒词模型名称
        .sample_rate = 16000,                 // 16kHz采样率
        .afe_mode = SR_MODE_HIGH_PERF,        // 高性能模式
        .vad_mode = VAD_MODE_3                // 语音活动检测等级
    };
    
  • 任务创建
    • 启动AudioDetectionTask(优先级1,8KB栈空间)

2. 音频处理流程

  1. 数据输入 (Feed)

    • 接收原始PCM数据(16位有符号,单声道)
    • feed_chunksize分块(通常512样本/块)送入音频前端
  2. 前端处理 (esp_afe_sr_v1)

    • 执行回声消除(AEC)、噪声抑制(NS)、语音增强(SE)
    • 输出处理后的音频流及元数据
  3. 唤醒词检测

    if (res->wakeup_state == WAKENET_DETECTED) {
        StopDetection();
        last_detected_wake_word_ = wake_words_[res->wake_word_index - 1];
        callback触发();
    }
    

3. VAD状态管理

  • 状态转换
    AFE_VAD_SPEECH → 开始录音
    AFE_VAD_SILENCE → 结束录音
    
  • 通过回调vad_state_change_callback_通知应用层

4. 音频编码

  • Opus编码
    • 使用OpusEncoderWrapper将PCM转为Opus格式
    • 编码参数:16kHz, 单声道, 20ms帧长
    • 复杂度设为0(最快编码速度)
  • 数据存储
    • 保留最近2秒音频(2000/32≈62帧)
    • 通过条件变量wake_word_cv_实现生产-消费模型

四、关键技术点

  1. 低延迟设计

    • 音频处理块大小512样本(32ms@16kHz)
    • 优先使用PSRAM存储音频数据
    heap_caps_malloc(..., MALLOC_CAP_SPIRAM);
    
  2. 多任务同步

    • 事件组控制检测启停 (DETECTION_RUNNING_EVENT)
    • Mutex保护共享队列 (wake_word_mutex_)
  3. 唤醒词模型

    • 使用ESP-SR SDK提供的预训练模型(如wn9_hilexin)
    • 支持多唤醒词识别(通过模型名称解析)

五、典型数据流

sequenceDiagram participant Mic as 麦克风 participant AFE as 音频前端 participant Wakenet as 唤醒词引擎 participant App as 应用程序 Mic->>AFE: PCM数据流(16kHz) AFE->>Wakenet: 处理后的音频帧 Wakenet->>App: 唤醒词检测事件 App->>Encode: 请求编码唤醒词音频 Encode->>App: Opus数据包

六、潜在优化方向

  1. 内存优化

    • 使用环形缓冲区替代deque存储PCM数据
    • 动态调整编码任务栈大小
  2. 功耗优化

    • 在无活动时进入低功耗模式
    • 动态调整VAD灵敏度
  3. 扩展性

    • 支持多唤醒词模型动态切换
    • 增加音频特征提取接口

该代码展现了典型的嵌入式语音交互系统实现,结合了信号处理、机器学习和实时系统设计的关键技术。

posted @ 2025-02-20 10:09  我是个rapper喔  阅读(800)  评论(0)    收藏  举报