概述
VAD 的核心任务是鉴别音频信号中的语音出现(speech presence)和语音消失(speech absence),也就是区分语音和非语音(或静音)部分。想象一下,在一个有背景噪音的环境中,VAD 就像一个智能“守门人”,它能准确识别什么时候有人在说话,什么时候是纯粹的环境噪音或沉默。
这项技术在许多场景中都扮演着关键角色:
- 语音编码和降噪:VAD 可以帮助系统只处理含有语音的部分,从而节省带宽、提高压缩效率,并有效降低背景噪音,提升语音通话质量。
- 自动语音识别 (ASR):在将语音转换为文本之前,VAD 可以移除音频中的静音部分,减少不必要的计算,提高识别的准确性和效率。
- 智能语音助手和机器人:在这些应用中,VAD 能够更准确地识别用户的语音指令,避免被环境噪音触发。
- 数据清洗和准备:对于训练神经网络等机器学习任务,VAD 可用于从大量的音频记录中提取出纯净的语音片段,去除静音,从而提高模型训练的质量。
作者述:由于时间和精力有限,如果大家有好用的开源VAD算法可以推荐给我,我帮你评测
工作原理
一个 VAD 系统通常包含两个主要部分:特征提取和语音/非语音判决。
-
特征提取 好的特征是 VAD 分类问题的关键,它们应该具备区分能力(让语音和噪声的分布分离度高)和噪声鲁棒性(在背景噪声下也能保持特征的区分能力)。常用的特征类型包括:
- 基于能量的特征:假设语音能量大于背景噪声能量。然而,当噪声较大时,这种方法区分能力会下降。
- 频域特征:通过短时傅里叶变换 (STFT) 将时域信号转换为频域信号。即使在低信噪比下,某些频带的长时包络也能区分语音和噪声。WebRTC VAD 就利用了这一思想,将频谱分成六个子带进行能量分析。
- 倒谱特征:例如,能量倒谱峰值可以确定语音信号的基频,MFCC (梅尔频率倒谱系数) 也可以作为特征。
- 谐波特征:语音的一个明显特征是包含基频及其多个谐波频率,即使在强噪声环境下也存在。
- 长时特征:语音是非稳态信号,其统计特性随时间变化;而大多数日常噪声是稳态或变化缓慢的。
-
判决准则 在提取特征后,需要一个判决机制来决定当前帧是语音还是非语音。主要有三类方法:
- 基于门限的方法:根据预先设定的门限值来判断。对于变化的噪声场景,需要使用自适应门限。
- 统计模型方法:这类方法源于似然比检验 (LRT),假设语音和背景噪声服从独立的高斯分布或其他分布(如拉普拉斯、伽马分布),通过计算信号是语音或噪声的概率来做出判决。WebRTC VAD 就采用了这一思想,使用高斯模型对噪声和语音的概率进行计算,并通过似然比检验进行判决。
- 机器学习方法:通过训练数据学习语音模型。这类方法的难点在于强噪声场景下训练数据集的准确标注。然而,近年来深度学习的发展,极大地提升了 VAD 的性能和适应性。
常见的 VAD 模型和工具包
目前有许多优秀的 VAD 模型和工具包可供选择,它们各有特点和应用场景:
Silero VAD
Silero VAD 是一种基于深度学习技术的轻量级语音活动检测模型,被描述为“企业级预训练模型”。
我的看法:还不错,但是对清辅音的识别稍微欠缺,日语轻声效果有点差
特点
- 轻量级:模型文件大小仅约 2.2MB。
- 速度快:在单 CPU 线程上处理一个音频块(30+ms)所需时间不到 1ms。
- 通用性强:在包含 6000 多种语言的庞大语料库上进行训练,对不同领域、不同背景噪声和质量的音频表现良好。
- silero支持非常丰富的参数调节,
安装: pip install silero
speech_timestamps = get_speech_timestamps(wav, model, sampling_rate=sr, threshold=0.5, min_speech_duration_ms=10, # 语音块的最小持续时间 ms, 语音超过这个最小时长才会被判为是语音 min_silence_duration_ms=140, # 语音块之间的最小静音时间 ms, 静音超过这个最小时长才会被判为静音 window_size_samples=512, # 窗长 51210241536 speech_pad_ms=0, # 往VAD时间戳左右padding (ms) )


FSMN-VAD (FunASR)
FSMN-VAD 是达摩院语音团队提出的高效语音端点检测模型,用于检测输入音频中有效语音的起止时间点信息,并将检测出来的有效音频片段输入识别引擎进行识别,减少无效语音带来的识别错误。
我的看法:检测是否有语音很准,但是由于是识别类的VAD,检测语音的时间戳会相对相对宽一点,FunASR唱歌也会检测为语音,但是silero不会
特点:
- 参数量:0.4M
- 训练数据:5000小时,普通话和英语

安装: pip3 install -U funasr
funasr也有很多配置参数,调参与不调参差别会非常大,下面标红的参数是重点调参对象,参数文件在:/home/xxx/.cache/modelscope/hub/models/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch
- sample_rate:采样率,输入音频的采样率(Hz),必须和模型训练时一致,常用 16000。
- frame_in_ms:帧移(ms),每一帧的间隔时间,比如 10ms 表示每 10ms 产生一帧特征。
- frame_in_ms:帧长(ms),每一帧特征的时间长度,比如 25ms 表示一帧包含 25ms 的音频数据。
- window_size_ms:分析窗口长度(ms),推理时,VAD 会基于一个滑动窗口来做判断,这个是窗口的时长。
- 起点/终点检测
- detect_mode: 检测模式 一般 0 或 1,不同模式对应不同的端点检测策略,1 通常更严格,0 更宽松。
- do_start_point_detection: 是否启用起点检测 True 表示检测语音开始位置。
- do_end_point_detection: 是否启用终点检测 True 表示检测语音结束位置。
- max_start_silence_time: 起点前允许的最大静音时间(ms) 如果静音超过这个时间,还没检测到语音,起点会被重置。0 表示不限制。我设置为0
- max_end_silence_time: 终点后允许的最大静音时间(ms) 超过该时间后会强制切断 segment,0 表示不限制。我设置为0
- lookback_time_start_point: 起点回溯时间(ms) 检测到语音后,向前回溯一段时间作为起点(防止起点切掉前几个字)。我设置为0
- lookahead_time_end_point: 终点提前时间(ms) 检测到静音后,可提前终止 segment(减少延迟)。我设置为0
- sil_to_speech_time_thres: 静音→语音判定时间(ms) 从静音状态切换为语音状态所需的连续触发时长。我设置为150
- speech_to_sil_time_thres: 语音→静音判定时间(ms) 从语音状态切换为静音状态所需的连续静音时长。我设置为150
- do_extend: 是否延长语音段 1 表示语音段会延长,避免截断尾音。
- 分段控制
- max_single_segment_time 单段最大时长(ms) 一段语音超过该时长会被强制切分。
- 噪声与能量门限
- snr_mode 信噪比模式 0 表示关闭基于 SNR 的判定,1 表示启用。
- snr_thres 信噪比阈值(dB) SNR 判定的门限,低于该值可能判为噪声。
- noise_frame_num_used_for_snr SNR 估计用的噪声帧数 用多少帧静音来计算噪声均值。
- decibel_thres 分贝阈值 低于该分贝的帧判为静音。
- speech_noise_thres 语音与噪声能量比阈值 控制噪声过滤的灵敏度。我设置为0.8
- speech_noise_thresh_low / speech_noise_thresh_high 双阈值 用于判定语音与噪声的上下限阈值,增加稳健性。
- speech_2_noise_ratio 语音/噪声比例 调节判定灵敏度,越大越严格。
- fe_prior_thres 特征能量先验阈值 小于该值的帧直接视为静音(特征域判定)。
- 模型类别映射
- silence_pdf_num 静音类别数 模型输出中静音类别的数量。
- sil_pdf_ids 静音类别 ID 列表 用于指定哪些类别属于静音,例如 [0] 表示类别 0 是静音。
- 输出选项
- output_frame_probs 是否输出帧级概率 True 会输出每一帧是语音的概率,用于调试或后处理。


WebRTC VAD
WebRTC VAD 是谷歌为 WebRTC 项目开发的 VAD 模块,WebRTC 是 Google 开源的实时通信框架,特别适用于实时性要求较高的语音通信场景。
WebRTC 的 VAD 实现属于 特征驱动 + 统计模型 的方案:
- 将音频分帧(如 10ms / 20ms / 30ms)
- 提取多个语音特征(短时能量、过零率、谱特征),将频谱分成 6 个子带(80Hz~4KHz)来计算能量特征。
- 短时能量:语音通常能量较大,静音或噪声能量较小。
- 过零率:语音(尤其是清音辅音)ZCR 较高,元音较低;纯噪声的 ZCR 往往更高。
- 谱质心:频谱的“重心位置”,反映频率分布的集中程度。清辅音(高频)谱质心较高,元音(低频)谱质心较低。
- 频带能量分布:WebRTC 会将语音分成多个频段,计算各段能量比例,用来区分人声与背景噪声的频谱特征。
- 谱斜率 / 倾斜度(Spectral Slope / Tilt):谱斜率 / 倾斜度(Spectral Slope / Tilt),元音低频强,高频弱;噪声则频谱较平坦。
- 平谱熵:平谱熵,语音的频谱分布较有结构,熵较低;噪声通常更随机,熵更高。
- 输入到已经训练好的高斯混合模型(GMM)中进行分类
- 输出是否包含语音的布尔值(True / False)
安装: pip install webrtcvad
该库py-webrtcvad 是一个 Python 封装库,支持四种激进模式 (0-3),检测敏感度与数值大小正相关
设定的 VAD 模式(Vad(0/1/2/3))实际上是改变了阈值:
0:宽松(漏检少,但容易误判噪声为语音)
3:严格(容忍度低,更容易漏掉低能量语音)


结论:稍微宽了一点
TEN VAD
TEN VAD 是 TEN Framework 生态系统中的一个高性能、低延迟、轻量级的实时语音活动检测(VAD)系统,专为企业级对话 AI 应用设计,旨在提供精准的帧级语音活动检测。
- 低延迟:TEN VAD 能迅速检测语音与非语音的切换,减少对话系统的响应延迟。
- 轻量级:TEN VAD 的计算复杂度和内存占用低于 Silero VAD,适合嵌入式和边缘设备使用。
- 跨平台支持:支持 Windows、macOS 和 Linux 平台,且提供 ONNX 格式模型,方便与 Python 等语言集成。
GitHub 仓库:https://github.com/TEN-framework/ten-vad

