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
それでは。