やりたいこと
特に進歩の早い領域(例えばニューラルネット界隈)は、書籍化や公式な翻訳は待てず、MOOCs、講演などの動画も貴重な情報源である。でも、最新の研究や、技術動向を追う上で、言語がどうしてもハードルになる。しかも一人じゃなく、チームを対象とする場合、英語力の向上というような数年単位のプロジェクトには頼れない。なんとかしたい。
例えば、個人でもLesson 1: Practical Deep Learning for Coders - YouTubeの字幕を全訳したが、かなり骨だった。というかその後Lesson 2 - 7全訳の山が高すぎて登りきれてない。例えば、Google翻訳APIの精度が上がり、そのまま使っても実用に耐えるレベルになった。しかし、一部制約によりYouTubeの字幕作成はその恩恵にあずかれていない。
せめて字幕作成でもGoogle翻訳APIの精度向上を活用したい。
課題
YouTubeの字幕は、YouTube CREATOR STUDIO
の字幕エディターにおいて候補が自動翻訳される。しかし複数フレームに分かれた一文が、分かれたまま翻訳されるため、翻訳の精度が落ちる。ダウンロードした字幕ファイル(.sbv)を整形し、自動翻訳、再整形するスクリプトを作成する。
対処
下記のように前処理を行いたい。文を繋げることで自動翻訳の精度を上げる。また、タイミングマークを残すことで、抄訳ではそのまま字幕ファイル(.sbv)を使用できるようにする。
- 改行のみの行 -> 削除
- タイミングを示す行 ->
[[
と]]
で囲まれた中間文字列にする - 改行 -> 半角スペースへ置換
- .(ピリオド)の後ではない中間文字列([[タイミングマーク]]) -> 削除(完全文を阻害するタイミングマークを落とす)
- .(ピリオド)の後の中間文字列([[タイミングマーク]]) -> 削除(完全文を阻害するタイミングマークを落とす)
字幕ファイル(.sbv)の抜粋例
翻訳中の Lesson 2: Practical Deep Learning for Coders - YouTube を例にあげる。
-
Add Translations
からYouTube CREATOR STUDIO
の翻訳画面にいく -
Subtitle/CC Translate
タブを選択 -
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, ...
として参照できる
置換手順
- 改行のみの行 -> 削除
- 置換前:
^\n
- 置換後: (なし)
- 置換前:
- タイミングを示す行 ->
[[
と]]
で囲まれた中間文字列にする- 置換前:
^([0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+)\n
- 置換後:
[[$1]]
- 置換前:
- 改行 -> 半角スペースへ置換
- 置換前:
\n
- 置換後:
- 置換前:
-
. [[.+]]
以外の[[.+]]
は削除- 置換前:
([^\.] )\[\[[0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+\]\]
- 置換後:
$1
- 置換前:
-
. [[.+]]
は、前後を改行- 置換前:
([\.]) (\[\[[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
一行ずつ処理をするのではなく、ファイルを全て読み込んでから処理をする
翻訳後の処理
- "。"で改行する
- 置換前:
。
- 置換後:
。\n
- 置換前:
-
[[
と]]
の囲みをとる- 置換前:
^[[([0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+)]]
- 置換後:
$1
- 置換前:
生成.sbvファイルをYouTube CREATOR STUDIOで読み込む
落とされているタイミングマーク分、一回の字幕表示が多く、また行数が増えるが実用に耐えることが確認できる(はず)
まとめ
前処理を行うことで、自動翻訳であっても、視聴に耐える字幕を、簡単につくることができた。自学自習に使っても良いし、これを使って字幕を量産すると、コミュニティに貢献することもできる。
最新の研究や、技術動向を追う上で、言語がどうしてもハードルになる。ちょっとでもそれが低減できたら幸い。
参考
- 動画によっては字幕編集を許可していないものがある(そのほうが多い?)。その場合も字幕をダウンロードできる方法があるようだ
- 自学自習の時に
CREATOR STUDIO
を使わず、字幕をsyncして表示できる方法があるかは要確認 - 字幕が準備されている場合、自動生成された場合で、上記の翻訳精度がかわるのかは要確認(もしかしたら、字幕ファイルの準備方法に依存した、局所的な問題かも?)