YouTube
GoogleTranslateAPI
translate
字幕
ローカライズ

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