faster-whisper 1.0 跑 large-v3 转写两小时播客,背景音乐段反复输出「谢谢观看」,word_timestamps 打开后这些片段时间戳还连续,换个音源依旧复现。
一开始怀疑是「temperature 回退链太短,重复句子没有被重新解码」,查了一圈,方向不对。
原因不止一个,得分开看。背景音乐段没有有效语音,模型按训练分布补出常见字幕。少数情况下是VAD 阈值过高把轻声段落切碎,切口处容易产生幻觉。
不容易想到的是,condition_on_previous_text 打开后把幻觉句继续往下带。
第一件事是跑一遍带 VAD 的转写并导出分段
python -c "from faster_whisper import WhisperModel;m=WhisperModel('large-v3',device='cuda');segs,_=m.transcribe('ep.mp3',vad_filter=True,vad_parameters=dict(min_silence_duration_ms=500));print(len(list(segs)))"
然后把条件上文关掉再对比同样时间段的输出
python transcribe.py --no-condition --vad on --out ep2.txt
接着统计高频重复句并定位所在时间段
python -c "import re,collections;t=open('ep2.txt',encoding='utf-8').read();print(collections.Counter(re.findall(r'.{6}',t)).most_common(5))"
剩下的就是用 ffmpeg 把音乐段单独切片复核
ffmpeg -ss 00:12:30 -t 90 -i ep.mp3 -ac 1 -ar 16000 music.wav
改完先别撤,确认这几项。重新转写后重复句数量降到个位数,音乐段只剩环境声标注,人声段落的时间戳与音频对齐误差在 0.3 秒内。
这里还有个坑。幻觉不是模型坏了,是无声段被强行解码,VAD 与条件上文两个开关一起调才有效,只改其中一个通常换个音频又出现。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
