MP4ビデオから字幕を抽出する方法には、ffmpegを使う方法と、mp4boxを使う方法があります。ffmpegを使う方法が簡単です。
まずは、ffmpegを使う方法から。後述のmp4boxだとトラック番号を調べる必要があるので、こちらの方が簡単です。まずは、ffmpegのインストール方法から。macOSであれば、Homebrewを使ってインストールできます。
$ brew install ffmpeg
ffmpegで字幕データ(srt)を抽出する方法:
[書式] $ffmpeg -i (動画.mp4) (出力ファイル.srt)
テキストファイルで「出力ファイル.srt」を開くと、生のSRT(SubRip)形式のデータファイルを得ることができます。
しかし、生のsrtファイルは読みにくいので、人間の読みやすく整形して出力するスクリプトを、なでしこ3で作りました。前提として、Node.jsがインストールされている必要がありますが、以下のようにしてなでしこ3をインストールします。
# なでしこ3のインストール $ npm -g install nadesiko3 # ffmpegのインストール $ brew install ffmpeg
その上で、以下のスクリプトを、jimaku.nako3という名前で保存して、実行権限をつけます。(2018/02/23 更新)
#!/usr/bin/env cnako3 もし、コマンドラインの要素数が3以下ならば 「jimaku.nako3 (動画ファイル)」と表示。終わる。 ここまで MP4 = コマンドライン[3] FSRT=MP4の「\.\w+$」を「.srt」に正規表現置換。 FOUT=MP4の「\.\w+$」を「.txt」に正規表現置換。 「ffmpeg -i "{MP4}" "{FSRT}"」を起動待機。 S=FSRTを開く 結果=空 Sを改行&改行で区切って反復 N=それをトリム もし、N=空ならば、続ける J=(N&改行&改行&改行)を改行で区切る NO=J[0] TIME=J[1] BODY=J[2]&J[3]&J[4] TIME=TIMEの「^(\d+\:\d+:\d+).*」を「$1」で正規表現置換。 BODY=BODYの「(\r|\n)」を「」に正規表現置換。 BODY=BODYの「</font>」を「」に置換。 BODY=BODYの「<font.*?>」を「」に正規表現置換。 BODY=BODYの『{\an7}』を空に置換。 R=「{TIME}> {BODY}」 結果=結果&R&改行 ここまで 結果をFOUTへ保存。 「OK」と表示。
そして、以下のようにして、コマンドを実行すると、人間の目に読みやすい字幕ファイルを生成します。
$ ./jimaku.nako3 (動画ファイル.mp4)
出力されるテキストの例:
... 00:04:22>ヨブ記を読んでくださりじっと耳を傾けました 00:04:28>何度も読んできましたがその時は違っていました 00:04:32>話が心に深くしみました ...
また、多少面倒ですが「mp4box」を使うと、MP4ビデオから字幕を抽出することができます。macならHomebrewでインストールできます。
$ brew install mp4box
使い方ですが、まず、動画の情報を確認します。
$ mp4box -info (動画ファイル.mp4)
すると、各トラックにどんなデータがあるのかが表示されます。そこで、字幕があるっぽいトラックの番号を調べます。
続いて、以下のコマンドを実行すると、字幕をファイルへ抽出できます。
$ mp4box -srt (トラック番号) (動画ファイル.mp4)
出力ファイル名は、「(動画ファイル名)_(トラック番号)_text.srt」という名前になっています。
これをテキストエディタで開くと、
1 00:00:00,000 --> 00:00:05,138 なんとかかんとか 2 00:00:05,138 --> 00:00:08,181 なんとかかんとか ...
という感じのデータとなっています。