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

## やりたいこと

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

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

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

## 課題

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

## 対処

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

1. 改行のみの行 -> 削除
1. タイミングを示す行 -> `[[` と `]]`で囲まれた中間文字列にする
1. 改行 -> 半角スペースへ置換
1. .(ピリオド)の後ではない中間文字列([[タイミングマーク]]) -> 削除(完全文を阻害するタイミングマークを落とす)
1. .(ピリオド)の後の中間文字列([[タイミングマーク]]) -> 削除(完全文を阻害するタイミングマークを落とす)

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

翻訳中の [Lesson 2: Practical Deep Learning for Coders - YouTube](https://www.youtube.com/watch?v=e3aM6XTekJc&t=25s) を例にあげる。

1. `Add Translations`から`YouTube CREATOR STUDIO`の翻訳画面にいく
1. `Subtitle/CC Translate`タブを選択
1. `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`
	- 置換後: (なし)
1. タイミングを示す行 -> `[[` と `]]`で囲まれた中間文字列にする
	- 置換前: `^([0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+)\n`
	- 置換後: `[[$1]]`
1. 改行 -> 半角スペースへ置換
	- 置換前: `\n`
	- 置換後: ` `
1. `. [[.+]]` 以外の`[[.+]]` は削除
	- 置換前: `([^\.] )\[\[[0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+\]\]`
	- 置換後: `$1`
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](http://uxmilk.jp/8662)  
> Pythonで、正規表現により文字列を置換するライブラリについての説明

> [Python: 正規表現で複数行マッチングの置換を行う - 無粋な日々に](http://messefor.hatenablog.com/entry/2017/01/15/215722)  
> 正規表現へ一致する箇所が複数行にまたがる場合の注意点

> [pythonでファイルを読み込んで改行を消す【ファイル読み込みの注意点】 - Qiita](http://qiita.com/moritama1515/items/bc37c3d7d5280c877950)  
> 一行ずつ処理をするのではなく、ファイルを全て読み込んでから処理をする


### 翻訳後の処理

1. "。"で改行する
	- 置換前: `。`
	- 置換後: `。\n`
1. `[[` と `]]`の囲みをとる
	- 置換前: `^[[([0-9]:[0-9]+:[0-9]+.[0-9]+,[0-9]:[0-9]+:[0-9]+.[0-9]+)]]`
	- 置換後: `$1`


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

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


## まとめ

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

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


## 参考

- 動画によっては字幕編集を許可していないものがある（そのほうが多い？)。その場合も字幕をダウンロードできる方法があるようだ
- 自学自習の時に`CREATOR STUDIO`を使わず、字幕をsyncして表示できる方法があるかは要確認
- 字幕が準備されている場合、自動生成された場合で、上記の翻訳精度がかわるのかは要確認（もしかしたら、字幕ファイルの準備方法に依存した、局所的な問題かも?)