LoginSignup
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-07

やりたいこと

特に進歩の早い領域(例えばニューラルネット界隈)は、書籍化や公式な翻訳は待てず、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して表示できる方法があるかは要確認
  • 字幕が準備されている場合、自動生成された場合で、上記の翻訳精度がかわるのかは要確認(もしかしたら、字幕ファイルの準備方法に依存した、局所的な問題かも?)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26