唤醒词检测系统代码分析
这段代码实现了一个基于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. 音频处理流程
-
数据输入 (
Feed):- 接收原始PCM数据(16位有符号,单声道)
- 按
feed_chunksize分块(通常512样本/块)送入音频前端
-
前端处理 (
esp_afe_sr_v1):- 执行回声消除(AEC)、噪声抑制(NS)、语音增强(SE)
- 输出处理后的音频流及元数据
-
唤醒词检测:
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_实现生产-消费模型
四、关键技术点
-
低延迟设计:
- 音频处理块大小512样本(32ms@16kHz)
- 优先使用PSRAM存储音频数据
heap_caps_malloc(..., MALLOC_CAP_SPIRAM); -
多任务同步:
- 事件组控制检测启停 (
DETECTION_RUNNING_EVENT) - Mutex保护共享队列 (
wake_word_mutex_)
- 事件组控制检测启停 (
-
唤醒词模型:
- 使用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数据包
六、潜在优化方向
-
内存优化:
- 使用环形缓冲区替代
deque存储PCM数据 - 动态调整编码任务栈大小
- 使用环形缓冲区替代
-
功耗优化:
- 在无活动时进入低功耗模式
- 动态调整VAD灵敏度
-
扩展性:
- 支持多唤醒词模型动态切换
- 增加音频特征提取接口
该代码展现了典型的嵌入式语音交互系统实现,结合了信号处理、机器学习和实时系统设计的关键技术。

浙公网安备 33010602011771号