After using VAD, the start and end times of the recognized segments are incorrect

该问题通常出现在 Faster Whisper 启用 vad_filter=True 后,识别片段的 end 被错误对齐到下一段的 start ,即段边界“越界”到 VAD chunk 中真实语音结束点之后。优先排查是否为已知的 VAD 时间戳还原 bug,并确认是否可升级到修复版本。

快速结论:该问题通常出现在 Faster Whisper 启用 vad_filter=True 后,识别片段的 end 被错误对齐到下一段的 start,即段边界“越界”到 VAD chunk 中真实语音结束点之后。优先排查是否为已知的 VAD 时间戳还原 bug,并确认是否可升级到修复版本。

适用环境:Issue 中用户使用 WhisperModel 本地加载 large-v3,device="cuda",local_files_only=True,语音为中文,vad_filter=True 且 vad_parameters=dict(min_silence_duration_ms=1000);其余 Python、CUDA、PyTorch、驱动版本未提供。

最快修复方案:Issue 后续提到已提交 #1676 修复:restore_speech_timestamps 会将还原后的片段边界限制在 VAD chunk 的语音区间内(SpeechTimestampsMap.get_chunk_speech_bounds),使片段 end 不再越过真实语音结束点、延伸到下一 chunk 的 start。因此可优先尝试升级到包含该 PR 的 Faster Whisper 版本。

注意事项:该修复只调整 VAD 还原片段边界,Issue 中明确说明“Word-level timestamps are untouched”;Faster Whisper 本身的 Whisper 段级时间戳精度有限,若需要更精确时间,维护者建议启用词级时间戳或使用强制对齐。此外,PR #1676 的验证以单元测试为主,Issue 中未附真实音频复现,实际效果可能因音频与参数不同而有差异。

问题场景

用户使用 Faster Whisper 对音频做转写并生成字幕,开启 vad_filter=True 后,发现 segments 中的 start 和 end 时间不正确。未启用 VAD 时,start/end 与音频中对话时间接近或准确对应;启用 VAD 后,前一段的 end 不再等于语音真正结束的时间,而是等于下一段的 start。用户还单独使用 Silero VAD 对同一音频验证,结果显示 Silero VAD 自身给出的起止时间接近音频中真实语音出现的时间点。

报错原文

After using VAD, the start and end times of the recognized segments are incorrect

Before using VAD:
segment1.start=00:02:45.111
segment1.end=00:02:46.333
segment1.text=AAAAAAA

segment2.start=00:02:51.222
segment2.end=00:02:59.444
segment2.text=BBBBBB

After using VAD:
segment1.start=00:02:45.111
segment1.end=00:02:51.222
segment1.text=AAAAAAA

segment2.start=00:02:51.222
segment2.end=00:02:59.444
segment2.text=BBBBBB

原因分析

可能原因是 Faster Whisper 在启用 vad_filter 后,对 VAD 切分后的音频做转写,再把转写片段的时间戳从“已去除静音的音频”映射回原始音频时,restore_speech_timestamps 的片段边界还原不够严格:当某一段的语音结束点被模型估计在静音区间之后,还原后的 end 可能越过该 VAD chunk 的真实语音结束点,一直延伸到下一个 chunk 的 start,从而出现“前一段 end 等于下一段 start”的现象。

Issue 中维护者也指出:这并不完全是 VAD 的问题,Whisper 本身段级时间戳就不精确;但后续 PR #1676 确实针对“还原片段越界”这一具体行为做了修复,说明该时间戳还原逻辑存在可修正的边界处理缺陷。

环境排查

  • 确认 Faster Whisper 版本是否已包含 PR #1676 的修复;若不确定,可先记录当前版本再升级测试。
  • 确认是否启用了 vad_filter=True,以及 vad_parameters 中是否设置了 min_silence_duration_ms 等参数。
  • 确认模型路径、device(如 cuda)、local_files_only 等调用参数是否与问题复现时一致。
  • 确认是否使用了词级时间戳(word timestamps);Issue 中说明该修复不影响词级时间戳。
  • 若仍无法复现或判断,可准备一段可复现的音频,Issue 中维护者曾询问是否可提供音频复现,最好附英文音频便于排查。
  • Python、CUDA、PyTorch、显卡驱动、cuDNN 等版本 Issue 未提供,需按自身环境单独确认。

解决步骤

  1. 先确认当前问题是否只在 vad_filter=True 时出现:用同一音频分别跑一次开启和关闭 VAD 的转写,对比 segment.start 与 segment.end。
  2. 若确认是 VAD 还原后片段 end 等于下一段 start,优先尝试升级 Faster Whisper 到包含 PR #1676 修复的版本。
  3. 升级后重新运行原始调用,例如保持 model.transcribe("audio.wav", beam_size=5, language="zh", vad_filter=True, vad_parameters=dict(min_silence_duration_ms=1000)) 不变,观察片段边界是否被限制在真实语音区间内。
  4. 如果升级后仍不满足精度要求,可参考维护者建议启用词级时间戳以改善时间精度,或使用强制对齐获得更准确的时间。
  5. 若需要完全自定义 VAD 时间戳,可参考 Issue 中用户提出的思路:独立使用 Silero VAD 识别语音起止时间,关闭 Faster Whisper 的 vad_filter 和时间戳,再按 Silero VAD 给出的语音片段逐段调用 Faster Whisper 转写。注意该思路在 Issue 中未附完整代码,也未说明已被官方验证。

验证方法

用同一音频在修复前后各跑一次,比较每个 segment.start 和 segment.end:修复后,前一段的 end 不应再无条件等于下一段的 start,而应被限制在该 VAD chunk 的真实语音结束点以内。若使用 PR #1676 的单元测试场景,可用 chunks [0,5s] 和 [12,17s]、中间 7 秒静音被去除来验证:原先在去静音音频中结束于 6.0s 的 Whisper 词,还原后片段 end 会超过该 chunk 真实语音结束点 5.0s,修复后应被夹到 5.0s。

参考来源

SYSTRAN/faster-whisper #1119

SYSTRAN/faster-whisper #1676

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29177

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注