字幕对不上别再手动算偏移了,ffsubsync 按音轨自动对齐真香
前面那篇讲手动算字幕偏移,但说实话,手动对是折磨——尤其外语片,你根本不知道哪句对到哪句。后来发现 ffsubsync,它能拿视频的音轨当参照,自动把字幕时间轴拉伸/平移对齐。这篇记用法和几个坑。
原理一句话
ffsubsync 把字幕文本做语音活动检测(VAD),得到"字幕认为什么时候在说话"的时间分布;再对视频音轨做同样的检测,得到"实际什么时候在说话"。两者对不上?它用动态时间规整(DTW)把字幕轴拉伸对齐到音轨。所以是"按声音对齐",不是按画面。
装和跑
pip install ffsubsync
ffsubsync video.mp4 -i sub.srt -o sub_aligned.srt
-i 是输入字幕,video.mp4 直接当音源。跑完 sub_aligned.srt 就对齐了。简单到离谱。
坑一:它读的是音轨不是画面
所以默片、纯音乐、对白极少的片子里,ffsubsync 会瞎对齐。遇到这种退回手动。另外如果音轨本身就是错位的(比如音画不同步的片源),对齐出来也是错的——先确保片源音画同步。
坑二:拉伸过头
默认它允许时间轴整体缩放(因为不同版本帧率差导致整条轴比例不对)。如果你的字幕只是"整体平移 2 秒",可以限制只平移:
ffsubsync video.mp4 -i sub.srt -o out.srt --no-fix-framerate
或者干脆用 --overwrite-input 直接覆盖原文件(我一般不,留个备份)。
坑三:编码和语言
字幕文件编码乱(GBK 的 SRT)会读崩。先转 UTF-8:
iconv -f gbk -t utf-8 sub_gbk.srt > sub.srt
中文 VAD 模型 ffsubsync 是支持的,但偶尔抽风,多跑一次比对。
配合管线
我现在的工作流:下载 → Whisper 出草稿字幕 → (有现成 SRT 就)ffsubsync 对齐 → 翻译流水线出双语。比纯手动快十倍。前面那篇 OCR+Whisper 可以接这一环。
提醒:对齐只解决"时间轴",不解决"翻译错"。翻译烂还得自己改。