FFmpegで動画に字幕・副音声を追加する

動画に対して

  • 多言語対応した字幕
  • 多言語対応した副音声

を追加する方法を紹介します。

作業にあたり、Linux環境でFFmpegを利用します。

当方はFFMpegのエキスパートではなく、FFMpegの一部オプションは雰囲気で指定しているところもあるため、間違いや改善点があれば、ご指摘いただければと思います。

前提

作業環境

  • OS : Ubuntu Linux : 18.04
  • AWS EC2 インスタンス
  • AMI ID : ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-20180912

マルチメディアフォーマット

  • 入力動画フォーマット : mp4
  • 出力動画フォーマット : mkv(Matroska)

インストール(Linux向け)

  • FFmpeg
  • ImageMagick

をインストールします。

$ sudo apt update
$ sudo apt install ffmpeg
$ sudo apt install imagemagick

動画に音声を追加する

オリジナルの動画(英語)に対して日本語音声を追加することを考えます。

音声データの用意

日本語音声データ(audio_jpn.mp3)を用意します。

動画に別音声をかぶせる

オリジナルの音声を残したまま、日本語音声も選択できるようにする場合、次のコマンドを実行します。

$ ffmpeg -i input.mp4 -i audio_jpn.mp3 \
  -map 0:v -map 0:a -map 1:a \
  -metadata:s:a:0 language=eng -metadata:s:a:0 title="Default" \
  -metadata:s:a:1 language=jpn -metadata:s:a:1 title="Japanese" \
  -c:v copy -c:a libopus multi-audio.mkv

音声データと言語の対応付は --metadata オプションで指定します。

音声ストリームに対して順に

  • -metadata:s:a:0 language=eng
  • -metadata:s:a:1 language=jpn
  • ...

とストリーム番号と言語の対応付を行います。

eng, jpnのような言語指定は ISO 639-2/T で定められた3文字コードを利用します。

また -metadata:s:a:ストリーム番号 title="音声の名前" とすることで、音声に名前をつけることが出来ます。

メニューで音声を選択

動画に字幕を追加する

オリジナルの動画(英語)に対して

  • 英語字幕
  • 日本語字幕

を追加します。

字幕データの用意

字幕データのフォーマットとしては

  • SRT
  • SSA/ASS ※ ともにほぼ同じ

などがよく用いられます。

SRT フォーマットについて

SRT フォーマットは

  • シーケンス番号
  • 字幕を表示する開始・終了時間
  • 字幕文字

を並べるだけのシンプルなフォーマットです。

具体的には、以下のようなフォーマットをしています。

1
00:00:00,000 --> 00:00:05,000
Hi! My name is Joanna.

2
00:00:05,000 --> 00:00:10,000
I will read any text you type here.

SRT から ASS への変換

SRT フォーマットではなく ASS フォーマットが必要なケースもあります。

FFMpeg を利用すると、SRT 形式から ASS 形式に簡単に変換出来ます。

-i の引数に SRT 形式ファイルを指定し、出力先のファイルの拡張子に .ass を指定するだけです。

$ ffmpeg -i subtitle.srt subtitle.ass

変換結果を確認してみましょう

[Script Info]
; Script generated by FFmpeg/Lavc57.107.100
ScriptType: v4.00+
PlayResX: 384
PlayResY: 288

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,,Hi! My name is Joanna.
Dialogue: 0,0:00:05.00,0:00:10.00,Default,,0,0,0,,I will read any text you type here.

動画に字幕をかぶせる

上記手順に従い

  • 英語 SRT ファイル(subtitle-eng.srt)
  • 日本語 SRT ファイル(subtitle-jpn.srt)

を作成します。

以下のコマンドで動画に字幕をかぶせます。

$ ffmpeg -i input.mp4 -i subtitle-eng.srt -i subtitle-jpn.srt \
  -map 0:v -map 0:a -map 1 -map 2 \
  -metadata:s:s:0 language=eng \
  -metadata:s:s:1 language=jpn \
  -c:v copy -c:a copy -c:s srt \
  multi-lang-subtitle.mkv

字幕データと言語の対応付は --metadata オプションで指定します。

字幕ストリームに対して順に

  • -metadata:s:s:0 language=eng
  • -metadata:s:s:1 language=jpn
  • ...

とストリーム番号と言語の対応付を行います。

また、eng, jpnのような言語は先程と同じく ISO 639-2/T で定められた3文字コードで指定します。

メニューで字幕を選択

字幕を表示中

字幕・音声を追加する

最後に、音声データと字幕データを同時に付与します。

  • 音声を追加する
  • 字幕を追加する

で実行させたコマンドを合体させればOKです。

$ ffmpeg -i input.mp4 -i audio_jpn.mp3 \
  -i subtitle-eng.srt -i subtitle-jpn.srt \
  -map 0:v -map 0:a -map 1:a -map 2 -map 3 \
  -metadata:s:a:0 language=eng -metadata:s:a:0 title="Default" \
  -metadata:s:a:1 language=jpn -metadata:s:a:1 title="Japanese" \
  -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
  -metadata:s:s:1 language=jpn -metadata:s:s:1 title="Japanese" \
  -c:v copy -c:a libopus -c:s srt  multi-audio-subtitle.mkv

音声に関しては

  • オリジナル
  • 日本語

が選択可能になります。

字幕に関しては

  • なし
  • 英語
  • 日本語

が選択可能になります。

AWS サービスと連携させる

今回は

  • 音声データ
  • 字幕データ

をユーザーが何らかの方法で作成済みという前提で手順を紹介しました。

AWS のマネージド・サービスを活用してシステム化したい場合

  • 音声データの生成
    • Amazon Polly
  • 字幕データの生成
    • Amazon Transcribe(音声からテキストの抜き出し)
    • Amazon Transcribe(別言語への翻訳)

などが使えます。

次のブログは、AWS マネージド・サービスを活用してソリューション化する上で、参考になるかと思います。

Create video subtitles with translation using machine learning | AWS Machine Learning Blog

それでは。

参考