このページでは、Windows10にてffmpegとPowershellを利用して、MP4ファイルから字幕データを抽出する方法を説明しています。
ここで使用するMP4データは、字幕を選択できる状態になっているMP4を対象としています。
字幕ファイルからの抽出が可能かの判断は、フリーで利用することのできるVLCメディアプレイヤーで開いた場合に、メニューバーから[字幕]→[字幕トラック]でトラックを選択できるかどうかで確認することができます。

ffmpegのダウンロードページから、ダウンロードすることができます。

下のような画面になるのでArchitectureの項目で、ご自身のOSに適応したものを選択し、[Download Build]をクリックするとダウンロードが開始されます。
※Versionはいろいろありますが、利用してみてうまく動作しない場合に他のをダウンロードするという考えで大丈夫だと思います。

Zipファイルがダウンロードされますので、ダウンロード先のフォルダを開いてZipファイルを展開します。
展開されたフォルダを任意の場所に配置します。
※私はCドライブ直下に、フォルダ名を変更して以下のように配置して利用しています。

以降、このフォルダ構造を元に説明していきます。
この中のbinフォルダにあるffmpeg.exeを利用して字幕を抽出するのですが、このソフトをそのまま起動してもダメなので、コマンドから引数を渡して起動します。
分からない方のために、まとめてダウンロードできるようにしています。
C:\ffmpeg\bin\ffmpeg.exe -i [抽出したいMP4ファイルのパス] [抽出した字幕ファイルの出力先]
-i を指定して実行することで、字幕を抽出することができます。
抽出出来たデータは以下のようにテキストで確認することができます。
※以降ダミーの字幕データで解説していきます。

※その他にもある字幕抽出アプリケーションについて
字幕データの抽出を行う際に知られているものとしては、“My MP4Box GUI”というツールを利用することも出来ますが、私の場合一部のMP4ファイルでは字幕を正常に抽出できない(途中で途切れてしまう)ということがあったので、ffmpegを利用しています。
その他にも検索をかけてみるといくつかヒットすると思いますが、フリーで利用でき、開発が継続しているという面でもこのページではffmpegを元に解説を行っています。
抽出することが出来たデータには、通し番号、タイムコード、htmlタグの情報が含まれるため、可読性の点や後々検索などを行う上で少々邪魔になるため、これらの情報を削除したいと思います。
削除の方法は、Windows標準の機能として搭載されている“Powershell”を利用して行います。
手順として今回は、
1.空白行の削除
2.タグの削除
3.タイムコードの削除
4.通し番号の削除
という順番で行っています。
この順番は前後しても問題ありません。
これらを実行するためのPowershellのコードは以下のように書くことができます。
※タグの削除にあたり、こちらのサイトを参考にさせていただきました。https://buralog.jp/powershell-remove-html-tag-from-variables-or-file/
#batファイルから引数として、読み込ませるファイルのパスを指定
Param($path_srt)
#出力先として、ファイル名に".txt"を付加したパスを作成する
$path_text = $path_srt + ".txt"
#ファイルを読み込ませる際に、タグを正規表現を用いて削除する
$Content = (Get-Content -Encoding UTF8 $path_srt) -replace "<(`"[^`"]*`"|'[^']*'|[^'`">])*>",''
#空行削除
$RemoveEmptyRow = $Content | where-object{$_.trim() -ne ""}
#タイムコードの行を削除
$RemoveTimeCode = $Content | Select-String -Pattern "[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]" -NotMatch
#数値のみの通し番号の行を削除
$RemoveRowNo = $RemoveTimeCode | Select-String -Pattern "^[0-9]*$" -NotMatch
#出力
$RemoveRowNo | Out-File $path_text -Encoding UTF8
これらを実行すると上述のファイルが加工されて、以下のようなファイルが作成されます。

上述のffmpeg実行のbatと含めて記載すると、以下のように記述してbatファイルを作成します。
C:\ffmpeg\bin\ffmpeg.exe -i %1 %~n1.srt
powershell C:\Users\*********\OneDrive\デスクトップ\MP4字幕抽出\RemoveTag.ps1 -path_srt %~n1.srt
なお、******部分には、ご自分のユーザー名を記述し、デスクトップに以下に記載するZipファイルを展開して配置してください。
このファイルを実行する際には、この中に含まれるffmpeg.batをテキストファイルとして開き、********部分をご自分のユーザー名に変更して保存。
その後ffmepg.batへ字幕を抽出したいMP4ファイルをドラッグアンドドロップしていただくと、同一フォルダに字幕のテキストファイルが出力されます。
上記ファイルを実行したときに、.srtファイルが生成されるが、.textファイルが生成されない場合があります。
その際は、Powershellが実行できる環境が整っていない可能性があるため、以下の手順で修正を行ってください。
1.Powershellを管理者として実行する

2.”Set-ExecutionPolicy RemoteSigned”と入力し、Enterキーを押下。
変更の実施を問われるので、”Y”を押下する。

これで、MP4から字幕を抽出し、フォーマットを成型するまでが行えるはずです。
字幕を抽出してみたいと思っておられる方は、お試しください。
※映画等の翻訳された字幕には著作権が含まれる場合がありますので、法律に違反しない範囲でご利用するようになさってください。
初めまして。とても役立つ情報をありがとうございます。バッチファイルなども併せて公開してくださり感謝しています。
今までMP4BOXを使ってマンスリープログラムなどの字幕抽出をしていたんですが、空白行などのデータを一気に削除する方法を探していたところ、こちらのページを見つけました。
powershellについても書かれている通りに管理者として実行させたのですが、どうしてもsrtファイルの作成までしか行かず、txtファイルの作成まではできませんでした。
“Set-ExecutionPolicy RemoteSigned”コマンドを実行させ、”Y”を押してもう一度”Set-ExecutionPolicy RemoteSigned”コマンドを走らせると、”N”のままになっている(Nが黄色)ため、有効にはなっていないようです。
解決策がわからないのですが、何か良い方法があるでしょうか。
大変お手数ですが、ご教示いただければ幸いです。
どうぞよろしくお願いいたします。
環境は、Windows10の最新版を使用しています。
先ほどコメントを投稿した者です。申し訳ありません。大変お騒がせいたしました。できない理由が判明しました。バッチファイル上に記載していた、デスクトップ上に作成していたフォルダのパスがそもそも違っていたのが原因でした。
ダウンロードさせていただいたバッチファイルの羅列のうち、ユーザー名のみを変更していたんですが、私はOneDriveでデスクトップは対象フォルダにしていないため、C:\Users\****\DESKTOP\MP4字幕抽出
にする必要がありました。
そのようにパスを変更したところ、*.TEXTファイルも無事に作成されました。
Powershell上の実行ポリシーの変更はうまくいっていたようです。
そして字幕そのもののみきちんと抽出されました。
大変お騒がせいたしました。
そして有用な情報を公開してくださったことに改めて感謝いたします。
jn@ehime様
ご自身で無事に解決なされたようで良かったです。
またご不明の点、うまく動作しない内容、解決されたい問題点などありましたら、
気軽に書き込みor公開メールアドレスなどからご連絡いただけましたらと思います。
hr