尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

TEN Framework 实战:webrtc_vad_cpp 扩展实现低延迟语音活动检测(VAD)

发布时间:2026/9/25 3:12:44

资讯中心
01
ARTICLE

TEN Framework 实战:webrtc_vad_cpp 扩展实现低延迟语音活动检测(VAD)

TEN Framework 实战:webrtc_vad_cpp 扩展实现低延迟语音活动检测(VAD)
人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载本文基于 TEN Framework 官方扩展文档 README.ko-KR.md 及对应源码系统讲解webrtc_vad_cpp扩展的完整用法如何基于 WebRTC VAD 算法在 C 扩展中实现实时语音活动检测包括 VAD 模式0-3的选型与property.json配置、支持的采样率/帧长组合、输入输出消息协议、TEN 应用图graph节点配置示例并深入源码说明初始化流程、多通道处理与非法帧的容错逻辑帮助你把该扩展直接接入语音助手类应用的音频流水线中。扩展定位与整体设计webrtc_vad_cpp是 TEN Framework 提供的 C 语音活动检测Voice Activity Detection扩展用于判断一段音频帧中是否存在人声。在 TEN 的图模型中该扩展作为一个 extension 节点接收上游音频帧逐帧做 VAD 判决再把判决结果与原始帧一起向下游传递——这使它特别适合做打断检测barge-in、静音剪除、ASR 送流门控等场景。从源码结构看整个扩展的核心实现只有一个类webrtc_vad_extension_t它继承自ten::extension_t重写了三个关键回调on_init解析 property 配置并创建/初始化 WebRTC VAD 实例on_audio_frame逐帧执行 VAD 判决并转发结果on_deinit释放 VAD 实例保证资源回收。扩展最终通过TEN_CPP_REGISTER_ADDON_AS_EXTENSION宏向运行时注册见 main.cc。WebRTC VAD 算法本体以 C 源码形式内嵌在 third_party/webrtc_vad提取自 WebRTC 项目、供独立使用由 BUILD.gn 中与src/main.cc一起编译进扩展因此该扩展没有额外的二进制依赖仅需 C11 及以上编译器即可构建。支持的采样率与帧长文档明确该扩展支持 8kHz、16kHz、32kHz、48kHz 采样率与 10ms、20ms、30ms 帧长且要求 16 位采样每样本 2 字节。这一约束的直接来源是 WebRTC VAD 算法侧的合法性校验函数 WebRtcVad_ValidRateAndFrameLength其支持的合法组合为采样率 (Hz)允许的每通道样本数10ms / 20ms / 30ms800080 / 160 / 24016000160 / 320 / 48032000320 / 640 / 96048000480 / 960 / 1440扩展在逐帧处理前会先调用该校验若采样率与帧长组合不合法直接丢弃该帧并打印警告不会把非法数据送入判决流程见 main.cc。VAD 模式mode 0-3灵敏度与误判率的权衡扩展支持 4 个灵敏度档位通过mode属性配置模式 0质量优先——最保守误报率低但可能出现漏检漏掉部分真实语音模式 1低攻击性——均衡模式模式 2中等攻击性——默认模式推荐用于大多数场景模式 3高攻击性——最激进检出率高但误报随之增加。这一语义与底层 WebRTC VAD 的接口注释一致模式越高VAD 返回“语音”时其确实为语音的概率越高代价是漏检率上升见 webrtc_vad.h。实现侧的健壮性处理值得注意在 on_init 中扩展通过ten_env.get_property_int32(mode)读取配置若取值不在 0-3 区间会记录错误日志并回退到默认模式 2WebRtcVad_Create、WebRtcVad_Init、WebRtcVad_set_mode任何一步失败都会释放资源、记录日志并正常走完初始化流程ten_env.on_init_done()而不会让节点初始化挂死。此时如果仍有音频帧到达扩展会逐帧打印警告并丢弃见 main.cc。配置说明在扩展的property.json中通过mode字段设置 VAD 模式{ mode: 2 }仓库中的实际默认配置见 property.json其_ten段声明了包的类型extension与名称webrtc_vad_cpp业务属性仅mode一项默认值 2。同时 manifest.json 的api.property段也声明了该属性为int32类型意味着 TEN 的工具链会对配置值做类型层面的校验。输入/输出接口输入扩展接收audio_frame音频帧要求采样率8000、16000、32000 或 48000 Hz位深16 位每样本 2 字节帧长10ms、20ms 或 30ms声道支持单声道与多声道多声道时仅取第一声道参与判决。其中“仅取第一声道”并非文档层面的口头约定而是有明确实现在 on_audio_frame 中若number_of_channels 1扩展按交错布局interleaved逐样本抽取第 0 声道构造一份单声道副本再送入 VAD。此外若帧的bytes_per_sample ! 2扩展会告警并丢弃该帧VAD 算法只接受int16_t采样。输出文档描述的输出包含两部分VAD 结果is_speechbooltrue 为检测到语音false 为静音/噪声、frame_namestring对应原始音频帧名、timestampint64时间戳音频帧将原始音频帧继续向下游传递供后续节点如 ASR处理。从源码看具体落地方式是“属性附着 帧转发”扩展把is_speech与frame_name直接写进该音频帧的 propertymain.cc然后通过ten_env.send_audio_frame把携带了 VAD 判决的原始帧整体转发到下游帧自身携带的 timestamp 随帧一并传递而不是单独的判决消息。这与 manifest.json 的 API 声明一致audio_frame_in与audio_frame_out均声明为pcm_frame输出帧上附加is_speechbool与frame_namestring两个属性。在 TEN 应用图中使用在 TEN 应用的 graph 配置中该扩展作为一个 extension 节点声明如下完整示例继承自原文档{ nodes: [ { type: extension, name: webrtc_vad, addon: webrtc_vad_cpp, property: { mode: 2 } } ] }典型用法是把它放在麦克风/音频读取节点与 ASR 节点之间上游每产出一个 PCM 帧本节点就给出一个is_speech判决下游据此决定是否把帧送入识别后端或在语音助手中作为用户打断barge-in的信号来源。实现细节一帧音频的完整处理链路on_audio_frame回调main.cc体现了该扩展低延迟、低资源消耗的设计取向——没有额外的线程或队列一次同步调用完成判决取帧元信息读取帧名、采样率、每样本字节数、每通道样本数、声道数并打 DEBUG 级日志锁定缓冲通过frame-lock_buf()取得只读音频数据句柄遵循 TEN 消息的加锁/解锁协议lock_buf/unlock_buf位深校验非 16 位帧直接解锁并丢弃声道归一多声道帧抽取第一声道合法性校验WebRtcVad_ValidRateAndFrameLength校验采样率/帧长组合判决WebRtcVad_Process返回 1语音/ 0非语音/ -1错误解锁并输出解锁缓冲后若判决错误-1仅记录日志否则写入is_speech、frame_name属性并send_audio_frame转发。整个路径上所有异常分支未初始化、非法位深、非法采样率/帧长、判决错误都不会中断扩展运行而是“记日志 丢帧”的降级策略这对长时运行的实时语音链路尤为重要。测试验证方式仓库自带一个基于 googletest 的端到端测试 tests/basic.cc展示了该扩展的推荐验证方法构造 16kHz、20ms 帧长的合成音频序列10 帧静音低幅噪声→ 20 帧语音440Hz 正弦波幅度 3000→ 10 帧静音共 40 帧依次送入扩展测试端在on_audio_frame回调中读取每个输出帧的is_speech属性并收集on_data回调已不再使用注释中明确说明 VAD 结果现在位于 audio_frame 属性上校验逻辑语音段的检出数至少 50%EXPECT_GE(speech_count_speech, 10)两段静音的误报总和不超过 10 次既验证了检出能力又限制了误报水平。测试运行入口声明在 manifest.json 的scripts.test字段bin/webrtc_vad_cpp_test开发环境依赖声明为googletest 1.7.0-rc2见 manifest.json。快速开始与前提条件安装与运行前提继承自原文档TEN Framework 0.11.30 及以上版本当前仓库中该扩展的 manifest 版本为 0.11.73依赖系统包ten_runtime0.11.73见 manifest.json支持 C11 及以上的 C 编译器。安装方式遵循 TEN Framework 官方包安装流程通过 tman 包管理器安装/更新该扩展包即可具体以 TEN Framework 的包安装指南为准。构建侧BUILD.gn 以ten_package规则声明该包package_kind为extension编译源仅src/main.cc与third_party/webrtc_vad/webrtc_vad.c两个文件依赖//core/src/ten_runtime与//third_party/nlohmann_json打包时会把src、third_party、tests、docs及manifest.json、property.json等一并打入扩展产物。小结webrtc_vad_cpp用约 160 行 C 代码把 WebRTC VAD 算法封装成了一个即插即用的 TEN 扩展配置面只有一个mode整数0-3默认 2协议面是“输入 PCM 帧、输出带is_speech属性的 PCM 帧”实现面覆盖了位深/采样率/帧长校验、多通道归一与全链路异常降级。若你正在基于 TEN Framework 构建实时语音交互应用它是把 VAD 接入音频图时最轻量、最易排查的起点需要更强效果时仓库中其他示例扩展如 vosk_asr_cpp 等可作为同图下游的组合参考。该包作为 TEN Framework 项目的一部分遵循 Apache License 2.0 许可见 LICENSE。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐TEN Framework 语音活动检测实战webrtc_vad_cpp C 扩展详解TEN Framework 语音活动检测实战webrtc_vad_cpp C 扩展详解 TEN Framework 面向会话式语音 AI Agent 场景人工智能AI Agent多模态语音AI 应用TEN Framework 实时语音助手实战集成 TEN VAD 语音活动检测的完整指南TEN Framework 实时语音助手实战集成 TEN VAD 语音活动检测的完整指南 本篇指南以 TEN Framework 仓库中的 voice ass人工智能AI Agent多模态语音AI 应用ten_vad_python 扩展详解在 TEN Framework 中实现流式语音活动检测VAD与句子边界事件ten_vad_python 扩展详解在 TEN Framework 中实现流式语音活动检测VAD与句子边界事件 导读 ten_vad_python 是人工智能AI Agent多模态语音AI 应用上一篇弹幕系统全攻略在MoonTVPlus中自定义你的观影互动体验下一篇Penumbra Color Theme安装教程从VS Code到终端的快速配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。