GPUがなくても、Google Colaboratory で Yukarinライブラリを使いたい

<font color="red">**こちらの記事で古い内容なので、新しい記事[「GPU・Linuxがなくても、Google Colaboratoryで『Yukarinライブラリ』を使いたい」](https://qiita.com/atticatticattic/items/0fa84cb6e7d60c56d37d)をご参照ください**</font>

# 概要
お手軽に機械学習環境を使える「Google Colaboratory」を使って、[改変become-yukairn](https://github.com/YoshikazuOota/become-yukarin) の実行方法（第1段まで）を解説します。
音声の収録さえしてしまえば、一番簡単に音質変換できるので、初めての方におすすめです！

一般に、機械学習には GPU付きのLinux マシンを用意する必要があり、環境設定だけでも一苦労します。
しかし、Google Colaboratory」を利用すれば、**ブラウザだけ**で簡単に機械学習をすることが可能です(**GPUもLinuxマシンもいりません**)。
このアイデアは @BURI55 様がくださいました。

**[改変become-yukarinリポジトリ](https://github.com/YoshikazuOota/become-yukarin)**
[「ディープラーニングの力で結月ゆかりの声になる」ための基礎知識とコマンド操作](https://qiita.com/atticatticattic/items/f1e4c671d73d815bbad2) の解説用に作ったbecome-yukarinの改変版です。

## Google Colaboratory とは？
ブラウザ上で、Python の実行環境を提供するサービスです。
イメージ的には、Google のスプレットシートのような、ブラウザで動くアプリケーションのようなものです。

Google アカウントでログインしてから[「Colaboratory へようこそ」](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja#recent=true)の動画をみてもらうのが一番わかりやすいと思います。
英語で話していますが、設定で日本語字幕を出せるので、心配いりません！

特筆すべきなのは、**GPUを使った機械学習**に使えることです。
連続実行は 12時間までで、長時間の学習はできませんが、『ちょっと試してみる』程度であれば十分な学習ができます。
(しかも、GPUの高熱で部屋が暑くならない！)


Google Colaboratory で動作確認を行った Colab Notebook は下記に配置してあります。
[become-yukarin.ipynb](https://drive.google.com/open?id=1i8x3GN5Q-0Fze1_xM33fTON43OBwGzBG)


### 動作確認環境
- OS : Mac OS mojave
- ブラウザ: Firefox (**アドブロックは無効化してください**)
- Colaboratory Notebook: [become-yukarin.ipynb](https://drive.google.com/open?id=1i8x3GN5Q-0Fze1_xM33fTON43OBwGzBG)

**ノートブックはリンクを開いて、『マイドライブに追加』ボタンで自分のGoogle Driveにコピーしてください**


### 参考記事

- [【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)
- [Colaboratoryを使う際のGoogle Driveマウント方法など取り扱いかた色々](https://qiita.com/morimori_japan/items/6c67a2851aa1cee19936)
- [Jupyterの magic command](https://damontallen.github.io/IPython-quick-ref-sheets/)
- [Google Compute Engine(GEC) 上に Google Colaboratory の ローカルランタイムを作成する](https://qiita.com/ikeyasu/items/2350046d81848472f2d0)

### 前提
- 音声収録は終わっている
- Google Drive の基本操作を把握している(アップロード方法など)
- [「ディープラーニングの力で結月ゆかりの声になる」ための基礎知識とコマンド操作](https://qiita.com/atticatticattic/items/f1e4c671d73d815bbad2)
- [【Jupyter Notebook】効果的な使い方を知ろう[Python/機械学習]](https://qiita.com/takuyanin/items/8bf396e7b6b051670147)


### 説明の流れ
- 2. Google Drive, Colaboratory に対応するために 改変become-yukarin を修正
- 3. Colaboratory で実行

## 2. become-yukarin を Colaboratory で動かすための準備
改変become-yukarin を Google Drive, Colaboratory に対応するために、プログラムとファイル名を修正します。
もし、アップロード後に修正ミスなどがあった場合、ファイルの差し替えをしてください(同期させてもいいと思います)。

### 2.1 become-yukarin をローカルにダウンロード
今回は解説の簡略化のため、 become-yukarin お試しリポジトリ([改変become-yukarin](https://github.com/YoshikazuOota/become-yukarin) を使用しました。
オリジナルの become-yukarin は https://github.com/Hiroshiba/become-yukarin になります。
**改変become-yukarinは 2018年 6月頃に作成したものなので、最新のコミットは反映されていません**

### 2.2 config.json を編集して GPUを有効にする
改変become-yukarin では config.json の GPU学習をデフォルトでOFFにしています(````"gpu" : -1```)。
下記のように、```"gpu : 0" ``` と修正してください。

```
  ...

  "train": {
    "batchsize": 8,
    "gpu": 0,
    "log_iteration": 250,
    "snapshot_iteration": 5000
  }

  ...

```

### 2.3 Google Drive で jsonファイルがアップロードできない問題対応
Google Drive には .json がアップロードできませんでしたので、拡張子を書き換えて対応します。
(.json ファイルがアップロードできないのは仕様なんでしょうか？)

.jsonファイルは全部で 5つあります。それぞれ .json を .json_ に変更してください。

```
become-yukarin/dat/config.json_
become-yukarin/dat/config_sr.json_
become-yukarin/recipe/config.json_
become-yukarin/recipe/config_sr.json_
become-yukarin/recipe/recipe.json_
```

### 2.4 become-yukarin の音声ファイル用フォルダに、『自声』と『ターゲット音声(ゆかりボイスなど)』を配置
自分はそれぞれ 500 ファイルほどを置きましたが、試すだけなら 20～50音声ペアで足りると思います。

- become-yukarin/dat/in_1st_my_wav/*.wav  : 『自声』
- become-yukarin/dat/in_1st_yukari_wav/*.wav : 『ターゲット音声(ゆかりボイスなど)』:

### 2.5 train.py の修正
Colaboratory で train.py(学習実行コマンド) を動かすと 82行目の save_args() でエラーが出ます。
理由は把握していませんが、学習処理に影響しない処理なので、コメントアウトで対応しました。

``` train.py(L82,下から二行目)
#save_args(arguments, arguments.output)
```

ちなみに正常に動いた場合、dat/model/yukari_1st/args というファイル名で train.py 実行時の引数が保存されます(下記のような jsonファイル)。
model の管理上必要な場合は、引数をメモして保存しておいてください。

``` args
{
    "config_json_path": "dat/config.json_",
    "output": "dat/model/yukari_1st"
}
```

### 2.6 音質変換テスト用の音声(自声)を設置
学習後、音質変換をするためのテスト音声を、下記ディレクトリに配置してください。

```
test_data/*.wav
```

### 2.7 become-yukarin をアップロード
後の解説に合わせて、Google Drive に "colaboratory" というディレクトリを作り、その中に become-yukarin（2.6 までの処理済み）をアップロードしてください。
その際、アップロードエラーが出ていないか確認をしてください

フルパスは下記の通り

```
マイドライブ/colaboratory/become-yukarin
```




## 3 Colaboraory で機械学習する

### 3.0 予備知識(多分これだけ知っていれば大丈夫だと思います)

- Colaboraory は Pythonの対話モードが、ブラウザで動いているようなもの
- ディレクトリ移動は ```cp [dir]``` の代わりに ```%cp [dir]``` を使う
- コマンド実行するときは先頭に "!" をつける(例 : ```!echo "コマンドテスト" ```, ```!ls -l```など)
- ブラウザを閉じる or 12時間使い切る と、全てやり直し(これをランタイムのリセットと言う)
- 学習中はブラウザを閉じないように！ (90分以内に開き直さないとランタイムリセットされて学習は中断します)
- 挙動がおかしい場合は、メニューの『ランタイム』-> 『全てのランタイムのリセット』で最初からやり直す
- ランタイムがリセットされても、生成したファイルはGoogle Driveに残る

### 3.1 実行方用
Colaboraory で動作確認をした ノートブック [become-yukarin.ipynb](https://drive.google.com/open?id=1i8x3GN5Q-0Fze1_xM33fTON43OBwGzBG) 公開しているので、そちらを参照してください。
コマンドや説明はノートブックに書いてあります。
Google Drive に置いた 改変become-yukarin のパスが```マイドライブ/colaboratory/become-yukarin``` になっていれば、上から順に実行するだけです。

コマンドの詳細などは、下記記事を参照してください。
[「ディープラーニングの力で結月ゆかりの声になる」ための基礎知識とコマンド操作](https://qiita.com/atticatticattic/items/f1e4c671d73d815bbad2) 


### 3.2 補足 Google Drive のマウント
ノートブックにも書いてありますが、Google Drive をマウントする際には下記のコマンドを実行します。

```
from google.colab import drive
drive.mount("/content/drive/")
```

すると、下記画像のような結果が表示され、認証コードの入力が必要になります。
![スクリーンショット 2019-06-13 11.24.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12429/b6ab7d45-5dcc-4786-5de7-4cb6f0560209.png)

下記の手順で認証コードを入力
1. 上記の実行結果に書いてある URLをクリック
2. 『Google Drive File Stream が Google アカウントへのアクセスをリクエストしています』を許可する
3. 認証コードが表示されるの、上記画像の入力欄にを貼り付ける

うまくいけば、画像のように、ディレクトリ表示されます
![スクリーンショット 2019-06-12 15.18.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12429/7c362a72-05e8-a9b7-6ee4-3446f1dcc413.png)

#### 3.3 学習データを使って、音質変換する
2.6 で、配置した自分の音声を実際に変換してみます。
(ブックノートにも書いてあります。)

まずは、学習データがちゃんとあるかを確認してください。
画面左のファイルタブを開き、学習済みデータがあることを確認します。
``` predictor_[数字].npz ```が学習済みデータです。

![スクリーンショット 2019-06-13 19.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12429/f94d0c50-c67e-5d7d-4248-e4008d14a47a.png)

あとは、Notebook の 『4.1 復元処理実行』 の復元コマンドを実行すると、```output/yukari_1st```に復元結果が出力されます。


```
!python scripts/voice_conversion_test.py yukari_1st -iwd dat/in_1st_yukari_wav -md dat/model -it 100000
```
おそらく、初めての音声変換はノイズ混じりになっているかと思います。

高精度化の方法は、下記記事などを参考にしてください。

- [『ディープラーニングの力で結月ゆかりの声になるリポジトリ』のパラメータチューニング(第一段階編)](https://qiita.com/sunnyyone/items/f85c26d6149a200ed119)
- [『ディープラーニングの力で結月ゆかりの声になるリポジトリ』の性能アップ (音質+速度)](https://qiita.com/sunnyyone/items/87abfe9a6ccadebe4e4c#comment-45a588c5f499678cfc69)
- [「ディープラーニングの力で結月ゆかりの声になる」ための第1段の高音質化](https://qiita.com/atticatticattic/items/6d9e29d88e556911d9a3)



#### 3.4 気になる学習スピード
Colaboraory の GPUは "Tesla T4" で、"GeForce RTX2070"と同等のCUDA数があります。
しかし、become-yukarin の config.json の 学習パラメータのままだと、GTX 970 ほどの計算スピードでした。
conig.json のバッチ数などを変更することで、早くなるのかもしれません。

また、Tesla系のGPUは計算精度重視に作ってあるとのことなので、速度重視のGTXシリーズと比較すると、分が悪いのかもしれません(知ってる人教えて！)


**速度比較**
音声ペア数や config.json(学習計算条件)は同じ

| 環境         | GPU       | iteration |  音声ペア数 |  処理時間 |
|--------------|-----------|-----------|------------|---------|
| colaboraory | Tesla T4  | 238500    |  503       | 7.2[h]   |
| 自作PC 1 Ubuntu | GTX 970    | 238500    |  503       | 6.9[h]   |
| 自作PC 2 Ubuntu | GTX 1070Ti | 238500    |  503       | 5.8[h]   |


#### 3.5 もし新規に become-yukarin を動かす notebookを作りたい場合
##### (1) ノートブックの新規作成
メニューから『ファイル』->『Python 3 の 新しいノートブック』 を開く。
become-yukarin は Python 3系で動かす必要があります。
(Python 2系と3系は、別言語レベル互換性がありません)

##### (2) ハードウェアアクセラレータ(GPU)を有効にする
『ランタイム』 -> 『ランタイムのタイプ変更』で設定画面を開き、『ハードウェアアクセラレータ』を『GPU』にします

あとは、自分の公開している notebookのを参考にしていただければ、作れると思います。
(ご質問あれば、コメントしてください。自分も初めて触ったレベルですが、少しは力になれるかもしれません)


#### 3.6 もっと、長時間計算したい！
[Google Compute Engine(GEC) 上に Google Colaboratory の ローカルランタイムを作成する](https://qiita.com/ikeyasu/items/2350046d81848472f2d0)を参考にすれば、時間制限なく機械学習できるようです。
当たり前ですが、Google Compute Engine は[料金](https://cloud.google.com/compute/pricing?hl=ja)がかかります。
GPUを付けるとそれなりにお金がかかります。

試していませんが、Googleのクラウドサービスの無料枠(初年だけ $300/月 まで無料)を、使えば無料枠で運用できるかもしれません。
下記の記事が参考になると思います。

- [Google Cloud Platform の無料枠 ](https://cloud.google.com/free/?hl=ja)
- [これから始めるGCP（GCE）安全に無料枠を使い倒せ](https://qiita.com/Brutus/items/22dfd31a681b67837a74)


## 4 感想
無料で、become-yukarin を実行できるとは思いませんでした。
実行時間に制限があるので、高精度化を狙って長時間学習させるは無理ですが、お試しには十分であることがわかりました。
新規でGPUの購入を検討している方は、一度こちらを試してから検討されるのがいいかと思います。
(しかも部屋が暑くならない(2回目)！ 自分のPCのGPUは80度になり、2台で機械学習回すと、とても暑いです)

~~**最後に、どなたか RTX 2070 を買ってください！**~~
@BURI55 様にプレゼントいただきました！
この場を借りて、御礼申し上げます！
ご恩は yukarin,  realtime-yukarin の記事などを書かせていただく事などで、皆様にもお送りさせていただきたいと思います！(7月ごろになると思いますが)

~~https://www.amazon.jp/hz/wishlist/ls/37GM5BYD278SJ?ref_=wl_share~~

以上、楽しい音質変換ライフを！