
はじめに:英語の音声から「2カ国語字幕付き動画」を全自動生成する
Pythonの強力なライブラリ群とコマンドラインツールを組み合わせると、日常の面倒な作業を驚くほど自動化できます。前回の記事では、AIを使って音声から字幕ファイル(SRT)を生成する手順を解説しましたが、今回はさらに一歩踏み込んで、「英語の音声ファイルから、英語と日本語のデュアル字幕(2カ国語字幕)が同期した動画(MP4)」を全自動で作り出す方法をご紹介します。
実は先日、個人的なプロジェクトで7時間にも及ぶ英語の長尺オーディオデータを処理する機会があったのですが、このスクリプトとFFmpegを組み合わせたおかげで、寝ている間にPCが完璧な字幕付き動画を完成させてくれました。手作業で字幕を合わせていたら、おそらく数週間はかかっていたでしょう。
今回はテストとして、私の愛読書である『「怠惰」なんて存在しない 終わりなき生産性競争から抜け出すための幸福論』(デヴォン・プライス著)の冒頭部分を自分で英語で音読し、MP3に録音したものを用意しました。私の拙い英語発音でもAIが正常に音声として認識し、綺麗な字幕動画になるのかを検証してみます。
💡 この記事はこんな人におすすめです
- 英語のポッドキャストや講演の音声から、学習用の字幕動画を作りたい人
- Pythonを使って自動翻訳や動画編集の自動化(FFmpeg処理)を学びたい人
- 海外向けのYouTube動画に、多言語の字幕を焼き付けたい動画クリエイター
この記事でできること(完成イメージ)
この記事の手順を最後まで進めると、以下のような処理が自動で行えるようになります。
- 英語の音声データ(MP3)から、タイムスタンプ付きの英語字幕(SRT)を高精度で生成する
- 生成した英語字幕のテキストを抽出し、自動翻訳で日本語の字幕(SRT)を複製する
- FFmpegのフィルター機能を駆使して、「黒背景+音声+上部に英語字幕+下部に日本語字幕」の動画(MP4)をエンコードする
前提環境と準備するファイル
| 項目 | 内容 |
|---|---|
| OS | macOS / Linux / Windows (WSL推奨) |
| Python | バージョン 3.9以上 |
| 必須ツール | ffmpeg (aptコマンド等で簡単にインストール可能) |
| 入力音声 | LazinessDoesNotExist.mp3
(今回は私が音読した約5分のテスト音声を使用します) |
ステップ1:必要なツールのインストール
まずは、動画処理の要となる「FFmpeg」と、AI音声認識や翻訳を行うための「Pythonライブラリ群」をインストールします。
FFmpegのインストール(Ubuntu / WSL環境)
ターミナルを開き、以下のコマンドを実行してFFmpegをインストールします。
sudo apt update
sudo apt install ffmpeg
Pythonライブラリのインストール
次に、AIモデルと翻訳ツールをPython環境(必要に応じて仮想環境内で)にインストールします。
pip install openai-whisper pysrt googletrans==4.0.0rc1
少しファイルサイズが大きいため、インストールには数分かかる場合があります。
※注意:googletrans は、Google翻訳の非公式APIを叩くライブラリです。安定して動作させるため、必ず末尾に ==4.0.0rc1 をつけてバージョンを指定してください(最新の仕様変更によるエラーを防ぐためです)。

各ライブラリの役割
| ライブラリ名 | 目的と技術的背景 |
|---|---|
| openai-whisper | OpenAIが開発した超高精度な音声認識AIです。MP3の波形データを解析し、英語のテキストデータと時間情報(SRT)を生成します。 |
| pysrt | SRT(字幕)ファイルをPython上でプログラムとして扱うためのライブラリです。字幕の表示時間をずらしたり、テキストだけを抽出したりできます。 |
| googletrans | 抽出した英語のテキストを、Google翻訳のエンジンを利用して日本語に一括翻訳します。 |
(※余談ですが、もし「自分の声ではなくAIに音読させたい」場合は、Piperという高速なローカル音声合成CLIツールを使うのがおすすめです。今回は自前の録音データを使うので割愛します。)
ステップ2:英語MP3から英語SRTを作る(Whisper)
まずは録音したMP3ファイルから、英語のベースとなる字幕ファイル(SRT)を生成します。Pythonのスクリプトを書かなくても、Whisperをインストールするとコマンドライン(CLI)からワンライナーで簡単に実行できます。
whisper LazinessDoesNotExist.mp3 --language en --model small --output_format srt
【コマンドの解説】
--language en: 音声が英語であることを明示し、精度を上げます。--model small: 軽量かつ実用的な「small」モデルを指定します。ハイスペックなPCをお持ちなら「medium」や「large」にするとさらに精度が上がります。--output_format srt: 動画編集ソフトやFFmpegで読み込みやすい標準的な字幕フォーマット(SRT形式)で出力させます。
自分で音読した5分程度のMP3であれば、処理は数分で終わります。なお、グラフィックボード(GPU)を搭載していないPCで実行すると、以下のようなエラー(警告)が出ますが、これは無視して全く問題ありません。

# 表示される警告メッセージ
UserWarning: FP16 is not supported on CPU; using FP32 instead
これは「高速なAI計算(FP16)に対応したGPUがないので、普通のCPU計算(FP32)で頑張りますね」という単なるお知らせです。
実行中、ターミナルにはAIが聞き取ったテキストがタイムスタンプと共に次々と表示されていきます。

処理が完了すると、同じフォルダ内に LazinessDoesNotExist.srt というファイルが生成されています。
ステップ3:英語SRTから日本語SRTへ自動翻訳
次に、先ほど生成した英語の字幕ファイルを読み込み、表示のタイミング(時間情報)はそのまま維持した状態で、テキスト部分だけを日本語に直訳するPythonスクリプトを作成します。
以下のコードをコピーし、translate.py という名前で保存してください。
import pysrt
from googletrans import Translator
# 1. Whisperで作った英語のSRTファイルを読み込む
subs = pysrt.open("LazinessDoesNotExist.srt")
translator = Translator()
# 2. 字幕の各行(ブロック)を1つずつ取り出して処理
for sub in subs:
# 英語(en)から日本語(ja)へ翻訳
ja = translator.translate(sub.text, src="en", dest="ja")
# 元の英語テキストを、翻訳された日本語テキストに上書き
sub.text = ja.text
# 3. 日本語用の別ファイルとして保存する
subs.save("LazinessDoesNotExist_ja.srt", encoding="utf-8")
準備ができたら、ターミナルで以下のコマンドを実行します。
python translate.py

処理が完了すると、フォルダ内には以下の2つのファイルが揃います。
LazinessDoesNotExist.srt(オリジナルの英語字幕)LazinessDoesNotExist_ja.srt(直訳された日本語字幕)
ステップ4:FFmpegでデュアル字幕付き動画(MP4)をエンコードする
いよいよクライマックスです。
音声ファイルと2つの字幕ファイルが揃ったので、これらを合体させて1つの動画ファイルをエンコードします。FFmpegの強力な「フィルター複合機能(filter_complex)」を使います。
ffmpeg -i LazinessDoesNotExist.mp3 </span>
-filter_complex </span>
"color=c=black:s=1920x1080:r=30[vbg]; </span>
[vbg]subtitles=LazinessDoesNotExist.srt:force_style='Alignment=6,MarginV=50,Fontsize=14'[vtop]; </span>
[vtop]subtitles=LazinessDoesNotExist_ja.srt:force_style='Alignment=2,MarginV=50,Fontsize=14'[vout]" </span>
-map "[vout]" -map 0:a -c:v libx264 -c:a aac -shortest output_small.mp4
📝 ちょっとマニアックなFFmpegコマンド解説
color=c=black:s=1920x1080:r=30: 真っ黒の背景画像を、フルHD画質(1920×1080)の30フレームで自動生成します。映像ソースがないため、この黒背景を土台にします。Alignment=6,MarginV=50: 上部中央(Alignment=6)に配置し、画面端からの余白を50に設定します。ここに英語字幕(srt)を焼き付けます。Alignment=2: 下部中央(Alignment=2)に配置します。ここに日本語字幕(ja.srt)を焼き付けます。-shortest: 音声の長さに合わせて動画の生成を終了します(これがないと黒背景が永遠に出力され続けてしまいます)。
最終成果物:完成した動画がこちら!
処理が終わると output_small.mp4 という動画ファイルが生成されます。再生してみると……

見事に、上部に英語、下部に日本語が配置された2カ国語字幕動画が完成しました!
自分の拙い発音の英語でも、Whisperは文脈を補完してかなり正確に文字起こししてくれました。本当は日本語の朗読データでも試してみたかったのですが、私の滑舌が悪いのか、はたまた日本語モデルの精度の問題か、あまり良い結果が得られなかったため今回は割愛します。
最後に
いかがでしたでしょうか。
映像データが全くなくても、「英語の音声ファイル(MP3)さえあれば、自動で高品位なデュアル字幕動画を生成できる」というFFmpegとPythonの強みがお分かりいただけたかと思います。
海外のITカンファレンスの音声や、英語学習用のポッドキャストなどを録音しておき、このスクリプトに放り込めば、あっという間に自分だけのオリジナル学習教材ができあがります。一度環境を構築してしまえば、コマンド一発で全自動処理されるので非常に快適です。
本記事が皆様の作業効率化、あるいは英語学習のお役に立てれば幸いです!
