Edited at

YouTubeで、精度高い日本語訳字幕を作る方法

More than 1 year has passed since last update.


やりたいこと

特に進歩の早い領域(例えばニューラルネット界隈)は、書籍化や公式な翻訳は待てず、MOOCs、講演などの動画も貴重な情報源である。でも、最新の研究や、技術動向を追う上で、言語がどうしてもハードルになる。しかも一人じゃなく、チームを対象とする場合、英語力の向上というような数年単位のプロジェクトには頼れない。なんとかしたい。

例えば、個人でもLesson 1: Practical Deep Learning for Coders - YouTubeの字幕を全訳したが、かなり骨だった。というかその後Lesson 2 - 7全訳の山が高すぎて登りきれてない。例えば、Google翻訳APIの精度が上がり、そのまま使っても実用に耐えるレベルになった。しかし、一部制約によりYouTubeの字幕作成はその恩恵にあずかれていない。

せめて字幕作成でもGoogle翻訳APIの精度向上を活用したい。


課題

YouTubeの字幕は、YouTube CREATOR STUDIOの字幕エディターにおいて候補が自動翻訳される。しかし複数フレームに分かれた一文が、分かれたまま翻訳されるため、翻訳の精度が落ちる。ダウンロードした字幕ファイル(.sbv)を整形し、自動翻訳、再整形するスクリプトを作成する。


対処

下記のように前処理を行いたい。文を繋げることで自動翻訳の精度を上げる。また、タイミングマークを残すことで、抄訳ではそのまま字幕ファイル(.sbv)を使用できるようにする。


  1. 改行のみの行 -> 削除

  2. タイミングを示す行 -> [[]]で囲まれた中間文字列にする

  3. 改行 -> 半角スペースへ置換

  4. .(ピリオド)の後ではない中間文字列([[タイミングマーク]]) -> 削除(完全文を阻害するタイミングマークを落とす)

  5. .(ピリオド)の後の中間文字列([[タイミングマーク]]) -> 削除(完全文を阻害するタイミングマークを落とす)


字幕ファイル(.sbv)の抜粋例

翻訳中の Lesson 2: Practical Deep Learning for Coders - YouTube を例にあげる。



  1. Add TranslationsからYouTube CREATOR STUDIOの翻訳画面にいく


  2. Subtitle/CC Translateタブを選択


  3. Actions > Downloadを選択すると、(この場合は英語の).sbvファイルが得られる

このファイルを使って、精度向上が見られるか試す。


処理前

元の.sbvファイルの中身は下記のフォーマットである。

1:21:05.270,1:21:09.440

So we need to come up with a way to do mathematical
optimization.

1:21:09.440,1:21:15.310
So rather than showing how to do that wit
a deep neural network, let's see how to do

1:21:15.310,1:21:17.460
it with a line.


処理後

それをこの様に処理することを考える。

[[1:21:05.270,1:21:09.440]]

So we need to come up with a way to do mathematical optimization.
[[1:21:09.440,1:21:15.310]]
So rather than showing how to do that with a deep neural network, let's see how to do it with a line.


翻訳が向上することの確認

処理前と、処理後の文字列を、そのままGoogle Translateにかけてみる。以下の通り、差は一目瞭然だった。


処理前

1:21:05.270,1:21:09.440

だから私たちは数学を行う方法を考え出す必要があります
最適化。

1:21:09.440,1:21:15.310
だからその気分をいかにするかを示すよりも
深い神経回路網、やり方を見てみましょう

1:21:15.310,1:21:17.460
それはラインとそれ。


処理後

[[1:21:05.270,1:21:09.440]]

ですから、私たちは数学的な最適化を行う方法を考え出す必要があります。
[[1:21:09.440,1:21:15.310]]
だから、深いニューラルネットワークでそれを行う方法を示すのではなく、線でそれを行う方法を見てみましょう。


実際の置換、翻訳処理

スクリプト化の前にSublime Textで試行する。まずは手動で置換、Google Translate放り込み、試行する。(todo: shかpythonスクリプト化)


Sublime Textでの正規表現、置換



  • Command + F で検索窓を開く


  • Command + Alt + R で切り替え

  • 正規表現で() で囲った部分は、置換時に $1, $2, ... として参照できる


置換手順


  1. 改行のみの行 -> 削除


    • 置換前: ^\n

    • 置換後: (なし)



  2. タイミングを示す行 -> [[]]で囲まれた中間文字列にする


    • 置換前: ^([0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+)\n

    • 置換後: [[$1]]



  3. 改行 -> 半角スペースへ置換


    • 置換前: \n

    • 置換後:




  4. . [[.+]] 以外の[[.+]] は削除


    • 置換前: ([^\.] )\[\[[0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+\]\]

    • 置換後: $1




  5. . [[.+]] は、前後を改行


    • 置換前: ([\.]) (\[\[[0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+\]\])

    • 置換後: $1\n$2\n\n




翻訳

処理後のテキストをGoogle Translateに放り込む。(todo: APIコールのスクリプト化)


Pythonスクリプト化する


Pythonで文字列を置換する:replace(), re.sub() | UX MILK


Pythonで、正規表現により文字列を置換するライブラリについての説明

Python: 正規表現で複数行マッチングの置換を行う - 無粋な日々に


正規表現へ一致する箇所が複数行にまたがる場合の注意点

pythonでファイルを読み込んで改行を消す【ファイル読み込みの注意点】 - Qiita


一行ずつ処理をするのではなく、ファイルを全て読み込んでから処理をする



翻訳後の処理


  1. "。"で改行する


    • 置換前:

    • 置換後: 。\n




  2. [[]]の囲みをとる


    • 置換前: ^[[([0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+)]]

    • 置換後: $1




生成.sbvファイルをYouTube CREATOR STUDIOで読み込む

落とされているタイミングマーク分、一回の字幕表示が多く、また行数が増えるが実用に耐えることが確認できる(はず)


まとめ

前処理を行うことで、自動翻訳であっても、視聴に耐える字幕を、簡単につくることができた。自学自習に使っても良いし、これを使って字幕を量産すると、コミュニティに貢献することもできる。

最新の研究や、技術動向を追う上で、言語がどうしてもハードルになる。ちょっとでもそれが低減できたら幸い。


参考


  • 動画によっては字幕編集を許可していないものがある(そのほうが多い?)。その場合も字幕をダウンロードできる方法があるようだ

  • 自学自習の時にCREATOR STUDIOを使わず、字幕をsyncして表示できる方法があるかは要確認

  • 字幕が準備されている場合、自動生成された場合で、上記の翻訳精度がかわるのかは要確認(もしかしたら、字幕ファイルの準備方法に依存した、局所的な問題かも?)