アプリケーション開発 ソフトウェア関連

MP4ファイルから字幕データの抽出

投稿日:2020年7月20日 更新日:

このページでは、Windows10にてffmpegとPowershellを利用して、MP4ファイルから字幕データを抽出する方法を説明しています。

使用するMP4ファイルについて

ここで使用するMP4データは、字幕を選択できる状態になっているMP4を対象としています。

字幕ファイルからの抽出が可能かの判断は、フリーで利用することのできるVLCメディアプレイヤーで開いた場合に、メニューバーから[字幕]→[字幕トラック]でトラックを選択できるかどうかで確認することができます。

字幕の抽出ができるかは、VLCメディアプレイヤーから行えます

ffmpegの取得と字幕データの抽出

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を元に解説を行っています。

Powershellを利用して字幕データを整える

抽出することが出来たデータには、通し番号、タイムコード、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から字幕を抽出し、フォーマットを成型するまでが行えるはずです。

字幕を抽出してみたいと思っておられる方は、お試しください。

※映画等の翻訳された字幕には著作権が含まれる場合がありますので、法律に違反しない範囲でご利用するようになさってください。

Follow me!

-アプリケーション開発, ソフトウェア関連
-

執筆者:


  1. jn@ehime より:

    初めまして。とても役立つ情報をありがとうございます。バッチファイルなども併せて公開してくださり感謝しています。
    今までMP4BOXを使ってマンスリープログラムなどの字幕抽出をしていたんですが、空白行などのデータを一気に削除する方法を探していたところ、こちらのページを見つけました。
    powershellについても書かれている通りに管理者として実行させたのですが、どうしてもsrtファイルの作成までしか行かず、txtファイルの作成まではできませんでした。

    “Set-ExecutionPolicy RemoteSigned”コマンドを実行させ、”Y”を押してもう一度”Set-ExecutionPolicy RemoteSigned”コマンドを走らせると、”N”のままになっている(Nが黄色)ため、有効にはなっていないようです。

    解決策がわからないのですが、何か良い方法があるでしょうか。
    大変お手数ですが、ご教示いただければ幸いです。
    どうぞよろしくお願いいたします。

    環境は、Windows10の最新版を使用しています。

    • jn@ehime より:

      先ほどコメントを投稿した者です。申し訳ありません。大変お騒がせいたしました。できない理由が判明しました。バッチファイル上に記載していた、デスクトップ上に作成していたフォルダのパスがそもそも違っていたのが原因でした。
      ダウンロードさせていただいたバッチファイルの羅列のうち、ユーザー名のみを変更していたんですが、私はOneDriveでデスクトップは対象フォルダにしていないため、C:\Users\****\DESKTOP\MP4字幕抽出
      にする必要がありました。
      そのようにパスを変更したところ、*.TEXTファイルも無事に作成されました。
      Powershell上の実行ポリシーの変更はうまくいっていたようです。
      そして字幕そのもののみきちんと抽出されました。

      大変お騒がせいたしました。
      そして有用な情報を公開してくださったことに改めて感謝いたします。

      • hr より:

        jn@ehime様

        ご自身で無事に解決なされたようで良かったです。

        またご不明の点、うまく動作しない内容、解決されたい問題点などありましたら、
        気軽に書き込みor公開メールアドレスなどからご連絡いただけましたらと思います。

        hr

hr へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.

関連記事

no image

【Zoom】ジェスチャーで「手を挙げる」アクションができるようになった機能を試してみる【iPad版】

Zoomで多人数でミーティングを行っている時に、”手を挙げる”機能を用いて自分が発言したい意思を伝えることが時折あります。これまでは、PC版ではショートカットキーが準備されてお …

no image

【C#】【VBScript】アプリケーションの自動再起動

このページの内容 この機能を作成した理由ソースコード この機能を作成した理由 24H稼働している工場等のクラサバ系のシステムで、サーバー側ソフトが原因不明のハングアップをしてしまい、夜中に呼び出しを受 …

GASの利用 ~新しい生活様式のためのメモ②~

このページの内容 コーディング(.gs)コーディング(view.html)実行結果メニュー画面のコーディング(menu.html)サーバー側のコーディング全体(.gs) ①のページにて入力画面を作成し …

no image

Zoomの画面共有時に共有音声にノイズが発生

2021年6月下旬頃に行われたのZoomのアップデートを適用後に発生した現象の解決 このページの内容 発生状況について発生したPCについて考察と対応 発生状況について ・6月の下旬にZoomのアップデ …

no image

Zoomでミーティングコントロールを常時表示する【iPad版】

コロナの影響でオンラインでのミーティングや帰省が普通になり始めてから早くも一年が経過しようとしています。その中でよく使われるZoomですが、ミーティングの時にちょとしたトラブルなどもまだまだ起きてしま …

このサイトの管理者について

1980年代生まれ
石川県在住

メーカー2社経験後に退社

1年程度自由に在職中はできなかったことにチャレンジ

その後コロナの影響でなかなか仕事が見つかりませんでしたが、無事就職

現在はシステム会社に勤務中

PAGE TOP