先把当时的情况摆出来。把 Whisper 产出的 srt 和人工轴合并,10 分钟后的字幕逐渐比配音慢 2 秒,越往后越明显;单看每一行时间戳都没错,整轨累计偏移,视频是 23.976 fps 的素材。
排查方向其实有限,先把可能性排一排。视频是 23.976 fps,字幕按 24 fps 时间轴生成。另一种情况是拼接时每段取整到毫秒,误差累积。
另外,中途有 3 段被裁掉,字幕没有同步删除。少数情况下是播放器用了变速播放,字幕没跟随。
先确认视频的真实帧率
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of csv input.mp4
再往下按帧率比例重算整轨时间戳
python retime.py --srt in.srt --fps 23.976 --out fixed.srt
随后对齐首尾两条字幕的时间差
python -c "print(open('fixed.srt').read().splitlines()[-3:])"
末了用播放器抽 10 分钟处核对口型
ffmpeg -ss 600 -i input.mp4 -t 5 -vn -f null -
怎么算真的好了,看的是同一批现象。10 分钟处的字幕与语音误差小于 100 毫秒,结尾字幕不再拖后 2 秒,整轨时间戳单调递增。
容易忽略的是,帧率不同导致的漂移是线性累积的,逐行微调没用;先确认素材帧率再整体换算,裁掉的片段必须同步删字幕,否则拼接处会再叠一次偏移。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
