前書き#
Final Cut Pro のネイティブ字幕はあまり使い勝手が良くなく、大量の字幕を制作する際には重い作業負担を引き起こします。例えば、逐語稿を持っているとき、Pages から FCP への間で、絶えず ⌘ + C
⌘ + V
を繰り返すことが私にとって非常に苦痛であり、オブジェクトを選択するためにタッチパッド上で指先を飛ばさなければならないことも含まれます。
転機は、常に悪いタイミングで訪れます。これが以下のワークフローの由来です。
逐語稿#
はい。このワークフローの適用シーンは、まず逐語稿があることです。通常は以下のシーンです:
- クライアントが提供した校正済みの文案
- 歌詞字幕
- 映画やドラマの台詞
- …
字幕制作の逐語稿は TXT プレーンテキストとして保存できます。
This is 1st subtitle.
これは第1の字幕です
This is 2nd subtitle.
これは第2の字幕です
空行は不要です。空行処理を書くのが面倒なので…(もちろん、自分で追加することはできます)
字幕タイムライン#
一般的に、タイムラインを制作するには 2 つの方法があります:手動でのタイムライン作成と自動(AI)タイムライン作成です。
手動でのタイムライン作成#
主に聴力と音声波形に依存します。例えば、ArcTimeのような字幕制作ソフトウェアで手動でタイムラインを作成します(ドラッグまたは JK キーで打つ)。もちろん、ArcTime はバイリンガル字幕のサポートが非常に親切で、公式の使用チュートリアルを参照できます:バイリンガル字幕の制作プロセス。
自動でのタイムライン作成#
ByteDance 傘下の動画編集ソフト剪映は、多くの動画制作者によって最も使いやすい「字幕制作」ツールと称されています。無料の音声からテキストへの変換機能(スマート字幕)があり、精度もまずまずなので、以前よく使っていた网易见外は新しいものに飽きてしまいました…
現在の自動タイムライン作成の体験は、文の開始点と終了点の判断はまずまずですが、句切りにはいくつかの不足があります。ここでの不足は、主に逐語稿に対してです。逐語稿の行分けと良くマッチングできません。これが私の「文稿マッチング」に対する全ての幻想です。もしかしたら、数バージョン後には剪映が本当の文稿マッチングを実現できるかもしれません!
ただ、現時点では、もう一歩の手動校正が必要です。誤った行を逐語稿に対応させて結合 / 分割します。しかし、この部分の作業量は手動タイムライン作成に比べてはるかに楽になりました。ここが全プロセスの決定的なステップです!より良い最適化案があることを願っています。
タイムラインは 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
意図的に空白のままにしています。
2
00:05:21,000 --> 00:13:14,000
意図的に空白のままにしています。
実行
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 へのインポート