CourseraのWebVTT形式字幕をGCP Cloud Translation APIで翻訳する

この記事は[品川 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/shinagawa)の24日目です。

最近会社の補助もあってCourseraのコースを受講しています。多くが英語の講座ですが、有志により日本語字幕が付いているものもあります。
しかし、「日本語字幕あり」とされているコースでも一部の字幕がない場合があります。例えば[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning)は2,3,5週目には殆ど日本語字幕がありません。そこでGCP Cloud Translate APIで日本語字幕を作ってみました。

## はじめに

一式を[gist](https://gist.github.com/kitakita/c2d1de34798fc8ec2b0be699465f7312)に置きました。これの解説記事です。
人に見せる用には何もしてないのでファイル名からしてアレですがご容赦ください。

## Courseraとは

[Coursera](https://www.coursera.org/)はオンライン講座サービスです。学習は動画だけでなく、Jupyter Notebookなどを用いたプログラミングの実践や宿題があります。フォーラムでは他の生徒やTAとのディスカッションができます。
各講座のレビューは他記事に譲りますが、私は自力で調べたりするよりもかなり効率の良い学習方法だと感じました。

## WebVTTとは

WebVTTはHTMLの `<video>` 要素内で動画に字幕を付けるためのテキストフォーマットです。シンプルなフォーマットで、以下の様な構造になっています[^1]。

```
WEBVTT

1
00:00:00.000 --> 00:00:01.755
Hello, I'm Carolyn.

2
00:00:01.755 --> 00:00:03.795
I'd like to welcome
you to our course

3
00:00:03.795 --> 00:00:06.505
on Machine Learning for
Business Professionals.
```

見て分かるように字幕を表示する再生時間と、字幕内容のペアになっています。詳細なフォーマット形式は[MDNのWebVTTドキュメント](https://developer.mozilla.org/ja/docs/Web/API/Web_Video_Text_Tracks_Format)に書かれています。装飾タグなども使えますが、Courseraの場合上記のようなシンプルなテキスト形式になっているようです。

最近では[VLC Media Player](https://www.videolan.org/vlc/index.ja.html)など、多くのメディアプレイヤーもWebVTTの字幕に対応しています。例えばVLCでは動画と同じファイル名の `.vtt` ファイルが同じフォルダ内にあれば勝手に読み込んでくれます。Android版アプリでも同様です。

## Cloud Translation APIとは

Google翻訳のWebサービスと違って有償です[^2]。[紹介ページ](https://cloud.google.com/translate/?hl=ja)にはAutoML TransrationとTranslation APIの2つがありますが、後者の方です。

課金は1文字単位で行われ、料金目安として「30分動画だと20,000文字で0.8ドル」という感じです。他の例えだと[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning)の1～5週全ての日本語字幕の無い動画を翻訳したら約1,500円になりました[^3]。

## 処理の流れ

ここからWebVTT翻訳スクリプトの説明をします。
大まかな処理の流れは以下の通りです。

1. 1つの字幕は文の途中で切れていることがあるので、字幕を連続で読みこみ、ピリオド/感嘆符を見つけたらそこで1つの文を組み立てる。
2. 組み立てた文を翻訳する。
3. 翻訳後の文を元の字幕のようにバラすため、翻訳前の字幕ごとの文字の数を記憶しておきその比率で翻訳文を分割する。
4. WebVTTの形式に組み直す。

### 例

例えば以下のような字幕があったとします[^1]。

```
2
00:00:01.755 --> 00:00:03.795
I'd like to welcome
you to our course

3
00:00:03.795 --> 00:00:06.505
on Machine Learning for
Business Professionals.
```

まずピリオドまでで1つの文にまとめます。このときID `2` 文字数は `37` 、 ID `3` の文字数は `47` であることを覚えておきます。
そして文を翻訳します。

```
翻訳前: I'd like to welcome you to our course on Machine Learning for Business Professionals.
翻訳後: ビジネスプロフェッショナル向けの機械学習に関するコースにようこそ。
```

ここで翻訳文を元の2つの字幕にバラします。
元の字幕の文字数比率は `37:47` なのでこの比率に基づいてバラします。しかし単語の途中や「の」や「を」といった助詞の前で切れると読みづらいので、そこでは切らないようにします。
結果的に以下のようになります。

```
00:00:01.755 --> 00:00:03.795
ビジネスプロフェッショナル向けの機械学習に関する

00:00:03.795 --> 00:00:06.505
コースにようこそ。
```

普通に翻訳するならこれは1つの字幕で表示してしまう長さなので、ちょっと違和感がありますね。改善の余地は沢山あると思います。

もう一つ、上記に続く文ではこうなります。

```
4
00:00:06.505 --> 00:00:08.160
I lead a team of machine learning

5
00:00:08.160 --> 00:00:10.080
engineers who have successfully

6
00:00:10.080 --> 00:00:12.450
implemented many
machine learning projects

7
00:00:12.450 --> 00:00:14.475
across various industries.
```

```
00:00:06.505 --> 00:00:08.160
私は、さまざまな業界で

00:00:08.160 --> 00:00:10.080
多くの機械学習プロジェクトを

00:00:10.080 --> 00:00:12.450
成功裏に実装した機械学習エンジニアのチームを

00:00:12.450 --> 00:00:14.475
率いています。
```

機械翻訳な文章はともかくとして、良い塩梅で字幕がバラせてるのではないでしょうか。

## その他ライブラリ等

- [webvtt-py](https://pypi.org/project/webvtt-py/): WebVTTのパースと構築に使いました。IDには対応していないらしく翻訳後のファイルから消えてしまいますが、字幕の表示にIDは不要なため問題はありません。
- [MeCab](https://taku910.github.io/mecab/): 単語の判別と品詞の判定に使いました。
- [google-cloud-translate](https://pypi.org/project/google-cloud-translate/): Cloud Translation APIを簡単に使うPythonライブラリです。認証は環境変数にAPIトークンファイルを設定することで行います。

## 既知の問題

- 区切りがいまいちなことがある
    - 様々な問題により字幕の分割がアンバランスになってしまうことがあります。
- 3つ以上連続する助詞や句読点をうまく区切れない
    - ロジックを組むのを怠けているだけなのですが、まれに行頭が句読点になってしまうようなパターンがあります。
- ピリオドの無い文章には適用できない
    - Deep Learning Specializationの4週目、Parameters vs Hyperparametersがそうだったのですが、ピリオドの無い翻訳があります。流石にこのロジックだと無理でした。
- 専門語の翻訳がうまくいかない
    - Google翻訳は割とAIの専門用語をうまく翻訳してくれますが、それでも直訳してしまうことがあります。
    - APIの機能で「辞書を作って登録する」という事もできますが、そこまで労力をかけなくても脳内変換できるのでいいかな…という気持ちです。

## まとめ

英語の聞き取りが苦手でも、字幕のサポートがあれば機械翻訳であってもかなり理解の助けになるように感じます。
Courseraには素晴らしい講座が沢山あります。体系化された知識を得るには記事や本を読むよりずっと効率的だと思うので、試してみてはいかがでしょうか。

[^1]: [Machine Learning for Business Professional](https://www.coursera.org/learn/machine-learning-business-professionals)の1週目、Introductionからの引用。この講座は修了書が不要であれば無料です。
[^2]: [無料でGoogle翻訳APIを使う試み](https://qiita.com/tanabee/items/c79c5c28ba0537112922)もあります。試してはいません。
[^3]: スクリプトを作りながらだったので、試行錯誤で使った分も含んでいます。