Silero VAD 语音活动检测阈值与采样率选型指南
【免费下载链接】silero-vadSilero VAD: pre-trained enterprise-grade Voice Activity Detector项目地址: https://gitcode.com/GitHub_Trending/si/silero-vad
Silero VAD 是一个约 2MB 的预训练语音活动检测(VAD)模型:输入一段音频,它按 32ms 一个块输出 0~1 的概率值,告诉你哪段在"有人说话"。做语音助手、呼叫中心质检、ASR 前置切分时,这一步能替代整堆能量阈值 + 过零率的规则代码。
能量阈值失效的 3 个痛点场景
- 能量 + 过零率规则在真实环境撑不住:办公室开着电视,误触发率明显上升,开发者只能再叠一层信噪比估计和自适应阈值,调一周,误报仍压不到 5% 以下;换成地铁这类低信噪比环境,反向问题出现——人声被噪声吞掉直接漏检。
- 长录音喂 ASR 前必须切段:按固定时长切会把词切到两半;想按静音切,就得先有静音检测,自己写一遍恰好又绕回 VAD。
- 实时流帧长对不上推理:20ms 的帧太小没法直接过模型,自己维护有状态缓冲时,中途一换采样率,内部状态错位,后面全段的概率都不可信。
能力速览:2MB 模型、单块 1ms、8kHz 与 16kHz 全支持
| 项目 | 情况 |
|---|---|
| 模型体积 / 格式 | JIT 约 2MB;另有 ONNX(opset 15/16)跨平台可用 |
| 采样率 | 8kHz / 16kHz,16k 的整数倍(32k、48k)会自动降采样 |
| 单块推理 | 512 样本(32ms,16k 下)单 CPU 线程耗时 <1ms |
| 流式推理 | VADIterator带状态封装,批量大小或采样率变化时自动重置状态 |
| 语料覆盖 | 在 6000+ 语言的语音上训练,非英语场景不用另找模型 |
| 许可证 | MIT,无遥测、无 key、无注册 |
5 分钟跑通 get_silero_vad 与 get_speech_timestamps
pip install silero-vad装好依赖(read_audio 走 torchaudio,需要 soundfile 或 ffmpeg 后端;走 ONNX 则装 onnxruntime),直接上代码:
from silero_vad import load_silero_vad, read_audio, get_speech_timestamps model = load_silero_vad(onnx=True) # ONNX 版本,约 2MB wav = read_audio("tests/data/test.wav") # 读成 1D float 张量 tss = get_speech_timestamps( wav, model, sampling_rate=16000, return_seconds=True, # 直接返回秒,默认返回样本点索引 ) for t in tss: print(t["start"], t["end"]) # 每个说话片段的起止时间文件模式到这里就闭环了:读文件 → 拿到一段段时间戳列表,后面接 ASR、存储或质检都基于这份列表。
关键参数拆解:threshold 与静音时长的取舍
| 参数 | 默认值 | 调大 / 调小的实际影响 | 什么时候需要改 |
|---|---|---|---|
| threshold | 0.5 | 调大 → 误报变少,但轻声说话的头音被截掉;调小 → 噪声环境误报变多 | 自己的数据上出现音乐、电视背景误报,或轻声漏检 |
| min_speech_duration_ms | 250 | 调大 → "嗯""哦"这类短应答被整段丢弃;调小 → 敲击、爆音被当成语音 | 客服对话场景需要保留短回复 |
| min_silence_duration_ms | 100 | 调大 → 短停顿处两句不切开,切分点向后推迟同等时长;调小 → 一次换气把一句话拆成两段 | 实时交互里要更快判句尾 |
| sampling_rate | 16000 | 8k 带宽省一半但细节更少、精度略降;16k 精度更好 | 电话音频用 8k,录音 / 高质量用 16k,必须与实际音频一致 |
📌 官方文档说 0.5 对多数数据集够用,说白了这个结论是在官方评测集上得出的。重噪声环境直接拿 0.5 用,漏检和误报都会肉眼可见地偏,先用自己几百段音频过一遍 tuning/ 里的网格搜索再定。
接入路径:Python 里 512 样本块怎么喂
流式模式用VADIterator,麦克风或网络帧到了就喂,不用自己管缓冲和状态:
from silero_vad import VADIterator iterator = VADIterator(model, sampling_rate=16000) for chunk in mic_frames: # 你的麦克风 / 网络帧序列 iterator(chunk) # 返回新关闭的 (start, end) 段列表⚠️ 这里有个坑:16k 下每次必须恰好喂 512 个样本(32ms),8k 下是 256,长度不对直接抛 ValueError;上游帧长不整除时,要在自己的缓冲区里先攒够再喂。
语言侧 Python 是主力,C++、C#、Rust、Go、Java、Haskell 的示例都在 examples/ 目录,OpenVINO 转换脚本在 examples/openvino/,实时麦克风 + WebRTC 的完整演示在 examples/microphone_and_webRTC_integration/。
适用与不适用:VAD 的边界在哪
✅ 推荐场景:
- ASR 前置切段(电话 8k / 录音 16k)、呼叫中心质检、语音助手判句尾、离线批量数据清洗
- 在信噪比 >15dB 的办公环境,默认参数误报可控;换成重噪声环境,偏移会明显变大
别硬用的场景:
- 说话人分离:它只回答"有没有人说话",不回答"是谁" → 叠加 pyannote.audio 或声纹 embedding 模型
- 音乐 / 歌唱检测:音乐会被判成非语音或误判,换专用音乐检测模型
- 样本级边界精度:粒度是 32ms 一块,要毫秒级边界需要自己在后处理里再修
仓库索引:测试、示例与 tuning 工具在哪
- src/silero_vad/:模型加载(model.py)与 ONNX 状态机封装(utils_vad.py),上下文和状态逻辑都在这里
- tests/:test_basic.py,附带 wav / mp3 / opus 三种格式测试音频
- examples/:多语言示例,含 cpp、csharp、rust-example、go、java-example、haskell
- tuning/:阈值网格搜索 search_thresholds.py + config.yml + 示例数据集
- examples/microphone_and_webRTC_integration/:实时麦克风检测与 WebRTC 集成示例
【免费下载链接】silero-vadSilero VAD: pre-trained enterprise-grade Voice Activity Detector项目地址: https://gitcode.com/GitHub_Trending/si/silero-vad
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考