Drafts

@cm3 の草稿置場 / 少々Wikiっぽく使っているので中身は適宜追記修正されます。

動画の画像形式のvobsub字幕ファイルをテキストsrt化する

あるドラマのDVDを購入して、それを使ってちょっとしたアプリケーションを作ろうと思った。 アイデアの中心は、字幕ファイルを引き出して、アノテーションを行って、そのアノテーション(=動画の解説)を中心に元の動画を見れるようにする/動画を中心にその解説を見れるようにする、ということだった。土日に趣味でやっているが、営利を目的としない上演等(第38条) 相当でドラマ自体も学会で放映はできるだろうから、機会があれば披露するかもしれない。

DVDから字幕を含め、動画ファイルを引き出すには HandBrake: Open Source Video Transcoder を使った。特に暗号化とかはされていなかったのか勝手に裏で解除してるのかは知らないが、さっくりできたので、「私的使用目的であっても,暗号方式による技術的保護手段の回避により可能となった複製を,その事実を知りながら行う場合には,民事上違法」 というのには引っかからないはずである。

そこで字幕付きの mkv ファイルに変換するが、中に含まれている字幕ファイルは実は画像だった。確かに再生時に VideoLAN のフォント設定を変えても全然反映されないなと思っていたのだ。中に含まれているファイルを取り出すのには、HugFlash を使った。説明を読んでも全く関係なさそうに思えるソフトウェアだが、flashに限らず動画のコンテナフォーマットはだいたい適当に分解してくれるので便利なのだ。分解されて出てきたものは

  • delay_info.txt(音声と動画のズレについての情報が記述されている)
  • m4a(音声)
  • mp4(動画)
  • idx(VobSub index file。テキスト形式で動画の設定や字幕を付ける時間位置のリストが示されている)
  • sub(実際の字幕が固められている)

の5つのファイル。字幕に関係するのは idx と sub のファイルで、変換ツールを試しまくった。ちなみにsubが画像だったと言ったが、それは ここ に記述されている形式に則っていると思われる。後述の成功した subp2png が spudec.h を使ってて、それがこの形式を扱っているので。Matroska (mkv) 自体は字幕の取り扱いがかなり柔軟であり、画像でもテキストでも組み込めるが、そこの仕組みはあまり詳しくないです。

まず、おススメから紹介すると

SubtitleEdit

https://github.com/SubtitleEdit/subtitleedit

エディタなのだが、 Tesseract が同梱されているので OCR ができる。また、あやふやなOCRについては画像をみながら訂正できるなどの利便性もある。

f:id:cm3ak:20200526223520p:plain
Subtitle Edit で最新の Tesseract を使う

デフォルトでは2020/5現在Tesseract 3系を使うようになっており、とても精度が悪く、およそ使えたものではなかった。プルダウンメニューで 5系を使うように変えなければいけない。


他に成功したものとしてはプログラミング知識皆無でオンラインでできる次のもの。

Subtitle Tools

https://subtitletools.com/convert-to-srt-online

オンラインのツール。プレミアム会員じゃないと結構待たされた。はじめ7人待ちで、途中で1人プレミアム会員の割り込みがあって、1時間くらい待ったかな。でも、ほぼ知識なしで十分満足できるものが出てくるという意味では超便利。「♪♪」が「rr」と認識されていたり、英語に混じる多国語のアクセント記号が無視されたりといった程度の誤認識で、十分に使い物になる。

f:id:cm3ak:20200523183859p:plain
subtitletools の修正画面

プレミアム会員なら画像ファイルを見ながら修正を施すこともできるようだ。ただし、目的がアップロードそのものになく公開されない前提でアップロードしているとはいえ、字幕が含まれるデータをアップロードすることになるので、法的にはグレーだろうけれど、ちょっと不安である。そもそも警察は細かいことが理解できないし…。ちなみに字幕だけでも違法アップロードで逮捕例はある→ 映画の日本語字幕を勝手に作成してアップロード、国内初の逮捕者 -INTERNET Watch


次のものは簡単に使えてシンプルなツールで、srt ファイルは生成されるが、idx ファイルを利用していないために字幕の時刻が正しく生成されない。

pyvobsub2srt

https://github.com/andrewjw/pyvobsub2srt

実質100行のスクリプト。せっかくだから解説しよう。main は引数や環境を読み込みつつ process_file という関数を読み込んでいて、そこから3つの関数を呼ぶという構成になっている。

  • process_file: mainからまず呼ばれている関数。subp2png という sub ファイルから画像を取り出すスクリプトを呼んでいる。これはOGMRip に含まれていて apt install ogmrip で使えるようになる。副産物としての時間と画像のリストが含まれているxmlを get_xml_text で解析して画像のリストを取り出し、必要に応じてImageMagickのconvert関数 や自前の should_invert 関数で画像の前処理の判別をし、get_subtitle_text でテキストを取り出して SRTのフォーマットにして吐き出している。
  • get_subtitle_text: pyocr で画像から文字にしている。
  • should_invert: 字幕は背景と区別するように輪郭を別の色で囲っていることが多い。場合によっては背景色と文字色が同じで輪郭だけが別の色ということもある。それが認識を妨げかねないので、(0,0) の色を背景色とみなし、順に走査していって初めて出会った別の色を枠の色、次にであった別の色を文字色とみなし、それを元に (背景色, 画像を色反転させるべきか) のペアを返している。
  • get_xml_text: xmlを解析してimageタグの中にある画像ファイルのパスをリストとして返す。

途中、eng の traindata が無いという tesseract のエラーがあったけれど、tessdata/eng.traineddata at master · tesseract-ocr/tessdata からダウンロードしてエラーに言われた通りの場所に置けば大丈夫だった。あと、Pythonは3系で使いたいから、2to3 - Python 2 から 3 への自動コード変換 — Python 3.8.3 ドキュメント をしたり、3系では不要な.encode("utf8") を消したりした。一応python3対応したということでフォークしておいた。

cm3/pyvobsub2srt: A Python script to convert vobsub subtitles into srt format using tesseract for ocr

subp2png の利用している spudec.c が idx を使っていないので xml 生成の時点で時間情報が不正確だ。この点をスクリプトの方で直せば使い物になるが SubtitleEdit の方が上手くいってしまったので、放置している。


他に試したツールを列挙しておく。

  • MKVToolNix これはsubからではなく、MKVから直接字幕を読み込める。確かにGUIでは読み込みに成功しているのがわかるのだが、そこから画像を取り出すには別途 MKVExtractGUI-2 download | SourceForge.net というものを使う必要があり、ここのレビューに書かれているように、最新のMKVToolNixに対しては使えなくなってしまっているようだ。
  • CCExtractor/ccextractor: CCExtractor - Official version maintained by the core team 基本はコマンドラインで使うもので、GUIで複雑なオプションを設定できるものがついてくる。色々設定をいじってみたが、プレビューでは文字化けしているし、そもそも結果が出力されないわで、諦めた。あとで Google Summer of Code – Work Product Submission – Abhinav Shukla こんなのがあるのに気づいたので、こういうのを使えばなんとかなるかも?
  • Aegisub Advanced Subtitle Editor これはコンバータではなく字幕のエディタなのだが、mkvやsubといった拡張子からの読み込みをサポートしているので、一応試してみた。ただ、字幕がテキストとして保存されている場合に限るようで、subファイルを読み込もうとしても "Cannot convert from utf-8 to binary" という的外れなエラーが出て読み込むことはできなかった。今回と同じく sub 拡張子を持つもので、テキスト形式なものとしてMicroDVD の形式があるのでそれを想定しているのかも。
  • ruediger/VobSub2SRT: Converts VobSub subtitles (.idx/.srt format) into .srt subtitles. Ubuntu 20系でインストールしようとしたのだが、"Unable to build: requires compiler support for the ISO C++ 2011 standard" 系のエラーが出て、"set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")" を CMakeLists.txt に追加しろみたいなアドバイスが大量にヒットするものの、うまくインストールにこぎつけなかった。