把外文字幕变成中英双语:一套字幕翻译流水线
下载了一部生肉(无字幕)外语片,或者只有英文字幕想加上中文字幕,手动一句句对时间轴能把人整疯。这活其实可以拆成一条流水线:提取/识别字幕 → 切句 → 翻译 → 对齐 → 回写。这篇文章给一套能自己跑起来的思路,不依赖某个特定网站。
整体流程
原始视频
└─ 提取/识别字幕 (OCR 或 Whisper) ──> 源语言 srt
└─ 按句切分 + 调用翻译 API ──> 目标语言 srt
└─ 时间轴对齐 ──> 双语 srt
└─ ffmpeg 封装/烧录 ──> 成片
第一步:拿到源字幕
如果有软字幕,直接抽:
ffmpeg -i input.mkv -map 0:s:0 sub.zh.srt
没有就上 OCR 或 Whisper 先出一份源语言字幕(这部分以前专门写过,这里不展开)。
第二步:切句与翻译
不要整段丢进翻译器,会被截断还丢格式。按字幕块(本来就有时间轴)逐条翻译最稳:
import json, requests
def translate(text, src='en', dst='zh'):
# 这里换成你自己的翻译后端,下面只是示意
r = requests.post('https://your-translator/api',
json={'q': text, 'from': src, 'to': dst}, timeout=10)
return r.json()['result']
# 读取 srt,逐条翻译,保留时间轴
关键点:一次只翻译一条字幕块,这样时间轴天然对齐,不用后续再对齐。
第三步:做成双语
双语字幕有两种做法:
- 软字幕双轨道:把中、英两份 srt 分别封装进 mkv 的不同字幕流,播放器里能切换或同时显示;
- 合并成一条双语 srt:每条字幕里先写中文、换行写英文,烧录或软字幕都行。
ffmpeg -i input.mp4 -i zh.srt -i en.srt \
-map 0 -map 1 -map 2 -c copy \
-metadata:s:s:0 language=chi \
-metadata:s:s:1 language=eng \
output.mkv
常见坑
| 现象 | 原因 | 解决 |
|---|---|---|
| 翻译错位 | 整段翻译被合并 | 逐条翻译 |
| 时间轴漂移 | 翻译时改了换行 | 只替换文本,不动物流 |
| 中文乱码 | 文件编码非 UTF-8 | 统一存成 UTF-8 无 BOM |
| 烧录字体丑 | 没指定中文字体 | 加 subtitles=...,fontname=Noto Sans CJK |
常见问题
Q:能全自动吗? 能,把上面几步串成脚本,遍历一整个文件夹即可。
Q:机翻太生硬怎么办? 先用翻译 API 出初稿,再接一个润色模型过一遍,质量能上一个档次。
Q:双语烧录进画面还是留软字幕? 想通用留软字幕,想在任何播放器都看到就烧录(但画质略有损)。