Silero VAD 语音活动检测:1分钟跑通,阈值怎么选?
【免费下载链接】silero-vadSilero VAD: pre-trained enterprise-grade Voice Activity Detector项目地址: https://gitcode.com/GitHub_Trending/si/silero-vad
Silero VAD 是一个开源的语音活动检测模型,它只回答一个问题:音频的哪些时间段里有人说话。手头有几百小时录音要先切掉静音段再送识别,或者想在实时音频流里人一开口就触发下一步逻辑,它都能干。模型基于 MIT 协议发布,无注册、无密钥、无遥测,拿过来就能用。
🚀 语音检测安装:一条命令跑通
环境要求不高:Python 3.8+、1GB 以上内存、带 AVX 指令集的 CPU 即可。
pip install silero-vad最短可运行代码,输入一个 wav 文件,输出语音片段的起止时间:
from silero_vad import load_silero_vad, read_audio, get_speech_timestamps model = load_silero_vad() wav = read_audio('tests/data/test.wav') segments = get_speech_timestamps(wav, model, return_seconds=True) print(segments) # [{'start': 0.32, 'end': 1.87}, ...]segments就是一组{'start', 'end'}字典,单位是秒(默认是采样点,加上return_seconds=True才换成秒)。
📦 批量检测文件里的语音片段
模型按固定窗口吃音频:16kHz 下每次 512 个点(32ms),8kHz 下 256 个点。它同时支持8000 Hz 和 16000 Hz两种采样率——电话录音大多是 8k,麦克风录音大多是 16k,按源头的真实采样率传sampling_rate参数即可。整包模型约 2MB,单帧推理在 CPU 上不到 1ms,几百小时的批量任务跑一晚上绰绰有余。
真正影响结果的是这几个参数。默认值(threshold=0.5、min_speech_duration_ms=250、speech_pad_ms=30)在多数场景够用,按下面的表微调:
| 适用场景 | threshold | min_speech_duration_ms | speech_pad_ms | 补充 |
|---|---|---|---|---|
| 通用默认 | 0.5 | 250 | 30 | 不调整 |
| 嘈杂环境,怕漏检 | 0.3~0.4 | 250 | 50 | 多垫一点语音边界 |
| 安静环境,怕误报 | 0.6~0.7 | 250 | 30 | 阈值拉高 |
| 长录音切给 ASR | 0.5 | 250 | 30 | 另设max_speech_duration_s=15防超长片段 |
threshold是语音概率的判定线;min_speech_duration_ms以下的片段直接丢弃;speech_pad_ms给每个片段两侧加 padding,避免切掉字头字尾。如果默认参数在你的数据上始终不对劲,仓库里 tuning/ 目录提供了阈值搜索脚本search_thresholds.py和针对自有数据微调的tune.py。
🎙️ 实时语音检测:按流式喂数据
流式场景不要用get_speech_timestamps整段跑,换成VADIterator。它内部维护模型状态,每来一小块音频就推一次,检测到语音开始/结束时返回事件:
from silero_vad import VADIterator vad = VADIterator(model, sampling_rate=16000) for chunk in audio_stream(chunk_samples=512): # 每次取 512 个采样点(16k) event = vad(chunk, return_seconds=True) if event: print(event) # {'start': 1.2} 或 {'end': 3.8}拿到start时开启录音或唤醒后续流程,拿到end时切段送识别。完整麦克风接法可以对照 examples/pyaudio-streaming/ 里的 PyAudio 示例。
⚙️ 生产环境切到 ONNX 部署
Python 里只需改一行加载方式,后续 API 完全一样:
model = load_silero_vad(onnx=True, opset_version=16)模型文件都在 src/silero_vad/data/ 目录下,随包分发:
silero_vad.onnx:opset 16 版本silero_vad_16k_op15.onnx:兼容 opset 15 的旧版 onnxruntime(仅 16k)silero_vad_half.onnx:半精度,更小更快,但只支持 16k
ONNX 后端跑在 onnxruntime 上,不依赖 PyTorch,条件允许时比 JIT 版本还快。C++、Go、Rust 等语言没有 Python 包,思路都一样:直接把这些 onnx 文件交给对应语言的 ONNX Runtime 推理,examples/cpp/ 里有一份完整 C++ 参考实现。
💣 高频坑
现象:read_audio报缺依赖错误。原因:它底层走 torchaudio 的 I/O,需要 FFmpeg、sox 或 soundfile 中至少一个后端。解决:pip install soundfile是最省事的选择;同时确认torch>=1.12.0、torchaudio>=0.12.0已安装。
现象:44.1kHz 或 48kHz 音频检测结果不对。原因:模型只接受 8000、16000(或 16000 的整数倍),不会自动重采样。解决:喂入前自己重采样到 16k 再传sampling_rate=16000。
现象:流式模式下end事件总要拖很久才出现,甚至不出现。原因:模型需要确认一段"安静窗口"才判定语音结束,流结束时状态还悬在半空。解决:音频结束后补喂若干全零块,直到事件吐出或调用vad.reset_states()。
下一步选什么
- 想搞懂原理:从 tests/test_basic.py 读起,再看
src/silero_vad/utils_vad.py里get_speech_timestamps的滑窗逻辑,代码量不大。 - 要上生产:Python 用 ONNX 后端;呼叫中心 8k 音频记得核对
sampling_rate;自有领域数据噪声明显不同,再用 tuning/ 做阈值搜索或微调。 - 要嵌进非 Python 系统:直接抄 examples/cpp/ 的 ONNX Runtime 写法,同一套 onnx 文件 C++、Go、Rust、Java、C# 示例都有。
【免费下载链接】silero-vadSilero VAD: pre-trained enterprise-grade Voice Activity Detector项目地址: https://gitcode.com/GitHub_Trending/si/silero-vad
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考