如何制作双语字幕:在一个 SRT 或 VTT 文件中容纳两种语言
制作一份人们可以阅读的双语 SRT 或 VTT 文件:按时间合并,将两种语言放入同一条字幕,选择哪种语言在上,并运行一个免费检查器。

要制作双语字幕,你需要一个带时间轴的字幕文件、一份保持相同时间轴的翻译,以及每个时刻一条包含两种语言的字幕:原文行在前,译文行在后,位于同一个时间戳下。任何能生成双语文件的翻译工具都会为你完成这一步,如果你已经有两个文件,合并工具也能做到。普通 SRT 不需要特殊语法。
制作文件是容易的部分。更难的是,时间轴原本是为一种语言编写的。一条能容纳两行英文的字幕,现在必须在同样的几秒钟内、在同样的画面上容纳四行。因此本指南的大部分篇幅都在讲合并后需要修正什么。
我们编写了一个包含 12 条字幕的测试文件,生成了西班牙语、中文和阿拉伯语版本,并编写了一个免费检查器。这些文件来自 BookTranslator 自己的字幕生成代码,在本地运行。我们手动编写了翻译,而不是调用模型,因此这些测试展示的是文件会发生什么,而不是翻译质量如何。README 中有详细信息。检查器只需要 Python 3,不需要其他任何东西。
快速回答:双语字幕长什么样
2
00:00:03,400 --> 00:00:06,600
There's another one at six,
but the station closes at midnight.
Hay otro a las seis,
pero la estación cierra a medianoche.
这是有效的 SRT。每条字幕保留其编号和时间戳,时间戳下方的每一行文本都会一起显示在屏幕上。WebVTT 的工作方式相同。
先选择方案
| 你想要 | 使用 | 原因 |
|---|---|---|
| 在几乎任何播放器中观看,或将一个文件发送给他人 | 一个合并的 SRT | 它是一个普通的字幕文件,不需要播放器功能 |
| 在自己的电脑上观看,并能控制每种语言 | 在支持双轨的播放器中使用两个单独的文件 | 每种语言保留自己的时间轴,可以移动或关闭 |
| 在网页上以不同大小显示语言 | 一个 VTT,为每种语言设置一个类 | WebVTT 支持样式;SRT 没有标准方法来实现 |
| 发布一个在任何地方看起来都一样的视频 | 烧录字幕 | 文本成为画面的一部分,观众无法关闭 |
对于双轨,mpv 有一个 --secondary-sid 选项。其手册说明,第二条轨道默认绘制在屏幕顶部,这样可以将语言分开。我们没有亲自测试 mpv。
若要烧录字幕,FFmpeg 的字幕滤镜需要包含 libass 的构建版本。我们为本次测试安装的 FFmpeg 9.0.1 没有该功能,因此在围绕它制定计划前,请先运行 ffmpeg -filters | grep subtitles 检查。我们未测试烧录。
步骤 1:将两种语言放入一个文件
如果你有一个文件, 请使用能生成双语文件的工具进行翻译。BookTranslator 对每个 SRT 和 VTT 任务都这样做:你会得到一个翻译文件和一个时间戳相同的双语文件,可以从字幕翻译器开始。如果你需要先选择工具,请参阅我们的字幕软件对比。
如果你有两个文件, 请按时间而非字幕编号配对。合并出错往往就在这里,因为同一视频的两条轨道很少以相同方式分割台词。我们的第二条西班牙语轨道将两条长字幕一分为二,并省略了音效、年份和音乐。
python3 check_bilingual_subs.py merge sample-source.srt sample-es-own-timing.srt -o merged.srt
按字幕编号配对(脚本的 --index 选项)导致 12 条字幕中有 10 条出错,从第 2 条开始,一半西班牙语缺失。到第 3 条时,翻译已属于另一行:
3
00:00:06,800 --> 00:00:08,000
So where do we wait?
pero la estación cierra a medianoche.
按时间配对在 9 条字幕下给出了正确的翻译,让 3 条没有西班牙语的字幕保持原样,并报告了那条未匹配任何内容的西班牙语行,以便你手动放置。脚本将第二轨道的字幕分配给与其重叠最多的第一轨道字幕,只要重叠部分至少占其长度的一半。诸如 submerger 的工具也能合并文件;我们未测试它们。无论使用什么工具,请在第一次分割后抽查字幕。
步骤 2:检查文件
python3 check_bilingual_subs.py check sample-source.srt sample-es-bilingual.srt --max-target-cps 17
它将双语文件与源文件比较,并假定原始行在前,因此在交换顺序之前运行它。如果顶部行与源文件不匹配,它会发出警告。以下是它在西班牙语文件中发现的问题:
| 字幕 | 秒数 | 行数 | 原始字符/秒 | 西班牙语字符/秒 | 问题 |
|---|---|---|---|---|---|
| 2 | 3.2 | 4 | 19.4 | 17.8 | 四行,西班牙语过快 |
| 5 | 2.7 | 2 | 6.7 | 7.0 | 文本中的 ' |
| 7 | 1.0 | 2 | 4.0 | 4.0 | 相同文本重复两次 |
| 8 | 1.8 | 2 | 1.7 | 1.7 | 相同文本重复两次 |
| 9 | 1.2 | 4 | 20.8 | 22.5 | 四行,两种语言均过快 |
| 10 | 3.6 | 2 | 18.3 | 19.4 | 两行均超过 42 个字符,西班牙语过快 |
第 6 条和第 12 条字幕也返回了四行。其余四条字幕正常。
速度和行长限制来自 Netflix,因为其数字公开且具体,并且因语言而异。其英语指南允许每行 42 个字符、两行,成人节目每秒最多 20 个字符。其拉丁美洲西班牙语指南允许翻译字幕每秒 17 个字符,其简体中文指南允许每行 16 个字符、每秒 9 个字符。因此对于中文,请使用 --max-target-line 16 --max-target-cps 9。这些指南一次只涵盖一种语言,最多两行。我们不知道有适用于一条字幕中两种语言的等效标准,因此检查器默认屏幕上三行以及下一节中的所有内容,都是我们的判断。
检查器还会打印一个合并数字,在第 9 条字幕上达到每秒 43.3 个字符。不要试图修正这个数字。没有人会全神贯注地阅读两种语言的每个字符。将其视为指向值得关注的字幕的指针。
步骤 3:修复四行字幕
这就是四行字幕的代价。在 Chromium 内置的字幕显示中,分辨率为 1280x720 时,两行英文提示占据了画面高度的 10.6%,而加上西班牙语后,同样的提示占据了 21.9%。


按以下顺序处理被标记的提示:
- 逐字保留音频语言。 如果观众在听原声并对照文字,缩短后的原文就不再与他们听到的内容匹配。
- 将另一种语言缩减为一行。 当西班牙语变为
A las seis hay otro; cierran a medianoche.时,我们的第 2 条提示从每秒 17.8 个字符降至 13.1 个字符。这样屏幕上显示三行而不是四行,并且保留了两个事实。 - 仅在存在间隙时增加时间。 在移动结束时间之前,检查下一条提示的开始时间。第 2 条提示有 0.2 秒的余量,不值得为此费心。
- 然后其余部分保持不动。 第 9 条提示是
You knew?/Since March.,时长 1.2 秒。它违反了速度和行数限制,但我们会保留它:其后的 0.2 秒间隙太小,无济于事,而且观众很可能一眼就能看完两句简短的回答。并非每个标记都是错误。
对于像第 10 条这样的长单行,只有在提示时间允许的情况下,才将每种语言分成两行。否则就缩短翻译。
如果你能控制显示,还可以让一种语言更容易辨认。运行 to-vtt 为每种语言分配各自的类。生成的文件在 Chromium 中渲染时,英文为 80% 大小并呈浅灰色。这几乎不节省空间(占画面高度的 21.1%,而非 21.9%),因此不能替代删减一行。我们没有测试它是否有助于人们阅读。

这使用了 WebVTT 的提示类和 ::cue() 选择器。它面向浏览器。其他播放器可能会忽略这些样式或 VTT 文件。
第 4 步:决定哪种语言放在上面
这方面有一些研究。在一项2026 年的眼动追踪研究中,42 名以西班牙语为母语、英语为第二语言的参与者,无论哪种语言在顶部,观看者都会在顶行花费更多时间,并且会在与音频匹配的那一行花费更多时间。当母语西班牙语在顶部时,理解得分更高。另一项较早的研究对 112 名中国英语学习者发现,双语字幕对理解的帮助与仅使用母语字幕一样大,且两者都优于英语字幕或无字幕。
这些是针对特定观众群体的单项研究,因此请将它们作为起点:
- 为了内容而观看电影或讲座: 将你阅读最流利的语言放在上面。
- 练习你正在学习的语言: 将该语言放在上面,并接受你可能理解得少一些。2026 年的研究测量的是理解,而非学习,所以这一点是我们的判断。
- 审校翻译: 顺序影响不大,因此保持原样即可。
BookTranslator 的双语文件始终将原文放在上面。要交换顺序:
python3 check_bilingual_subs.py flip sample-source.srt sample-es-bilingual.srt -o translation-on-top.srt
哪些地方会出错,以及如何修复
这些来自在我们的测试文件上运行 BookTranslator 的字幕代码,检查器标记了前两个问题。
- 无需翻译的文本会出现两次。
1984和♪ ♪因没有可翻译的词语而被跳过,因此双语文件会将它们各打印两次。手动删除一行。 - 文本中可能出现
'。 截至 2026 年 11 月,带有格式标签和撇号的提示返回时,撇号可能被转义。我们的原始行在双语文件中变成了<i>Don't answer that.</i>,而在另一项 VTT 测试中,法语翻译在翻译文件中变成了<i>Je n'attendrai pas.</i>。Chromium 在 VTT 中对其解码并显示了正常的撇号。但当我们用 FFmpeg 转换 SRT 时,'保留在输出文本中,因此可以假设某些播放器会原样显示它。在使用文件之前,将'替换为'。我们已向工程师报告了此问题。 - VTT 提示设置被移除。 诸如
line:0 align:start position:10%的位置设置和NOTE块从我们的 VTT 测试输出中消失了,并且说话者标签出现在两行上。如果你的 VTT 依赖位置设置,请在翻译后重新添加。 - 从右到左的文本会逐行标记。 阿拉伯语行返回时被 Unicode 方向标记包裹。我们只检查了 Chromium 中 VTT 副本里的一个字幕提示,它显示为从右到左。像我们的第 10 条提示那样混合阿拉伯语和数字的行是更棘手的情况,我们没有查看这些行,所以请在你实际使用的播放器中测试。SRT 没有其他设置方向的方法。我们的从右到左指南涵盖了书籍更广泛的问题。
如果你的源文件是 ASS 或 SSA,BookTranslator 的双语输出会将翻译行作为具有相同样式和时间的第二个事件添加,这是一种不同的结构。我们的 ASS 字幕指南解释了这些文件是如何构成的。如果两种语言中的重音字符看起来损坏,问题通常是文件编码,我们的字幕编码指南涵盖了这一点。
分享文件之前
- 运行检查器并逐一检查每个被标记的提示。
- 查找
'、&和"并替换它们。 - 删除音效、数字和音乐上的重复行。
- 在观众将使用的播放器中,以他们将使用的屏幕尺寸,观看最繁忙的几分钟。
- 检查底部行是否遮挡了视频中的屏幕文字。
- 结合上下文阅读译文。我们的 AI 字幕工作流程涵盖了如何审校。
准备好 SRT 或 VTT 了吗?将其上传到字幕翻译器,在付款前查看价格。完成后,下载双语文件和翻译文件。然后对其运行检查器,因为实际任务中的行数取决于模型如何拆分每个翻译提示。





