Python 语音活动检测(VAD):检测语音、去静音、按停顿切分音频
语音活动检测(VAD,Voice Activity Detection)是音频处理的基础一环:从一段录音里找出"哪里有人在说话、哪里是静音/噪声"。它是几乎所有语音流程的第一步——去掉静音省算力、把长录音按停顿切成小段、给下游 ASR 做预处理(包括给 Whisper 喂干净音频以省钱、防它在静音处胡乱"幻觉"出文字)。
FunASR 的 fsmn-vad 是一个工业级、轻量、极快的开源 VAD 模型,3 行 Python 就能用,返回每段语音的起止毫秒。下面全部是真实实测输出。
3 行代码做 VAD
pip install funasr from funasr import AutoModel model = AutoModel(model="fsmn-vad", disable_update=True) segments = model.generate(input="audio.wav")[0]["value"] print(segments) # [[610, 5530]] # 单位:毫秒 —— 语音从 0.61s 到 5.53s,开头 610ms 静音被自动剔除
返回值是 [[start_ms, end_ms], ...] 的列表,每个区间是一段连续语音。上例里一段 5.55s 的录音,开头的 0.61s 静音被自动去掉了。
真实示例:13 秒录音切成 2 段
把两段话中间插 1.5s 停顿拼成一段 13.31s 的录音(模拟真实带停顿的录音),VAD 的真实输出:
| 语音段 | 起止 | 时长 |
|---|---|---|
| seg0 | 0.61s → 5.45s | 4.84s |
| seg1 | 7.28s → 13.29s | 6.01s |
VAD 准确切出两段语音、把中间 1.5s 的停顿(5.45s~7.28s)和开头静音都识别为非语音。整段 13.31s 里语音占 82%,剔除了 18% 的静音。这一步在 GPU 上只花了 0.12 秒(约 110× 实时)——VAD 本身极轻,几乎不增加流程开销。
三个实用场景
1. 去静音 / 只保留语音
import soundfile as sf
import numpy as np
audio, sr = sf.read("audio.wav")
segments = model.generate(input="audio.wav")[0]["value"]
# 拼接所有语音段,丢弃静音
speech = np.concatenate([audio[int(s/1000*sr):int(e/1000*sr)] for s, e in segments])
sf.write("speech_only.wav", speech, sr)
2. 按停顿把长录音切成多个文件(便于批量识别)
for i, (s, e) in enumerate(segments):
chunk = audio[int(s/1000*sr):int(e/1000*sr)]
sf.write(f"chunk_{i}.wav", chunk, sr)
# chunk_0.wav, chunk_1.wav, ... 每个文件是一段独立语音
3. 给任何 ASR(含 Whisper)做预处理
在跑识别之前先做 VAD,有两个实打实的好处:① 不把静音/噪声送进模型 = 省算力、降成本;② Whisper 在长静音处容易"幻觉"出重复文字,先用 VAD 切掉静音能显著减少幻觉。FunASR 的 ASR 模型(SenseVoice / Paraformer)更是可以直接 vad_model="fsmn-vad" 一行接上,内部自动分段。
from funasr import AutoModel # ASR 直接挂载 VAD,长音频自动分段识别 asr = AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad") result = asr.generate(input="long_audio.wav")
为什么用 fsmn-vad
| fsmn-vad(FunASR) | |
|---|---|
| 用法 | 3 行 Python,返回毫秒级语音区间 |
| 速度 | 实测 13s 音频 0.12s(约 110× 实时) |
| 体量 | 轻量 FSMN 结构,CPU 也能实时跑 |
| 生态 | 可独立用,也能一行挂到 FunASR 的 ASR 上自动分段 |
| 许可证 | 开源,可商用 |
如果你已经在用 FunASR 做识别,VAD 是同一套工具、零额外依赖;如果你在用 Whisper 或别的 ASR,也可以把 fsmn-vad 当成独立的预处理器。想看完整的语音流程,可参考 转写超长音频 和 说话人分离。
FunASR 全家桶都是开源的——fsmn-vad、工业级 ASR、标点、说话人、情感事件、LLM-ASR,拿来即用。觉得有用就点个 Star 支持一下 👇
也欢迎 Star:SenseVoice · Fun-ASR · FunClip
相关文章
- FunASR vs Whisper 实测对比
- SenseVoice 部署指南
- Fun-ASR-Nano 使用指南
- 说话人分离:谁在何时说话
- 情感与语种检测
- 实时流式语音识别
- 转写超长音频(1小时一次搞定)
- 命令行转写(文本/JSON/SRT)
- 自托管 OpenAI Whisper API 替代
- 自动生成字幕(SRT / VTT)
- Python 语音转文字教程
- FunASR 跑进 llama.cpp(whisper.cpp 替代)
- FunASR vs faster-whisper(中文/粤语)
- 轻量语音识别(CPU 250MB)
- 自托管替代 Deepgram/AssemblyAI
- 选哪个 FunASR 模型
- 粤语语音识别(SenseVoice 原生粤语)
- 日语语音识别(SenseVoice 转写+标点+情感)