什么是 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 回复
相关推荐
墨染天姬1 小时前
【AI】linux-windows即将消亡,未来模型即系统
linux·人工智能·windows
undsky_3 小时前
【n8n教程】:Luxon日期时间处理,打造智能时间自动化工作流
人工智能·ai·aigc·ai编程
Surmon3 小时前
基于 Cloudflare 生态的 AI Agent 实现
前端·人工智能·架构
冷小鱼9 小时前
pgvector 向量数据库完全指南:PostgreSQL 生态的 AI 增强
数据库·人工智能·postgresql
陈天伟教授9 小时前
人工智能应用- 天文学家的助手:08. 星系定位与分类
前端·javascript·数据库·人工智能·机器学习
啵啵鱼爱吃小猫咪9 小时前
机械臂阻抗控制github项目-mujoco仿真
开发语言·人工智能·python·机器人
放下华子我只抽RuiKe59 小时前
算法的试金石:模型训练、评估与调优的艺术
人工智能·深度学习·算法·机器学习·自然语言处理·数据挖掘·线性回归
songyuc9 小时前
【PyTorch】感觉`CrossEntropyLoss`和`BCELoss`很类似,为什么它们接收labels的shape常常不一样呢?
人工智能·pytorch·python
renhongxia110 小时前
如何对海洋系统进行知识图谱构建?
人工智能·学习·语言模型·自然语言处理·自动化·知识图谱