什么是 VAD , VAD 切分是怎么切分的

VAD 是 Voice Activity Detection,中文一般叫:

• 语音活动检测

• 或 端点检测

它的作用很简单:

从一段连续音频里,判断哪些地方是"人在说话",哪些地方是"静音 / 背景噪声 / 音乐 / 呼吸 / 环境音"。

一、VAD 是干什么的

比如一通电话原始音频是这样的:

• 前 2 秒:没人说话

• 第 3~6 秒:用户说话

• 第 7 秒:停顿

• 第 8~10 秒:继续说话

• 后面还有一些环境噪声

VAD 做的事情就是把里面真正有语音的部分找出来。

它不是识别内容,也不是识别说话人,它只回答一个问题:

这一小段时间里,有没有人在说话?

所以它通常是语音系统最前面的一层。

常见链路是:

原始音频 → VAD → ASR / 声纹 / 情绪识别 / 说话人分离

二、为什么一定要先做 VAD

因为原始电话流里有很多"无效音频":

• 静音

• 呼吸声

• 键盘声

• 背景噪音

• 音乐等待音

• 电流声

• 回声

如果不先切掉这些内容,会带来很多问题:

1)浪费算力

ASR、声纹、情绪识别都去处理整段音频,成本很高。

2)识别效果变差

静音和噪声会干扰后面的识别。

3)响应变慢

实时通话里,系统需要尽快知道"用户是不是说完了",不然机器人会抢话或者反应慢。

三、VAD 切分到底是怎么切的

VAD 一般不是一整段一下子判断,而是:

把连续音频按很小的时间窗口切成一帧一帧,再逐帧判断。

比如:

• 每 10ms 一帧

• 或每 20ms / 30ms 一帧

假设一段 3 秒音频,用 20ms 一帧来切:

• 3 秒 = 3000ms

• 3000 / 20 = 150 帧

系统会对这 150 帧逐个判断:

• 第 1 帧:没人说话

• 第 2 帧:没人说话

• ...

• 第 25 帧:开始有人声

• 第 26 帧:有人声

• ...

• 第 80 帧:没人声

然后把连续为"有声"的帧合并成一个语音段。

这就叫 VAD 切分。

四、VAD 通常依据什么来判断"有声"

传统方法和深度学习方法不太一样,但常见依据包括:

1)短时能量

人说话时,能量通常比静音高。

2)过零率

语音和某些噪声在波形变化上不同。

3)频谱特征

看频率分布是不是像人声。

4)周期性

浊音有明显的基频特征。

5)模型概率

现在很多 VAD 用神经网络,直接输出:

• 当前帧是语音的概率

• 当前帧是非语音的概率

比如:

• 帧 101:speech_prob = 0.92

• 帧 102:speech_prob = 0.89

• 帧 103:speech_prob = 0.18

系统再根据阈值判断:

• 大于 0.5 认为有语音

• 小于 0.5 认为无语音

五、VAD 切分不是"看到静音就立刻切断"

实际工程里不会这么生硬,否则会切得很碎。

因为真实说话里有很多自然停顿:

• "你好,那个......我想问一下......"

• "这个订单,嗯,什么时候发货?"

这些停顿很短,如果一检测到一点静音就切断,就会变成很多碎片。

所以 VAD 一般会加几个机制。

1)最小语音段长度

比如小于 200ms 的语音段直接丢弃,避免把咳嗽、杂音当成一句话。

2)最小静音时长

比如连续静音超过 500ms,才认为这句话结束。

这就意味着:

• 停顿 100ms,不切

• 停顿 200ms,不切

• 停顿 600ms,切一句

3)前后补边

为了避免把一句话开头或结尾切掉,通常会前后各补一点时间。

比如检测到用户从 3.20s 开始说话,系统可能实际切成:

• 起点:3.00s

• 终点:6.35s

这样能保住起止辅音,不容易丢字。

4)hangover 机制

这在电话场景很常见。

意思是:即使当前几帧突然变安静,系统也不马上判定"说完了",而是再等几十到几百毫秒,看看是不是只是短暂停顿。

这能减少"切半句"的问题。

六、一个具体例子

假设我们按 20ms 一帧切音频,规则是:

• speech_prob > 0.6 视为语音

• 连续静音超过 400ms 才结束一段

• 语音段前补 100ms,后补 200ms

某段电话帧判断结果像这样:

• 0.00s - 1.20s:静音

• 1.20s - 2.80s:语音

• 2.80s - 3.00s:短暂停顿

• 3.00s - 4.10s:语音

• 4.10s - 4.70s:静音

因为 2.80s 到 3.00s 只有 200ms 静音,没有超过 400ms,所以不切开。

最终会合并成一整段:

• 原始检测:1.20s - 4.10s

• 加补边后:1.10s - 4.30s

这就是一条送给 ASR 的语音片段。

七、VAD 在实时通话里是怎么工作的

在 AI 电话客服里,VAD 一般是流式工作的,不是等整段音频结束再切。

它会边接收音频边判断:

• 当前有没有人在说话

• 什么时候开始说

• 什么时候疑似说完

• 是继续等,还是把这一段送去 ASR

典型状态机像这样:

1)静音状态

等待用户开口。

2)检测到起讲

连续几帧概率很高,进入"说话中"。

3)说话中状态

持续缓存音频。

4)检测到尾静音

如果静音持续达到阈值,比如 500ms,判定一句结束。

5)输出片段

把这一段音频送到:

• ASR 转写

• 声纹识别

• 情绪识别

• 打断检测 / turn-taking

八、在电话客服里,VAD 切分常见有两种用途

1)离线切分

一整段录音拿来后处理,切出若干语音段。

适合:

• 通话质检

• 录音分析

• 情绪分析

• 会话复盘

2)实时切分

边说边检测,尽快找到一句话边界。

适合:

• 智能客服

• 智能外呼

• 实时机器人对话

• 语音助手

实时场景更关注:

• 延迟低

• 不要误切

• 不要漏掉开头结尾

• 能准确判断用户说完没

九、VAD 常见问题

1)为什么会把噪声当成人声

因为有些噪声和语音很像,比如:

• 电视声

• 回声

• 强背景人声

• 敲桌子

• 呼吸声

所以电话系统常常要配合:

• 降噪

• AEC 回声消除

• AGC 自动增益

• 热词/业务上下文

一起使用。

2)为什么一句话被切成很多段

通常是:

• 静音阈值设得太短

• 网络抖动

• 用户本来停顿就多

• 噪声导致概率忽高忽低

3)为什么总是晚一点才识别结束

因为系统故意会"多等一下",避免半句切断。

这就是刚才说的 hangover。

十、你可以这样理解

VAD 本质上就是给音频"划重点":

• 哪些部分值得送去识别

• 哪些部分可以忽略

• 一句话从哪开始,到哪结束

一句话总结:

bash 复制代码
VAD = 先从连续声音里找出"人真正开口说话的片段",再把这些片段交给后面的 ASR、声纹、情绪识别和 LLM。

如果放到 AI 电话客服里,一个完整顺序通常是:

bash 复制代码
SIP/PSTN 来电 → 实时音频流 → AEC/降噪 → VAD 切分 → ASR → 语义理解 → TTS 回复
相关推荐
美酒没故事°18 小时前
Open WebUI安装指南。搭建自己的自托管 AI 平台
人工智能·windows·ai
云烟成雨TD18 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
AI攻城狮18 小时前
用 Obsidian CLI + LLM 构建本地 RAG:让你的笔记真正「活」起来
人工智能·云原生·aigc
鸿乃江边鸟18 小时前
Nanobot 从onboard启动命令来看个人助理Agent的实现
人工智能·ai
lpfasd12318 小时前
基于Cloudflare生态的应用部署与开发全解
人工智能·agent·cloudflare
俞凡18 小时前
DevOps 2.0:智能体如何接管故障修复和基础设施维护
人工智能
comedate18 小时前
[OpenClaw] GLM 5 关于电影 - 人工智能 - 的思考
人工智能·电影评价
财迅通Ai18 小时前
6000万吨产能承压 卫星化学迎来战略窗口期
大数据·人工智能·物联网·卫星化学
liliangcsdn18 小时前
Agent Memory智能体记忆系统的示例分析
数据库·人工智能·全文检索
GISer_Jing18 小时前
Page-agent MCP结构
前端·人工智能