esp-sr VADNet 语音活动检测模型详解:AFE 集成配置、动态控制接口与首帧缓存机制 语音音频人工智能嵌入式物联网【免费下载链接】esp-srSpeech recognition项目地址https://gitcode.com/gh_mirrors/es/esp-sr点击查看免费下载本文围绕 esp-sr 仓库中的 VADNet 语音活动检测Voice Activity Detection模型展开讲解如何通过 menuconfig 选择 vadnet1_medium 模型、如何通过afe_config_t配置 VAD 关键参数、如何动态启用/禁用/重置 VAD以及 AFE V2.0 新增的 VAD 首帧缓存机制如何避免语音首字截断。读完后你可以在 ESP32-S3/P4/S31 等平台的项目中正确启用并调优神经网络 VAD并结合仓库中的测试应用完成检测效果验证。什么是 VADNetVADNet 是一个基于神经网络的语音活动检测模型专为低功耗嵌入式 MCU 设计。它解决的核心问题是在实时音频流中判断“当前帧是否包含人声”输出VAD_SPEECH/VAD_SILENCE二值状态供后续唤醒词检测、语音识别或录音触发等模块使用。从仓库文档的说明看VADNet 采用了与 WakeNet 相似的模型结构和数据处理流程更多实现细节可参考 WakeNet 文档。其训练数据规模约为5000 小时中文数据、5000 小时英文数据以及 5000 小时多语言数据。当前仓库内置的 VADNet 模型为vadnet1_medium模型资源位于 model/vadnet_model/vadnet1_medium/ 目录包含模型数据文件vadn1_data、索引文件vadn1_index以及模型信息文件_MODEL_INFO_内容标记为vadnet1_mediumv1_Speech_1_0.5_0.1。在代码侧模型通过名称前缀vadnet进行筛选宏ESP_VADN_PREFIX定义于 esp_vadn_models.h再由esp_vadn_handle_from_name()获取对应的模型操作接口。选择并启用 VADNet 模型VADNet 通过 ESP-IDF 的 menuconfig 进行选择。官方文档给出的操作路径为idf.py menuconfig # ESP Speech Recognition - Select voice activity detection - voice activity detection (vadnet1 medium).对应的配置项定义在 Kconfig.projbuild 中的SR_VADN_MODEL_LOADchoice 组Select voice activity detection提供两个选项选项配置宏说明voice activity detection (WebRTC)SR_VADN_WEBRTCWebRTC VAD默认选项voice activity detection (vadnet1 medium)SR_VADN_VADNET1_MEDIUMVADNet1 medium依赖IDF_TARGET_ESP32S3 / ESP32P4 / ESP32S31需要注意两点平台与默认值事实默认启用的是 WebRTC VAD 而非 VADNet若要使用神经网络 VAD 必须手动选择SR_VADN_VADNET1_MEDIUMvadnet1 medium 选项仅对 ESP32-S3、ESP32-P4、ESP32-S31 目标开放其他芯片只能使用 WebRTC VAD。这一“默认回退”行为在 AFE 配置结构中也有印证esp_afe_config.h 对vad_model_name字段的注释明确写道“If it is null, WebRTC VAD will be used.”即不指定 VAD 模型名时自动使用 WebRTC VAD。VADNet 的运行方式集成在 AFE 流水线中VADNet 当前集成在 音频前端处理模块AFE 中默认处于启用状态通过 AFE 的fetch接口返回检测结果。也就是说你不需要通常也不建议单独驱动 VADNet而是将其作为 AFE 流水线中的一级输入音频经 AEC/NS 等处理后VAD 级输出vad_state随每帧结果返回。性能测试文档中给出的典型 ESP32-S3 流水线即为|AEC(SR_LOW_COST)| - |VAD(vadnet1_medium)| - |WakeNet(wn9_hilexin,)|常用 VAD 参数配置官方文档给出的常用 VAD 参数配置如下afe_config-vad_init true // 是否在AFE流水线中初始化VAD默认启用 afe_config-vad_min_noise_ms 1000; // 噪声/静音段的最短持续时间毫秒 afe_config-vad_min_speech_ms 128; // 语音段的最短持续时间毫秒 afe_config-vad_delay_ms 128; // VAD首帧触发到语音首帧数据的延迟量 afe_config-vad_mode VAD_MODE_1; // 检测模式结合 esp_afe_config.h 中 VAD 参数区的完整定义各字段取值与含义如下表字段类型默认值含义与取值约束vad_initbool—是否在 AFE 流水线中初始化 VADvad_modevad_mode_t—取值VAD_MODE_0~VAD_MODE_4见下方模式说明vad_model_namechar *NULLVAD 模型名为NULL时使用 WebRTC VADvad_min_speech_msint128语音最短持续时间ms应大于 32 ms防误触机制依赖该参数vad_min_noise_msint1000噪声/静音最短持续时间ms应大于 64 msvad_delay_msint128VAD 首帧触发到语音首帧数据的延迟量头文件注释提示若发现 VAD 缓存未能覆盖全部语音请增大该值vad_mute_playbackboolfalse为 true 时检测期间播放静音vad_enable_channel_triggerboolfalse为 true 时由 VAD 选择触发通道号vad_energy_thresholdfloat—上报语音所需的最小平均帧能量dBFS仅当最近vad_min_speech_ms内能量达到阈值且VAD 模型同时触发时才上报语音。值越高对低电平噪声抑制越强但可能漏掉轻声语音创建后可用set_vad_energy_threshold运行时修改关于vad_mode的取值语义esp_vad.h 中定义如下typedef enum { VAD_MODE_0 0, // Normal VAD_MODE_1, // Aggressive VAD_MODE_2, // Very Aggressive VAD_MODE_3, // Very Very Aggressive VAD_MODE_4 // Very Very Very Aggressive } vad_mode_t;头文件对模式语义的注释是“A more aggressive (higher mode) VAD is more restrictive in reporting speech. So If you want trigger more speech, please select lower mode.”——即模式值越高越 Aggressive上报语音越保守、越严格。需要注意中文文档示例中的行内注释写作“模式值越大语音触发概率越高”与头文件注释方向相反工程实践中建议以 esp_vad.h 的定义为准并结合自身场景实测验证。运行时动态控制启用 / 禁用 / 重置 VAD除了静态配置AFE 接口提供了运行期临时切换 VAD 的能力文档给出的三个接口为afe_handle-disable_vad(afe_data); // 禁用VAD afe_handle-enable_vad(afe_data); // 启用VAD afe_handle-reset_vad(afe_data); // 重置VAD状态这三个函数指针在 AFE 接口结构体中均有声明见 esp_afe_sr_iface.h 的disable_vad/enable_vad/reset_vad成员。典型应用场景如在设备进入播放/免打扰状态时禁用 VAD 以节省算力在恢复监听时先reset_vad清掉历史触发状态再重新启用。如果脱离 AFE、直接以独立模型方式使用 VADNet其操作接口定义在 esp_vadn_iface.h 的esp_vadn_iface_t结构体中核心操作包括接口作用关键参数/返回值create按模型名与参数创建模型实例mode、channel_num、min_speech_ms、min_noise_ms返回模型句柄get_samp_chunksize/get_samp_rate查询每帧输入样本数16-bit 采样与采样率输入必须为 16 位有符号采样detect喂入一帧波形并返回 VAD 状态返回vad_state_tVAD_SPEECH/VAD_SILENCEdetect_mfcc喂入 MFCC 特征进行检测该路径下无法测量波形能量能量门限会被跳过set_det_threshold/get_det_threshold手动调整模型检测概率阈值取值范围 0.5 ~ 0.9999set_energy_threshold/get_energy_threshold设置能量门限抑制低电平误触发单位 dBFS取值 -100 ~ 0对min_speech_ms窗口内平均能量做门限get_energy获取某输入通道的平均帧能量原始 sample² 单位get_channel_state获取指定通道当前 VAD 状态通道索引从 0 开始clean/destroy清理全部状态 / 销毁模型对象—其中create的参数与 esp_vad.h 中vad_create_with_param()的语义一致采样率支持 32000/16000/8000 Hz帧长支持 10/20/30 ms默认 30 ms。vad_state_t的定义为VAD_SILENCE 0、VAD_SPEECH 1。VAD 缓存与检测消除首帧延迟理解 VAD 输出时序是正确接入的关键。文档指出有两个特性可能导致语音首帧触发延迟VAD 算法固有延迟VAD 无法在首帧精准触发可能有 1-3 帧延迟防误触机制需持续触发时间达到配置参数vad_min_speech_ms才会正式触发。两者叠加若直接把触发帧当作语音起点会导致语音首字被截断。为此 AFE V2.0 新增了VAD 缓存机制在正式触发之前AFE 会把可能包含语音起始的音频缓存在内部触发后通过vad_cache字段一次性吐出用户将其与后续帧拼接即可得到完整的语音头部。文档给出的用法示例afe_fetch_result_t* result afe_handle-fetch(afe_data); if (result-vad_cache_size 0) { printf(vad cache size: %d\n, result-vad_cache_size); fwrite(result-vad_cache, 1, result-vad_cache_size, fp); } printf(vad state: %s\n, res-vad_state VAD_SILENCE ? noise : speech);结合 esp_afe_sr_iface.h 中afe_fetch_result_t的结构体注释VAD 相关字段的含义为vad_cacheint16_t *VAD 缓存数据仅在vad_cache_size 0时有效用于补全被截断的语音起始音频vad_cache_sizeintvad_cache的字节数vad_state本帧的 VAD 状态取值即vad_state_t0 为 noise/silence1 为 speechdata_volumeVAD 输入的均方能量dBFS在 AGC 之前计算启用 VadNet 时统计窗口覆盖vad_min_speech_ms否则为一个 fetch 帧。实现上的对应关系可以这样理解vad_delay_ms默认 128 ms决定了 AFE 向前预缓存多长的音频如果实测发现缓存仍不足以覆盖语音开头即首字仍被截断按头文件注释增大vad_delay_ms即可。同时vad_min_speech_ms越小触发越快但误触风险越高vad_min_noise_ms则控制从 speech 回落到 silence 所需的最短噪声时长两者共同塑造了 VAD 的触发/回落曲线。测试应用验证 VADNet 的加载与检测仓库提供了完整的 VADNet 测试应用 test_apps/esp-sr-vadnet/可用于在自己硬件上复现验证。其 sdkconfig.defaults 中直接写入了CONFIG_SR_VADN_VADNET1_MEDIUMy即默认加载 vadnet1_medium 模型。核心测试逻辑在 test_vadnet.cpp包含两个用例vadnet create/destroy API memory leak循环执行esp_srmodel_init→esp_srmodel_filter(models, ESP_VADN_PREFIX, NULL)→esp_vadn_handle_from_name()→create/destroy共 7 次断言内存泄漏小于 1000 字节且销毁后堆水位复原验证模型反复加载/卸载的稳定性vadnet detect API cpu loading将“Hi,乐鑫”语音样本按get_samp_chunksize()返回的帧长逐帧喂给detect()统计VAD_SPEECH帧数并计算单核 CPU 占用断言 CPU 占用低于 50% 且检测到语音帧数大于 35。从测试代码还能看到独立的模型加载调用链esp_srmodel_init(model)扫描模型分区 →esp_srmodel_filter按前缀vadnet过滤出模型名 →esp_vadn_handle_from_name拿到esp_vadn_iface_t操作表这与 AFE 内部选择 VAD 模型的机制一致。资源占用与延伸阅读关于 vadnet1_medium 在 AFE 各配置LOW_COST/HIGH_PERF、单麦/多麦等下的 RAM/PSRAM 与 Feed/Fetch CPU 占用请参考 性能测试文档其中给出了包含VAD(vadnet1_medium)级在内的完整流水线资源数据。进一步阅读路径WakeNet 唤醒词引擎文档VADNet 与其共享模型结构与数据处理流程音频前端处理AFE文档VADNet 的运行宿主feed/fetch接口与流水线编排Kconfig.projbuild 中SR_VADN_MODEL_LOAD选项VAD 模型的构建期选择入口。需要牢记的前提是VADNetvadnet1_medium仅在 ESP32-S3、ESP32-P4、ESP32-S31 上可用且默认不启用其余平台或未指定vad_model_name时AFE 流水线中的 VAD 级由 WebRTC VAD 承担。赞分享语音音频人工智能嵌入式物联网【免费下载链接】esp-srSpeech recognition项目地址https://gitcode.com/gh_mirrors/es/esp-sr点击查看免费下载相关推荐esp-sr VADNet 语音活动检测模型实战指南AFE 集成、参数调优与 VAD 缓存机制esp sr VADNet 语音活动检测模型实战指南AFE 集成、参数调优与 VAD 缓存机制 VADNet 是乐鑫 esp sr 语音识别仓库中基于神经网络语音音频人工智能嵌入式物联网ESP-SR WakeNet 语音唤醒引擎详解架构、模型选型与 AFE 集成实战ESP SR WakeNet 语音唤醒引擎详解架构、模型选型与 AFE 集成实战 本指南基于 ESP SR 仓库的 WakeNet 文档 https://li语音音频人工智能嵌入式物联网esp-sr 唤醒词引擎 WakeNet 实战指南模型体系、AFE 集成与唤醒词定制全流程esp sr 唤醒词引擎 WakeNet 实战指南模型体系、AFE 集成与唤醒词定制全流程 本篇技术指南以 ESP SR 开源仓库中的 WakeNet 唤醒词语音音频人工智能嵌入式物联网创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考