Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

pythonで動画に字幕を付ける方法

現在オンライン講義Courseraを利用(聴講)して1から勉強中なのですが、、
Courseraは日本語の講義が全くない!!
一応字幕機能もあるのですが、、、
 ・動画欄の下に字幕文章欄が付いている形式なので動画を見ながら受講しにくい
 ・そもそも字幕も日本語対応しているものが少ない
といった問題が。。。

自分は英語が苦手なのでどうしたものかと悩んだ結果、
”自分で日本語字幕を動画につける!!”
こととしました。

今回はこちらの字幕付与方法についてまとめておきたいと思います。
※字幕を英語⇒日本語に変換する方法はまた後程まとめます!!



■前提

Courseraでは下記ファイル形式がダウンロードできます。
動画:.mp4
字幕:.vtt

そこで今回はmp4ファイル形式の動画にvtt形式の字幕データを付与していきたいと思います!!
さらに用いる言語はpython
理由は、英語⇒日本語に変換する際にスクレイピングを用いて変換が行いたかったためです。

後、OSはUbuntu20.04を用います。
※こちらに関しては理由はないですw

■.vtt形式って?

自分の技術力が浅く、.vtt形式のファイルがなんなのか知らなかったので調べてみました。

【vttファイルとは?】
vttはWebビデオテキストトラックファイルのこと。
Web Video Text Tracksの略でテキストデータファイルです。
字幕やキャプション、説明、章、メタデータなどのWebビデオに関する情報が含まれています。

■動画に字幕を付けてみる

vttファイルを用いてmp4に字幕を付ける際、htmlを用いれば簡単に字幕を付けることが出来るようです。
コードはこちら。

<video controls autoplay src="video.mp4">
 <track default src="track.vtt">
</video>

ただ、、こちらをローカル環境で動作させると

'file:' URLs are treated as unique security origins.

といったエラーになってしまい、字幕動画が再生できませんでした。。
ローカルセキュリティポリシー設定を変更すれば字幕再生できそうだったのですが、、、
https://dev.classmethod.jp/articles/chrome-localfile-security/

設定変えるのもな、と思ったのとそもそもブラウザ立ち上げるのが、、と思ったので
字幕付きの動画を生成させることにしました!!

字幕付き動画再生を行うにあたり、
"ffmpeg"
を用います。
ffmpegがインストールされていない方はこちらのコマンドでインストールしてみてください。

sudo apt-get install ffmpeg

ffmpegを用いた字幕動画生成を行う場合、こちらのコマンドを実行すればOKです。

ffmpeg -i 動画ファイル名 -i 字幕ファイル.vtt -map 0:v -map 0:a -map 1 -metadata:s:s:0 language=jpn -c:v copy -c:a copy -c:s srt 出力動画.mkv

pythonでコマンドを実行するためにはsubprocessを用いればよいので、

cmdline = "ffmpeg -i 動画ファイル名 -i 字幕ファイル.vtt -map 0:v -map 0:a -map 1 -metadata:s:s:0 language=jpn -c:v copy -c:a copy -c:s srt 出力動画.mkv"
res = subprocess.call(cmdline, shell=True)

とすればOKです。

こちらを実行して 、
出力動画.mkvが生成されること
生成された 出力動画.mkvを再生すると字幕が付与されていることを確認して下さい。

さらに、、、
引数で動画ファイル、字幕ファイルを指定して字幕動画を作成するためのコードはこちら。

import subprocess
import sys
import os

args = sys.argv

if args[1].endswith('.mp4') and args[2].endswith('.vtt'):
    cmdline = "ffmpeg -i " + args[1] + " -i " + args[2] + " -map 0:v -map 0:a -map 1 -metadata:s:s:0 language=jpn -c:v copy -c:a copy -c:s srt " + "output.mkv"
    subprocess.call(cmdline, shell=True)

こちらのコードを実行する際に、

python exec.py 動画ファイル.mp4 字幕ファイル.vtt

とすることで指定した動画ファイル・字幕ファイルを元に字幕動画ファイルの作成が行えます。

mkvファイルとは?

先ほどのコードを実行すると字幕動画ファイルが生成されるのですが、mkv拡張子の動画ファイルが生成されます。
このmkvファイルについて解説しておきます。

mkvファイルとは?】
動画と付随する音声や字幕などを収録することができるファイル形式の一つです。
様々な種類のメディアデータを格納する「Matroska」(マトリョーシカ)フォーマットの動画向け仕様で、標準のファイル拡張子は「.mkv」です。
テレビの録画や映画の録画に適したファイル形式のようです。
さらに、複数の言語字幕一括で保存でき、高画質な動画再生が可能という特徴も持っているファイル形式のようです。
https://e-words.jp/w/MKV%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html

■最後に

今回は動画への字幕付与をした字幕動画を生成する方法についてまとめました。
次は英語⇒日本語に字幕を変換していきたいと思います!!