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

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

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),仅供参考
延伸阅读

更多相关文章

2026/9/25 3:12:42

技术博主暂停更新公告写作指南:从决策到复更的完整流程

如果你的项目日志停在了三个月前,仓库里还挂着几笔没合并的提交,私信里攒了二十几条"博主你还活着吗"——恭喜你,你在某个深夜打开编辑器,想写一篇暂停更新公告。写这篇东西之前,我在后台对着空白文档坐了半…

2026/9/25 3:12:42

打造 Claude Code 模板库:沉淀 AI 编程助手的高效工作流

如果你和我一样,几乎每天都在用 Claude Code 写代码、改 bug、做重构,那你一定经历过这种循环:新开一个项目,先花二十分钟把项目背景、技术栈、代码风格、常用命令一条条喂给 Claude Code;等它终于表现得像个熟悉项目的…

2026/9/25 3:57:44

网上订餐系统毕设实战:Spring Boot+Vue全栈开发与答辩指南

做毕设选这个题目,我先说个结论:网上订餐系统这个选题,放在Spring Boot Vue这套组合里,是当前性价比最高的方向之一。原因很简单,它不属于那种冷门小众的偏题,业务流程完整、角色划分清晰、技术栈主流&…

2026/9/25 3:57:44

高校选课系统开题答辩全攻略:从选题到防坑指南

开题答辩这件事,很多同学把它当成“走过场”——PPT念一遍,评委随便问两句,半小时就结束了。但等你真正站在讲台上,面对三位评委老师齐齐看向你的目光,才发现那些“随便问”的问题,每一条都踩在你的项目软肋…

2026/9/25 3:57:44

基于Spring Boot+Vue的数码产品对比平台:全栈开发与数据建模实战

二手手机怎么选才不会踩坑?笔记本标压和低压处理器到底差多少?这些问题的答案,本质上都指向同一个东西:可靠的参数数据与直观的横向对比。我最近用 Java、Spring Boot 和 Vue 落地了一个数码产品对比平台,正好把全栈开…

2026/9/25 3:57:44

Neo4j 5.26 Windows实战:安装配置、CSV导入与多跳查询

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 3:57:44

零代码API服务:从SQL到HTTP接口的原理、落地与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑