写在前面#
Final Cut Pro 的原生字幕并不好用,在制作批量字幕时,会导致繁重的工作量。比如当我拥有逐字稿时,从 Pages 到 FCP 之间,不停地 ⌘ + C
⌘ + V
引起了我的极大痛苦,还包括为了选中对象不得不在触控板上指尖飞舞。
转折,总是发生在坏的时刻。这也就是如下工作流的由来。
逐字稿#
是的。这套工作流的适用场景,在于你首先有一份逐字稿。通常是以下场景:
- 客户提供的已校对文案
- 歌词字幕
- 影视剧台词
- …
制作字幕的逐字稿可以保存为 TXT 纯文本。
This is 1st subtitle.
这是第 1 条字幕
This is 2nd subtitle.
这是第 2 条字幕
不要有空行,因为懒得写空行处理…(你当然可以自行添加
字幕时间轴#
一般来说,制作时间轴可以有两种方式:手动打轴和自动(AI)打轴。
手动打轴#
主要依靠听力和音频波形,例如在 ArcTime 这样的字幕制作软件上进行手动打轴 (拖拽或 JK 键拍打)。当然,ArcTime 对于双语字幕的支持十分友好,可以参看官方使用教程:双语字幕的制作流程。
自动打轴#
字节跳动旗下的视频剪辑软件 剪映 被诸多视频 up 主称为最好用的「字幕制作」工具。因其 免费 的语音转文字功能(智能字幕),而且准确率也还不错,于是过去常用的 网易见外 也就被我喜新厌旧了…
目前自动打轴的体验,对于语句起、终点的判断还不错,但在断句上还存在一些不足。这里的不足,主要是针对逐字稿而言的。它不能很好的与逐字稿的分行进行匹配。这也正是我对于「文稿匹配」的全部幻想。也许再过几个版本,剪映就可以实现真正的文稿匹配吧!
只是当下,还需要多一步人工校轴。把错误的断行对应逐字稿合并 / 分割。但这部分的工作量相对于手动打轴已经轻松很多了。此处也是全流程的决速步!希望有更好的优化方案。
时间轴可以选择导出为 SRT 文件。
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 可以帮你清晰地注释每一处的功能呢~
# 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 文件中。
"""
输入
txt file
---
This is 1st subtitle.
这是第 1 条字幕
This is 2nd subtitle.
这是第 2 条字幕
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.
运行
python txt_to_srt.py
输出
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.
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 文件 的需求。
FCPXML 模版文件 Template.fcpxml
---
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fcpxml>
<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>
<title ref="r2" name="{TITLE_NO}" offset="{OFFSET}" duration="{DURATION}" start="{START}">
<param name="展平" key="9999/999166631/999166633/2/351" value="1"/>
<param name="对齐" key="9999/999166631/999166633/2/354/999169573/401" value="1 (居中)"/>
<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"/>
</title>
</spine>
</sequence>
</project>
</event>
</library>
</fcpxml>
在线转换#
本地转换#
我在 GitHub 上找到了这个项目 hysmichael/srt_fcpxml_converter。该作者实现了 SRT 与 FCPXML 之间的双向转换。
输入
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 文件作为模版。
运行
python srt_converter.py -i INPUT_FILE.srt -o OUTPUT_FILE.fcpxml
输出并导入 Final Cut Pro