当前位置: 首页 > news >正文

ESP32小智-语音活动(VAD)检测流程

1、启动流程

        启动流程可以参考:ESP32唤醒流程-CSDN博客

Application::Start()->AudioService::Initialize()->AfeAudioProcessor::Initialize()

2、VAD配置

选择VADNet模型:

idf.py menuconfig
ESP Speech Recognition -> Select voice activity detection -> voice activity detection (vadnet1 medium).

常用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;    // 模式值越大,语音触发概率越高

如需临时启用/禁用/重置VADNet,可使用以下接口:

afe_handle->disable_vad(afe_data);  // 禁用VAD
afe_handle->enable_vad(afe_data);    // 启用VAD
afe_handle->reset_vad(afe_data);    // 重置VAD状态

3、VAD缓存与检测

通过AFE的fetch接口返回检测结果。

VAD配置中的两个特性可能导致语音首帧触发延迟:

  1. VAD算法固有延迟:VAD无法在首帧精准触发,可能有1-3帧延迟

  2. 防误触机制:需持续触发时间达到配置参数`vad_min_speech_ms`才会正式触发

为避免上述原因导致语音首字截断,AFE V2.0新增了VAD缓存机制。可通过检查vad_cache_size判断是否需要保存VAD缓存:

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");

ESP32代码AfeAudioProcessor::AudioProcessorTask():

        auto res = afe_iface_->fetch_with_delay(afe_data_, portMAX_DELAY);if ((xEventGroupGetBits(event_group_) & PROCESSOR_RUNNING) == 0) {continue;}if (res == nullptr || res->ret_value == ESP_FAIL) {if (res != nullptr) {ESP_LOGI(TAG, "Error code: %d", res->ret_value);}continue;}// VAD state changeif (vad_state_change_callback_) {if (res->vad_state == VAD_SPEECH && !is_speaking_) {is_speaking_ = true;vad_state_change_callback_(true);} else if (res->vad_state == VAD_SILENCE && is_speaking_) {is_speaking_ = false;vad_state_change_callback_(false);}}

http://www.dtcms.com/a/338080.html

相关文章:

  • Pytorch GPU版本安装保姆级教程
  • 【Python面试题】描述一次解决内存泄漏的过程。如何用tracemalloc或者objgraph定位问题?什么情况下会用__slots__?
  • 【领码课堂】AI写码不再“盲跑”,方案先行,自动化高效落地
  • BOSS直聘招聘端AI辅助自动化技术研究
  • 某储备土地前期开发项目控制保护区桥梁自动化监测
  • 8.19 note
  • HashMap:源码
  • OpenLayers 入门指南【七】:加载自定义控件
  • 部署耐达讯自动化Profibus转光纤方案,变频器通信从此告别‘掉线焦虑’!“
  • Next.js数据获取
  • 飞算JavaAI智慧文旅场景实践:从景区管理到游客服务的全链路系统搭建
  • 无人机激光测距技术应用与挑战
  • 【前端进阶】UI渲染优化 - 骨架屏技术详解与多框架实现方案
  • Maven(一)
  • 做一个答题pk小程序多少钱?
  • 《红色脉-络:一部PLMN在中国的演进史诗 (1G-6G)》 第6篇 | 专题:核心网的第一次革命——从电路交换到“用户/控制面分离”
  • java17学习笔记-增强型伪随机数生成器
  • LeetCode100-438找到字符串中所有的字母异位词
  • 上网行为管理之用户认证技术和应用控制技术
  • 开源im即时通讯软件开发社交系统全解析:安全可控、功能全面的社交解决方案
  • 具身智能3全身动力学控制软件包(人形机器人)摘自Openloong社区
  • N32G430C8-串口驱动问题
  • MATLAB的实用字母识别系统实现含GUI界面
  • 软件在线安装和离线安装
  • c/c++标准库
  • GISer大事件,保研考研竞赛时间线一览
  • Java中的128陷阱:深入解析Integer缓存机制及应对策略
  • 为什么体育应用离不开 API?数据接入基础指南
  • ae关键帧路径显示不完全怎么办
  • Linux 服务:RAID 级别解析与 mdadm 工具实操指南