字幕情報を利用した Python による動画自動編集 (Videogrep)
昨日 Videogrep というツールがちょっと話題になっていたので使ってみました。字幕情報 (.srt
形式) を用いていわゆる Supercut と呼ばれる編集手法を自動化する Python スクリプトです。
Supercut とは同じ言い回しやフレーズを言っている(あるいは動作を行っている)場面を寄せ集めてテンポのいい合成映像(モンタージュ)を作ることです。コミカルな演出を狙って使われることが多いようですね。
日本語での検索ワードを知らないので分かりやすい例をパパッと挙げるのは難しいですが、この辺でいかがでしょう。
英語のみですが Supercut 動画だけを集めたサイトもあるようです。
インストール
事前準備
まず ffmpeg
が必要です。音声ファイルを書き出す際 ogg
形式を利用するらしいので libvorbis
エンコーダも必要です。
- OS X & Homebrew の場合は以下のコマンドで一発インストールできます。
$ brew install ffmpeg --with-libvorbis
Linux の人も apt-get
あたりを使えば簡単にインストールできるのではないでしょうか。Windowsの人は MinGW
なり Cygwin
なりを使うのでしょうがちょっと大変かも知れません。
続いてここのrequirements.txt に記載されているライブラリ群をインストールしましょう。
$ git clone https://github.com/antiboredom/videogrep $ cd videogrep $ pip install -r requirements.txt
moviepy
やら pytube
やらリッチなライブラリに依存してますな…
脱線
moviepy
単体でも動画編集やネタ GIF を作るのに便利です。以下の記事はmoviepy
を使ってネタ GIF を作る技法を惜しみなく伝えており非常に面白いです。上の
requirements.txt
には載ってないですがmoviepy
でリサイズを使おうとするとPIL
かscipy
かOpenCV
を必要としたと思います。Videogrep
ではリサイズ機能は使わないんですが欲しくなることもあるのでインストールしておくといいでしょう。
$ pip install pillow
使ってみる
今のところ Python スクリプトとしてのみ使えるようです。git clone
して videogrep.py
のあるフォルダに降り、
$ python videogrep.py --input /path/to/{target.{mp4|srt}|folder} --search 'search phrase'
というのが基本的な使い方になります。このコマンド一発で、あとは 'search phrase' に引っかかった場面を supercut した動画を吐き出してくれます。ここで注意しなければならないのは /path/to/target.{mp4|srt}
のあるフォルダには同名の動画or字幕ファイル target.{mp4|srt}
も置かれている必要があるということです。これはやや不自由ですがそういう規約として作ったみたいなので受け入れるしかないです。
しかし利用例として誰にでも手に入れられる日本語動画と字幕がないかと探してみたのですがなかなか難しいですね。映画字幕 というサイトもあるようですが元の映画を持ってないと厳しい。
ところで関係ないですがここで羽生さんの TEDxTokyo の動画を貼っておきます。
まず YouTube の字幕ファイルは(存在すれば) videogrep/tools/getyoutubecc.py
を使えば手に入ります。
$ python getyoutubecc -v [動画のID] -l ja [動画のID].srt というファイルができている
動画をダウンロードするには videogrep/tools/videodownloader.py
が使えますがこれは投稿者のビデオ一覧からまとめて落とすためのものらしいので一つの動画を落とすのには不便です。pytube
がせっかくインストールされているので自作のスクリプトでごにょごにょしてみるのもオツでしょう。getyoutubecc
にしろ videodownloader
にしろ簡単なスクリプトなので Python 初心者の人は読んでみるともしかしたら勉強になるかもしれません。
字幕ファイルと動画ファイルが揃ったら同じ名前にリネームし、あとは最初の使い方で述べたようにコマンドを実行すれば自動的に変換されます。
$ python videogrep.py --input habu.mp4 --search "ですね" Creating clips. 25.664 to 27.397: 私はですね 普段はほとんど 29.495 to 31.571: こうやって話をするのがですね 34.069 to 37.341: せっかくですね こういった機会を頂きましたので 41.244 to 46.575: 今日はですね 棋士というのがどんな風なプロセスで 56.246 to 59.056: 「読み」というものなんですね 69.238 to 71.865: 基本中の基本というのがですね 84.153 to 87.258: その三手の読みということですね 87.258 to 89.967: これは将棋に限らずですね 92.013 to 94.164: 結構そういうことをですね 97.868 to 99.575: 通常の場合はですね ... (中略) ... MoviePy: building video file supercut.mp4 ---------------------------------------- Writing audio in supercutTEMP_MPY_to_videofile_SOUND.ogg Done writing Audio in supercutTEMP_MPY_to_videofile_SOUND.ogg ! Writing video into supercutTEMP_MPY_to_videofile.mp4 |#####-----| 1396/2747 50% [elapsed: 00:39 left: 00:38, 35.53 iters/sec]Warning: in file supercut.mp4.tmp0.mp4, 2764800 bytes wanted but 0 bytes read,at frame 1397/1398, at time 58.21/58.22 sec. Using the last valid frame instead. Done writing video in supercutTEMP_MPY_to_videofile.mp4 ! Now merging video and audio: MoviePy Running: >>> ffmpeg -y -i supercutTEMP_MPY_to_videofile_SOUND.ogg -i supercutTEMP_MPY_to_videofile.mp4 -vcodec copy -acodec copy supercut.mp4 ... command successful. Your video is ready ! Fingers crossed for the Oscars !
--output filename
で出力ファイル名を指定しないとデフォルトでは supercut.mp4
というファイルが出来上がります。ちゃんと自動カットされているでしょうか?
弁解: 羽生先生を選んだのはたまたま字幕が付いていたというだけで他意はありませんスイマセン。10 分弱のプレゼンで 40 回「ですね」と言っていたのでおもしろおかしく抽出した面は否めませんが、さすがに趣味が悪いのでアップロードは控えておきます。動画を手元に置いておく習慣がないのでテストデータを探すのにも一苦労したという話でした。
高度な使い方
複数の動画ファイルを一度にまとめたり、pattern を利用して文章構造を解析することも可能なようです。また頻出ワードを探すのには N-gram などのような手法でコロケーションを調べたりするとよりメカニカルに編集できて面白いかもしれません。ちなみに pattern
でできる文章構造の解析は言語が限られている(英語の他にも複数言語使えるが日本語はない)ようなので日本語をちゃんと解析したかったら自力で MeCab を叩くことになるでしょう。
おまけ:srt ファイルの作り方
動作は確認してないですが HN でいくつかの字幕作成エディタの名前が挙がっています。
Aegisub Advanced Subtitle Editor
アニメ字幕作成のスタンダードらしい。Windows, OS X, Linux すべてで動作する
GTK+2 製の *nix 環境で動作するエディタ
Windows 用
subler - Google Project Hosting
Mac OS X 向け
Gnome Subtitles | Video subtitling for the GNOME desktop
これも *nix 環境向け