はじめに
Windows10,WSL2上でESPNetの環境構築が終わっていることを前提としています。
前回の記事をまだ読んでいない方は先にそちらを読むことを推奨します。
この記事ではESPNetでVITSモデルをファインチューニングする方法について紹介します。
1. 概要
学習の大まかな仕組みについて説明します。実際の操作を知りたい方は2. VITSをファインチューニングするのところまで飛ばしてください。
※ディープラーニングについては本筋ではないので、厳密な説明はしていません。ご了承ください。
1.1 ディープラーニング
ディープラーニングにあまり馴染みのない方向けに、VITSの仕組みを大雑把に表した図を以下に示します。
テキストを数値に変換し、VITSに入力することでたくさんの変換を経て最終的に音声として出力します。
ディープラーニングにおける学習とは、このたくさんの変換をするパラメータを最適な値に近づくように自動調整することを言います。
図では簡略化のため、白丸や線の数が数えるほどしかありませんが、実際には何百、何千、何万と存在します。
1.2 事前学習
ディープラーニングでは大量のデータを用いて、パラメータを調整していきます。
しかし、大量のデータを個人が用意するのは難しいので、JSUTなどの公開されている大量のデータを利用して学習します。
今回はこの事前学習に要する時間を省くため、zenodoで公開されている事前学習済みのモデルをダウンロードして利用します。
1.3 ファインチューニング
事前学習のモデルでは、JSUTの女性話者の声でしか音声合成することができません。
(そうなるように学習させたのだから当たり前)
そこで、しゃべらせたい声の音声データを最低でも100文(約10分)以上用意して、これを用いて再学習させます。
なんで最初からしゃべらせたい声で学習しないの?
理由は主に3つあります。- データが少ないと学習がうまくいかないことが多い
- 学習にとても時間がかかる
- データを大量に用意するのは大変
モデルをゼロから学習させる場合、パラメータの初期値はランダムに設定され、その値から少しずつ調整していくことになります。
ランダムなので最適な値とは程遠いところからのスタートになり、データが少ないと最適な値に近づきづらく、データが大量に用意できたとしても、それを学習させるのにとても時間がかかります。(つよつよのGPUがあれば早くできますが、そんなものは到底個人では運用できないので)
そこで、大量のデータで学習済みのモデルを持ってきて、その学習済みのパラメータを初期値として学習させることで、これらの問題を改善しようということです。
2. VITSをファインチューニングする
2.1 自動設定スクリプトをダウンロードする
私が学習用のフォルダの作成やシェルスクリプトを自動で構築するシェルスクリプトを書きましたのでそちらをダウンロードします。
ただし、このスクリプトは前回の記事の環境に依存します。
-
ESPNET_ROOT
という環境変数に、espnetディレクトリの絶対パスを登録してあります - espnetディレクトリに
data_root
というフォルダを作成してあります -
TTS_DATA_ROOT
という環境変数にdata_root
の絶対パスを登録してあります
ubuntuが立ち上がったら、以下のコマンドを実行します。
※ペーストは右クリックです
※ペーストした後にエンターを押してください
wget "https://drive.google.com/uc?export=download&id=1O__heHGit7JkFzl1rWZke-eUa8wehrk0" -O create_recipe.sh
chmod +x create_recipe.sh
2.2 音声,テキストデータを用意する
以下の画像と同様の構造でデータを用意してください
- NAME_voice_dataを作成(NAMEは任意)
- NAME_voice_dataの中にvoiceというフォルダ、voice_text.txtというテキストファイルを作成
- voiceの中に音声ファイルをすべて入れる
- voice_text.txtに「音声ファイル名(.wavは書かない):発話内容」の形式で記述
データ用意したら、data_rootフォルダにこれをコピーします。
- エクスプローラーを開く
- アドレスバーに「\wsl$\Ubuntu\home」と入力してエンター(画像1)
- espnet→data_root とフォルダを開き、そこにペースト(画像2~5)
2.3 create_recipe.shを実行する
Ubuntuのウィンドウに戻って、
./create_recipe.sh NAME
と入力してエンター。
注意
コマンドの NAME 部分は2.2で作成したフォルダの NAME と同じにしてください
2.4 all_run.shを実行する
以下のコマンドを実行すると学習を開始することができます。
※2022/03/14コマンド修正
conda activate espnet
cd $ESPNET_ROOT/egs2/NAME/tts1
./all_run.sh
注意
コマンドの NAME 部分は2.2で作成したフォルダの NAME と同じにしてください
実行前にウィンドウの横幅を十分広くしておいてください
事前学習モデルをダウンロードする処理が含まれます。
ウィンドウの横幅が狭いと、進捗バーが画面に収まらず確認できないので、あらかじめウィンドウの横幅を広くしておいてください。
学習が開始されるとこのような画面になります。
3. 学習の様子を監視する
学習を開始したUbuntuのウィンドウはそのままにしておいて、
左下の検索バーにUbuntuと入力して、新たにUbuntuのウィンドウを立ち上げます。
このウィンドウで学習の様子を監視します。
学習の様子は逐次train.log
というファイルに記録されます。
旧
このファイルから学習の様子を逐次表示するコマンドを以下に示します。
tail -f $ESPNET_ROOT/egs2/NAME/tts1/exp/tts_full_band_vits/train.log | grep -oP "2.*INFO:([^=]*=[^=]|[^=]*seconds|[^=]*minutes)"
※2022/03/13追記
logを表示するコマンドを使いやすくするシェルスクリプトを書きました。以下のコマンドでダウンロードできます。
wget "https://drive.google.com/uc?export=download&id=1z5Ma94NUqTphFM0J3z9vONgN9HYM78K7" -O log_viewer.sh
chmod +x log_viewer.sh
使い方は以下の通りです。
./log_viewer.sh NAME
注意
コマンドの NAME 部分は2.2で作成したフォルダの NAME と同じにしてください
実行するとこのような画面になります。
画像はコマンドを直接打っているので赤字ですが、シェルスクリプトを使った場合は白字で表示されます
おわりに
これでエラーが出なければ自作の音声合成モデルが作れます。学習完了までにかかる時間はおそらく1日程度です。
その間は放置でいいので何か別のことをして気長に待ちましょう。
ただし、PCのスペックが低いと、メモリやGPUの専用メモリをほとんど占有してしまうので、負荷の高い作業をするのはおすすめしません...
ゲームなどは相当軽いものでない限り重すぎてできないでしょう。ブラウジングやyoutubeなどの動画視聴は問題なくできるかと思います。(あくまで私の環境では)
参考までに私の環境を書いておきます。
- CPU : AMD Ryzen 5 3600 6-Core Processor 3.59 GHz
- RAM : 16.0 GB
- GPU : NVIDIA GeForce GTX 1660 Super
- OS : Windows 10 Home バージョン21H2 ビルド19044.1586
参考