yukarinライブラリをためしてみる

# 実行環境
- Windows10
    - CPU　　　：Intel(R)Core(TM)i5-4690 CPU @ 3.50GHz
    - メモリ　 ：16GB
    - GPU　　　：Geforce GTX 1070(GPUメモリ8GB)
- Visual Studio 2019
- CUDA10.1
- CuDnn10.1
- Python 3.6.10
- VOICEROID+ 結月ゆかり EX

# 環境準備
***<font color="Red">Windowsで環境を構築する場合は、Python、CUDAが上記のバージョンでないとエラー地獄に陥るので合わせること</font>***

## Visual Studio
<font color="Red">【重要】インストール時に以下を必ずチェックしておくこと。</font>
MSVC v141~
MSVC v140~
私はcupyのインストール時に「error: Microsoft Visual C++ 14.1 is required」が出て詰みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256753/0a96edf3-bcd0-2730-12de-c08ef411bb82.png)

## CUDA + CuDNN
こちらを参考にインストール
[Windows 10 に CUDA ＋ cuDNN をインストール](https://rupic.hatenablog.com/entry/2020/03/24/021455)

## Python(Anaconda)
```bash
conda create -n py36 python=3.6 anaconda
activate py36
```
## 環境変数
cupyのインストールエラー解消のため、色々と試行錯誤していましたので不要な設定もあるかも知れません。

|システム環境変数|値|
|:--|:--|
|CUDNN_PATH|C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1|
|INCLUDE|C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include; C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt; C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared; C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.16.27023\include|
|LIB|C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64; C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt; C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um; C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.16.27023\lib|
|PYTHONPATH|D:\Users\xxxx\MYDesktop\yukarinライブラリ\deep_yukarin\yukarin; D:\Users\xxxx\MYDesktop\yukarinライブラリ\deep_yukarin\become-yukarin|


# yukarin 第1段階学習
READMEに沿って実行、上手くいかなかった部分は変更してあります。

## ライブラリインストール
cupyインストールで躓いた結果、```pip install -r requirements.txt```ではなく下記の順番で個別にインストールしました。

```
pip install numba==0.48
pip install numpy
pip install -U "cupy < 6.0.0"
pip install -U "chainer < 6.0.0"
pip install -U "librosa < 0.7.0"
pip install pysptk
pip install pyworld
pip install matplotlib
pip install tensorflow
pip install tqdm
pip install git+https://github.com/neka-nat/tensorboard-chainer
pip install git+https://github.com/Hiroshiba/become-yukarin

pip uninstall cupy
pip uninstall chainer

pip install cupy-cuda101==6.2.0
pip install chainer==6.2.0
```

## 作業ディレクトリ作成
音声データはinput_wav、target_wavに格納

```bash
mkdir input_wav
mkdir input_feature
mkdir target_wav
mkdir target_feature
mkdir aligned_indexes
mkdir model_stage1
mkdir test_wav
mkdir output
```

## 音響特徴量ファイル出力、アライメント、周波数の統計量
```bash
python scripts/extract_acoustic_feature.py -i "input_wav\*" -o "input_feature"
python scripts/extract_acoustic_feature.py -i "target_wav\*" -o "target_feature"
python scripts/extract_align_indexes.py -i1 "input_feature\*.npy" -i2 "target_feature\*.npy" -o "aligned_indexes"
python scripts/extract_f0_statistics.py -i "input_feature/*.npy" -o "input_statistics.npy"
python scripts/extract_f0_statistics.py -i "target_feature/*.npy" -o "target_statistics.npy"

```

## 第1段階学習
sample_config.jsonからconfig.jsonを作成、編集
```copy  sample_config.json config.json```

```config.json
    "input_glob": "input_feature\\*.npy",
    "target_glob": "target_feature\\*.npy",
    "indexes_glob": "aligned_indexes\\*.npy",
```

```bash
python train.py config.json model_stage1
```
※私の環境では250000回すまでに７時間強かかりました。

## テスト


```bash
python scripts/voice_change.py --model_dir "model_stage1" --config_path "model_stage1\config.json" --input_statistics "input_statistics.npy" --target_statistics "target_statistics.npy" --output_sampling_rate 24000 --disable_dataset_test --test_wave_dir "test_wav" --output_dir "output" --model_iteration 130000
```
第1段階学習後の変換音声はガビガビでとても聞けたものではありませんでした。


# become-yukarin　第2段階学習
READMEに沿って実行、上手くいかなかった部分は変更してあります。

## 作業ディレクトリ作成
音声データはinput_wav_2ndに格納

```bash
mkdir input_wav_2nd
mkdir output_2nd
mkdir model_stage2
```

## ライブラリインストール
```bash
pip install world4py
pip install dill
```

## 音響特徴量ファイル出力
```bash
python scripts/extract_spectrogram_pair.py -i input_wav_2nd -o output_2nd
```

## 第２段階学習
config_sr.jsonをコピー、編集
```copy recipe\config_sr.json config_sr.json```

```config_sr.json
    "input_glob": "output_2nd\\*.npy",
    "batchsize": 2,
```

pickleでエラーとなるので```multiprocessingreduction.py```を編集

```Anaconda3\pkgs\python-3.6.10-h9f7ef89_2\Lib\multiprocessingreduction.py
import dill as pickle
```

```
python train_sr.py config_sr.json model_stage2
```
※私の環境では10000回すまでに７時間かかりましたのでそこで諦めました。

## テスト
yukarinのディレクトリに戻り、第２段階学習モデルをコピー
```xcopy /e ..\become-yukarin\model_stage2 model_stage2```


先ほど編集した```multiprocessingreduction.py```を元に戻す

```Anaconda3\pkgs\python-3.6.10-h9f7ef89_2\Lib\multiprocessingreduction.py
import pickle
```

以下のエラーが出たため、```voice_change_with_second_stage.py```一部修正

```bash
ValueError: 'reverse' is not a valid value for origin; supported values are 'upper', 'lower'
```

```scripts\voice_change_with_second_stage.py
        plt.imshow(numpy.log(f_in.sp).T, aspect='auto', origin='lower')
        plt.imshow(numpy.log(f_low.sp).T, aspect='auto', origin='lower')
        plt.imshow(numpy.log(s_high).T, aspect='auto', origin='lower')
            plt.imshow(numpy.log(f_true.sp).T, aspect='auto', origin='lower')
```


```
python scripts/voice_change_with_second_stage.py --voice_changer_model_dir "model_stage1" --voice_changer_config "model_stage1\config.json" --voice_changer_model_iteration 130000 --super_resolution_model "model_stage2\predictor_10000.npz" --super_resolution_config "model_stage2\config.json" --input_statistics "input_statistics.npy" --target_statistics "target_statistics.npy" --out_sampling_rate 24000 --disable_dataset_test --dataset_target_wave_dir "" --test_wave_dir "test_wav" --output_dir "output_2nd" --gpu 0
```

第２段階学習後の変換音声はひどいネカマボイスといった感じでしたが第１段階と比べると格段によくなっていました。


# 感想
四苦八苦しましたが、一応最後まで実施できました。
結果としては結月ゆかりにはなれませんでしたが、
収録した音声データの精度が悪い ＋ VOICEROID+ EXだとサンプリングレートが22050Hz(VOICEROID2だと44100Hzらしい） ＋ 第2段階学習不足など色々と改善の余地はありました。

# 補足
<details><summary>個人的に困った点</summary><div>
### VOICEROID+ EXでの音声ファイルの分割保存
EXでは音声ファイルの分割保存が機能としてないので以下のツールを使わせてもらいました。
[VoiceroidController](https://github.com/mikoto2000/VoiceroidController)

```bash:実行例
VoiceroidController.exe -o v-0.wav おはよう
VoiceroidController.exe -o v-1.wav こんちには
・
・
・
VoiceroidController.exe -o v-99.wav おやすみ
```

### 学習中のCドライブ
学習中に一時的にファイルを作成しているのか数GB単位で空き容量が減っていった。
Cドライブの容量が貧弱すぎたため、以下のエラーが発生。

```※Visual StudioのWindows 10 SDKを削除する事でなんとか容量を確保した。```

```
ImportError: DLL load failed: ページング ファイルが小さすぎるため、この操作を完 了できません。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256753/68fbae25-a2c3-e409-d843-187788a32cc4.png)

</div></details>

#　参考リンク
[『Yukarinライブラリ』become-yukarin, yukarin コマンド解説](https://qiita.com/atticatticattic/items/37441f3be6916cd1e73a)
[Windowsで誰でも好きなキャラの声になれるyukarinライブラリを動かしてみた。](https://qiita.com/BURI55/items/7bcac3ef68114c193344)