一、 音频处理框架
该项目基于Espressif的音频处理框架构建,核心组件包括 ESP-ADF 和 ESP-SR,以下是完整的音频处理框架实现细节:
1.核心组件
(1) 音频前端处理 (AFE - Audio Front-End)
-
main/components/audio_pipeline/afe_processor.c
- 功能:
- 声学回声消除 (AEC)
- 背景噪声抑制 (NS)
- 自动增益控制 (AGC)
- 波束成形 (Beamforming)
关键配置:
// sdkconfig.defaults
CONFIG_ESP_AFE_AEC_ENABLE=y
CONFIG_ESP_AFE_NS_ENABLE=y
CONFIG_ESP_AFE_AGC_ENABLE=y
唤醒词检测 (WakeNet)
main/components/wake_detection/wakenet.c
- 功能:
- 离线唤醒词识别(支持自定义唤醒词)
- 多语言支持(中/英/日/韩)
- 低功耗监听模式(仅消耗 5mA)
void wakenet_task() {
while(1) {
// 获取音频帧
int16_t *audio_frame = afe_get_feed_data();
// 唤醒检测
int result = esp_sr_wakenet_detect(model_handle, audio_frame);
if(result > 0) {
// 触发唤醒事件
xQueueSend(wake_event_queue, &result, 0);
}
}
}
2.Opus 编码实现细节
(1) 编码器初始化main/components/audio_encoder/opus_encoder.c
#include "esp_opus_encoder.h"
opus_encoder_handle_t init_opus_encoder() {
esp_opus_encoder_config_t config = {
.sample_rate = 16000, // 16kHz 采样率
.channel = 1, // 单声道
.bitrate = 16000, // 16kbps 比特率
.complexity = 5, // 复杂度平衡
.frame_size = 20, // 20ms 帧大小
.vbr = false // 固定比特率
};
return esp_opus_encoder_create(&config);
}
实时编码流程
void audio_encoding_task() {
opus_encoder_handle_t encoder = init_opus_encoder();
int16_t pcm_buffer[320]; // 20ms@16kHz = 320 samples
while(1) {
// 1. 获取预处理后的PCM数据
afe_fetch_result_t res = afe_fetch(afe_handle);
// 2. 执行Opus编码
size_t opus_len;
uint8_t opus_data[50]; // 压缩后约50字节/帧
esp_opus_encode(encoder, res.data, res.data_size,
opus_data, &opus_len);
// 3. 添加自定义头部(时间戳+序列号)
uint8_t packet[54];
add_rtp_header(packet, opus_data, opus_len);
// 4. 发送到网络
network_send_audio(packet, opus_len + 4);
}
}
网络封包格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-&