书译
书译

如何制作双语字幕:在一个 SRT 或 VTT 文件中容纳两种语言

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

BookTranslator

BookTranslator Team

17 分钟阅读

要制作双语字幕,你需要一个带时间轴的字幕文件、一份保持相同时间轴的翻译,以及每个时刻一条包含两种语言的字幕:原文行在前,译文行在后,位于同一个时间戳下。任何能生成双语文件的翻译工具都会为你完成这一步,如果你已经有两个文件,合并工具也能做到。普通 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

它将双语文件与源文件比较,并假定原始行在前,因此在交换顺序之前运行它。如果顶部行与源文件不匹配,它会发出警告。以下是它在西班牙语文件中发现的问题:

字幕秒数行数原始字符/秒西班牙语字符/秒问题
23.2419.417.8四行,西班牙语过快
52.726.77.0文本中的 '
71.024.04.0相同文本重复两次
81.821.71.7相同文本重复两次
91.2420.822.5四行,两种语言均过快
103.6218.319.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%。

在纯色 1280x720 测试画面底部,采用 Chromium 默认字幕样式的两行英文提示。

同样的提示加上两行西班牙语后,占据了约五分之一的画面高度。

按以下顺序处理被标记的提示:

  1. 逐字保留音频语言。 如果观众在听原声并对照文字,缩短后的原文就不再与他们听到的内容匹配。
  2. 将另一种语言缩减为一行。 当西班牙语变为 A las seis hay otro; cierran a medianoche. 时,我们的第 2 条提示从每秒 17.8 个字符降至 13.1 个字符。这样屏幕上显示三行而不是四行,并且保留了两个事实。
  3. 仅在存在间隙时增加时间。 在移动结束时间之前,检查下一条提示的开始时间。第 2 条提示有 0.2 秒的余量,不值得为此费心。
  4. 然后其余部分保持不动。 第 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 和 ♪ ♪ 因没有可翻译的词语而被跳过,因此双语文件会将它们各打印两次。手动删除一行。
  • 文本中可能出现 &apos;。 截至 2026 年 11 月,带有格式标签和撇号的提示返回时,撇号可能被转义。我们的原始行在双语文件中变成了 <i>Don&apos;t answer that.</i>,而在另一项 VTT 测试中,法语翻译在翻译文件中变成了 <i>Je n&apos;attendrai pas.</i>。Chromium 在 VTT 中对其解码并显示了正常的撇号。但当我们用 FFmpeg 转换 SRT 时,&apos; 保留在输出文本中,因此可以假设某些播放器会原样显示它。在使用文件之前,将 &apos; 替换为 '。我们已向工程师报告了此问题。
  • VTT 提示设置被移除。 诸如 line:0 align:start position:10% 的位置设置和 NOTE 块从我们的 VTT 测试输出中消失了,并且说话者标签出现在两行上。如果你的 VTT 依赖位置设置,请在翻译后重新添加。
  • 从右到左的文本会逐行标记。 阿拉伯语行返回时被 Unicode 方向标记包裹。我们只检查了 Chromium 中 VTT 副本里的一个字幕提示,它显示为从右到左。像我们的第 10 条提示那样混合阿拉伯语和数字的行是更棘手的情况,我们没有查看这些行,所以请在你实际使用的播放器中测试。SRT 没有其他设置方向的方法。我们的从右到左指南涵盖了书籍更广泛的问题。

如果你的源文件是 ASS 或 SSA,BookTranslator 的双语输出会将翻译行作为具有相同样式和时间的第二个事件添加,这是一种不同的结构。我们的 ASS 字幕指南解释了这些文件是如何构成的。如果两种语言中的重音字符看起来损坏,问题通常是文件编码,我们的字幕编码指南涵盖了这一点。

分享文件之前

  1. 运行检查器并逐一检查每个被标记的提示。
  2. 查找 &apos;、&amp; 和 &quot; 并替换它们。
  3. 删除音效、数字和音乐上的重复行。
  4. 在观众将使用的播放器中,以他们将使用的屏幕尺寸,观看最繁忙的几分钟。
  5. 检查底部行是否遮挡了视频中的屏幕文字。
  6. 结合上下文阅读译文。我们的 AI 字幕工作流程涵盖了如何审校。

准备好 SRT 或 VTT 了吗?将其上传到字幕翻译器,在付款前查看价格。完成后,下载双语文件和翻译文件。然后对其运行检查器,因为实际任务中的行数取决于模型如何拆分每个翻译提示。

相关文章

如何制作双语字幕:在一个 SRT 或 VTT 文件中容纳两种语言