我的双语字幕工作流

写在前面

Final Cut Pro 的原生字幕并不好用，在制作批量字幕时，会导致繁重的工作量。比如当我拥有逐字稿时，从 Pages 到 FCP 之间，不停地 ⌘ + C ⌘ + V 引起了我的极大痛苦，还包括为了选中对象不得不在触控板上指尖飞舞。

转折，总是发生在坏的时刻。这也就是如下工作流的由来。

逐字稿

是的。这套工作流的适用场景，在于你首先有一份逐字稿。通常是以下场景：

客户提供的已校对文案

歌词字幕

影视剧台词

…

制作字幕的逐字稿可以保存为 TXT 纯文本。

Copy
This is 1st subtitle.
这是第 1 条字幕
This is 2nd subtitle.
这是第 2 条字幕

不要有空行，因为懒得写空行处理…（你当然可以自行添加

字幕时间轴

一般来说，制作时间轴可以有两种方式：手动打轴和自动（AI）打轴。

手动打轴

主要依靠听力和音频波形，例如在 ArcTime 这样的字幕制作软件上进行手动打轴 (拖拽或 JK 键拍打)。当然，ArcTime 对于双语字幕的支持十分友好，可以参看官方使用教程：双语字幕的制作流程。

自动打轴

字节跳动旗下的视频剪辑软件 剪映 被诸多视频 up 主称为最好用的「字幕制作」工具。因其 免费 的语音转文字功能（智能字幕），而且准确率也还不错，于是过去常用的 网易见外 也就被我喜新厌旧了…

目前自动打轴的体验，对于语句起、终点的判断还不错，但在断句上还存在一些不足。这里的不足，主要是针对逐字稿而言的。它不能很好的与逐字稿的分行进行匹配。这也正是我对于「文稿匹配」的全部幻想。也许再过几个版本，剪映就可以实现真正的文稿匹配吧！

只是当下，还需要多一步人工校轴。把错误的断行对应逐字稿合并 / 分割。但这部分的工作量相对于手动打轴已经轻松很多了。此处也是全流程的决速步！希望有更好的优化方案。

时间轴可以选择导出为 SRT 文件。

Copy
1
00:02:14,000 --> 00:03:14,000
This is 1st subtitle.

2
00:05:21,000 --> 00:13:14,000
This is 2nd subtitle.

替换字幕文本

校轴完毕后，就可以导出 SRT 字幕文件了。在这里，也许你会基于剪映生成的字幕文本做修改。对于双语字幕，会再复制一层字幕轨道，进行 ⌘ + C ⌘ + V 的逐个替换。

但仔细想想，既然它们都是结构化的文本，那自然可以通过程序来批量化处理。

例如以下的 Python 代码（ChatGPT 可以帮你清晰地注释每一处的功能呢～

Copy
# txt_to_srt.py

import pysrt

# 定义输入文件路径
srt_file_path = 'path/to/your/srt/file.srt'
txt_file_path = 'path/to/your/txt/file.txt'

# 定义输出文件路径
new_srt_file_EN_path = 'path/to/your/srt/file_EN.srt'
new_srt_file_ZH_path = 'path/to/your/srt/file_ZH.srt'

# 读取 txt 文件中的文本
with open(txt_file_path, 'r', encoding='utf-8') as txt_file:
replacement_content = txt_file.read()

# 将 txt 文件分割为句子列表
replacement_text = replacement_content.split('\n')

# 初始化中英文列表
english_sentences = []
chinese_sentences = []

# 分别提取中英文句子
for i in range(len(replacement_text)):
if i % 2 == 0: # 偶数行为英文句子（注：从 0 行开始计数）
english_sentences.append(replacement_text[i]) # 添加到英文列表
else: # 奇数行为中文句子
chinese_sentences.append(replacement_text[i]) # 添加到中文列表

# 使用 pysrt 库加载 SRT 文件
subs_EN = pysrt.open(srt_file_path)
subs_ZH = pysrt.open(srt_file_path)

# 遍历每个字幕条目，将文本替换为 txt 文件中的文本
for id, sub in enumerate(subs_EN):
sub.text = english_sentences[id]

for id, sub in enumerate(subs_ZH):
sub.text = chinese_sentences[id]

# 将修改后的字幕保存到新的 SRT 文件中
subs_EN.save(new_srt_file_EN_path, encoding='utf-8')
subs_ZH.save(new_srt_file_ZH_path, encoding='utf-8')

print("字幕替换完成！")

"""
请确保已经安装了 pysrt 库，您可以使用 pip 命令来安装它：pip install pysrt。
同时，请将 srt_file_path、txt_file_path 和 new_srt_file_EN_path、new_srt_file_ZH_path 替换为您实际的文件路径。
这段代码会将 SRT 文件中的所有字幕文本替换为 txt 文件中的文本，并将修改后的字幕保存到新的 SRT 文件中。
"""

输入

Copy
txt file
---
This is 1st subtitle.
这是第 1 条字幕
This is 2nd subtitle.
这是第 2 条字幕

Copy
srt file
---
1
00:02:14,000 --> 00:03:14,000
left blank intentionally.

2
00:05:21,000 --> 00:13:14,000
left blank intentionally.

运行

Copy
python txt_to_srt.py

输出

Copy
srt file EN
---
1
00:02:14,000 --> 00:03:14,000
This is 1st subtitle.

2
00:05:21,000 --> 00:13:14,000
This is 2nd subtitle.

Copy
srt file ZH
---
1
00:02:14,000 --> 00:03:14,000
这是第 1 条字幕

2
00:05:21,000 --> 00:13:14,000
这是第 2 条字幕

导入至剪辑软件

剪映：支持导入 SRT 字幕。导入后，编辑样式，导出视频，交付。

Final Cut Pro：由于我当前主要使用 Final Cut Pro，所以需要通过 XML 来导入字幕。也因此产生了 SRT 文件转换为 FCPXML 文件 的需求。

Copy
FCPXML 模版文件 Template.fcpxml
---

<?xml version="1.0" encoding="UTF-8"?>


<fcpxml version="1.10">
<resources>
<format id="r1" name="FFVideoFormat1080p2997" frameDuration="1001/30000s" width="1920" height="1080" colorSpace="1-1-1 (Rec. 709)"/>
<effect id="r2" name="基本字幕" uid=".../Titles.localized/Bumper:Opener.localized/Basic Title.localized/Basic Title.moti"/>
</resources>
<library>
<event name="{EVENT_NAME}">
<project name="{PROJECT_NAME}">
<sequence format="r1" tcStart="0s" tcFormat="NDF">
<spine>



<text>
<text-style ref="ts1">{TEXT}</text-style>
</text>
<text-style-def id="ts1">
<text-style font="Noto Sans SC" fontSize="42" fontFace="Regular" fontColor="1 1 1 1" shadowColor="0 0 0 0.75" shadowOffset="5 315" shadowBlurRadius="4"/>
</text-style-def>
<adjust-transform position="0 -40.7407"/>

</spine>
</sequence>
</project>
</event>
</library>
</fcpxml>

在线转换

crossub 字幕转换工具

本地转换

我在 GitHub 上找到了这个项目 hysmichael/srt_fcpxml_converter。该作者实现了 SRT 与 FCPXML 之间的双向转换。

输入

Copy
srt file EN
---
1
00:02:14,000 --> 00:03:14,000
This is 1st subtitle.

2
00:05:21,000 --> 00:13:14,000
This is 2nd subtitle.

配合 FCPXML 模版文件 Template.fcpxml。该模版文件也可以自行在 Final Cut Pro 中调整样式，导出为 FCPXML 文件作为模版。

运行

Copy
python srt_converter.py -i INPUT_FILE.srt -o OUTPUT_FILE.fcpxml

输出并导入 Final Cut Pro