🤗

Bert-VITS2 (ver 2.1, 2.2, 2.3) の学習方法(2023-12-01)

2023/12/01に公開

この記事は日本語特化版JP-Extraが出る前のもので、JP-Extra版についての記述はありません。最新の情報は別記事を参照してください。

https://zenn.dev/litagin/articles/034819a5256ff4

宣伝

  • Style-Bert-VITS2という、Bert-VITS2の日本人向け改良版を作っているので、そちらを使うと早いです

https://github.com/litagin02/Style-Bert-VITS2

  • Style-Bert-VITS2のチュートリアル解説動画を作りました

https://www.youtube.com/watch?v=aTUSzgDl1iY

  • discordサーバー「AI声づくり研究会」によく出没しています

https://zenn.dev/p/aivoicelab

概要

(この記事は随時いろいろ更新しています、2023-12-21にver 2.3での方法を加筆)

中華コミュニティの最新のTTS手法である、Bert-VITS2 の学習方法ガイドです。日本語・中国語・英語で学習できクロスリンガルで感情リファレンス指定とかも出来るすごいやつです。個人的にはVITSよりも圧倒的に速いスピードで(1時間くらい学習を回すだけで)すぐに質がVITS超えで、文章によって感情が豊かに読み上げてくれる自然な音声が出る気がします(このデモIrisia Projectから学習した学習結果参照)。

公式リポジトリのドキュメンテーションはおそらく意図的に無しにしてあり、不親切なREADMEになっています。その中で自分で適当にやっているので間違いがあったりするかもしれません、がとりあえず動くのでヨシとします。ある程度の知識は前提とします。

  • 2023-12-29にver 2.3が最終リリース(?)としてリリースされたので、このあとは根本的な修正はなさそうです。
  • モデル構造がver 2.1, 2.2, 2.3それぞれで異なっています。人によってver 2.1, 2.2, 2.3のどれがいいかは意見が別れているようです、それぞれのverでの学習法を解説します
  • 推論するだけ(音声合成するだけ)なら、最新版を入れておけば旧verのモデルも使えるので、既存のモデルを使いたい人は最新版を入れるといいでしょう(特に感情指定は最新版の仕様が一番効く気がします)。

Windows、Python 3.10でNVIDIAのグラボを前提にしてます。他では確認していません。

環境をつくる

仮想環境はお好みで。
PyTorchはこちら参照

ver 2.3を使う場合
git clone https://github.com/fishaudio/Bert-VITS2.git
cd Bert-VITS2d
python -m venv venv
venv\Scripts\activate
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install -r requirements.txt
ver 2.2を使う場合
git clone https://github.com/fishaudio/Bert-VITS2.git
cd Bert-VITS2
git checkout b8fcf2f66eb92aa1abd5a9dc9d75a31d9500fe7d
python -m venv venv
venv\Scripts\activate
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install -r requirements.txt
ver 2.1を使う場合
git clone https://github.com/fishaudio/Bert-VITS2.git
cd Bert-VITS2
git checkout 649b4fb9c9f40fb7c4e307248de2f9f34a9537b3
python -m venv venv
venv\Scripts\activate
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install -r requirements.txt

非linux環境(Windows)だと日本語処理のpyopenjtalkがrequiements.txtのやつだと変なの(openjtalk)が入ってて無限エラーが出たので別のを入れる(ver 2.2以降は修正済み)

pip uninstall openjtalk
pip install pyopenjtalk-prebuilt

C関係のビルドツールがある人はpip install pyopenjtalkでもよし。

必要なモデルのダウンロード

python preprocess_text.py

を一度やるとdefault_config.ymlがコピーされてconfig.ymlというファイルが出来る。
もう一度やると:

python preprocess_text.py

いくつかのモデル(bertとか)が自動的にダウンロードされる(最後エラーで終わるけどダウンロードが目的なので気にしない)。

またいくつか自動ダウンロードされないモデルがあるので、それをダウンロードして適切な場所に置く。バージョンによって必要なモデルが異なる(がver 2.3上でver 2.1のモデルを音声合成で使いたい場合など等にはver 2.1に必要なモデルもダウンロードする必要あり、そうでなければいらない)。

ver 2.3の場合
curl -L -o slm/wavlm-base-plus/pytorch_model.bin https://huggingface.co/microsoft/wavlm-base-plus/resolve/main/pytorch_model.bin
ver 2.2の場合
curl -L -o emotional/clap-htsat-fused/pytorch_model.bin https://huggingface.co/laion/clap-htsat-fused/resolve/main/pytorch_model.bin
ver 2.1の場合
curl -L -o emotional/wav2vec2-large-robust-12-ft-emotion-msp-dim/pytorch_model.bin https://huggingface.co/audeering/wav2vec2-large-robust-12-ft-emotion-msp-dim/resolve/main/pytorch_model.bin

最後にBert-VITS2の公式事前学習モデルがあるので、使うバージョンに応じてダウンロードする。

ver 2.3の場合

https://huggingface.co/OedoSoldier/Bert-VITS2-2.3/tree/main
ここからG_0.pth D_0.pth DUR_0.pth WD_0.pth4つをダウンロードする。

ver 2.2の場合

https://huggingface.co/OedoSoldier/Bert-VITS2-2.2-CLAP/tree/main
ここからG_0.pth D_0.pth DUR_0.pthの3つをダウンロードする。

ver 2.1の場合

🤗に転載されている下のG_0.pth D_0.pth DUR_0.pthの3つをダウンロードしておく。
https://huggingface.co/Garydesu/bert-vits2_base_model-2.1/tree/main

この事前学習モデルは学習の際に使い回すので、混ざらないようにどこかに保存して取っておくと良い。

学習

2.1と2.2と2.3で共通の箇所がほとんどなので、違う箇所のみ明記します
以下では例として、作りたいTTSモデルの名前をmodel_nameとする。ここは好きな名前に各自変えてください。適切にフォルダを作って以下を行う。

1. データの準備

注意: 音声ファイルは各ファイルが2-12(?)秒程度に収まるようにするのがいいっぽいかもしれない。長いファイルばっかりだけだとうまく学習されないかもしれない。

追記:音声ファイルからデータセットを作るリポジトリを公開しました。
https://github.com/litagin02/slice-and-transcribe

  • 音声ファイル(wavファイル)たちをData/model_name/audios/rawに入れる。後で処理されたものがData/model_name/audios/wavsに入る。
  • 書き起こしファイルをData/model_name/filelists/text.listというファイルに入れる。形式は後で説明する。
Data/model_name
├── audios
│   └── raw
│       ├── audio1.wav
│       ├── audio2.wav
│       └── ...
└── filelists
    └── text.list

text.listは以下のような{wav_path}|{speaker_name}|{language}|{text}の形式。ただし{wav_path}Data/model_name/audios/wavs/audio1.wavのように書く。下の学習ステップ3で音声ファイルがwavsフォルダに入るので、そちらのパスを書いていることに注意。

Data/model_name/audios/wavs/audio1.wav|model_name|JP|こんにちは、お元気ですか?
Data/model_name/audios/wavs/audio2.wav|model_name|JP|私は元気かなー。
...

最後に、Data/model_name/modelsフォルダを作り、そこに先程ダウンロードしたG_0.pth D_0.pth DUR_0.pthの3つ(ver 2.3の場合はWD_0.pthも含めた4つ)をコピーする。
モデル学習のときにこれらのファイルは上書きされてしまうようなので、別のモデルを学習するときのために、これらのファイルは削除せずにどこかに取っておくと良い。

2. 設定ファイルの準備

config.ymlを編集する。これは学習や推論含めいろんな動作の設定が一つにまとめられているファイルらしい。編集箇所は学習には以下の項目のみでいいはず。

dataset_path: "Data/model_name"
preprocess_text:
  transcription_path: "filelists/text.list"

基本的には新しいモデルを学習させるときはdataset_pathだけ変更すればよさそうである。

次にconfigs/config.jsonというもともとあるファイルを、Data/model_name/config.jsonにコピーする。

3. 音声のリサンプリング

もともとの音声が44100Hzの場合は、wavファイルをData/model_name/audios/wavsに入れておくだけで良い。それ以外の場合はリサンプリングする必要がある。
↑44100Hzの場合でそのままやると何故かエラーが多発することがあったので、毎回リサンプリングしたほうが安全かもしれない。

リサンプリングは以下のコマンドで行う。

python resample.py

「音频重采样完毕!」と出たら多分成功。

4. 学習

前処理

以下のステップでまず学習の前処理を従う。

  1. python preprocess_text.pyを行う。
总重复音频数:0,总未找到的音频数:0
训练集和验证集生成完成!

と出たら成功。左側の数はたぶん重複してる音源か書き起こしの数、右の数は書き起こしに対応する音源がなかった数。

  1. python bert_gen.pyを行う。
    「bert生成完毕!, 共有{音声ファイルの数}个bert.pt生成!」が出たら成功。
ver 2.3の場合

ここで前処理は終わり。

ver 2.2の場合
  1. python clap_gen.pyを行う。
    「clap生成完毕!, 共有{音声ファイルの数}个emo.pt生成!」が出たら成功。
ver 2.1の場合
  1. python emo_gen.pyを行う。

学習の設定調整

次に、学習の設定を好みで変える。

  • バッチサイズがデフォルトでクソデカな気がするので変える。これは上でコピーしたData/model_name/config.jsonに書いてあり、そこの
    "batch_size": 24,

の24を適当に小さくする(verによって24じゃないかもしれない)(自分のデータセットの場合では4くらいでVRAM(12GB)がギリギリだった)。

  • Data/model_name/config.jsonlog_intervalでtensorboardでのロス確認のログ頻度を、eval_intervalで重みの保存間隔を変えられる(お好みで、初期設定でもいいと思う)
  • 学習結果の重みは、config.ymltrain_mskeep_ckptsの数だけ残して順次古いものから削除される。削除したくなかったら-1とかにしておくと削除されずに全部保存されるので好みで変える。

学習本番

次のコマンドで学習を行う(Data/model_name/models/に事前学習モデルを置くことを忘れずに)。

python train_ms.py

デフォルトでは1000ステップごとにData/model_name/models/にGとDとDUR(とver 2.3ならWD)が保存される(この1000はconfig.jsonのeval_intervalで変えられる)。

学習は1000エポック(クソデカ)になるまで、つまり事実上止まらないので、適当なところで手動で止めるか、config.jsonのepochsを50やら100やら200やらにしておくといい。

  • ロス等のログはtensorboardで
tensorboard --logdir Data/model_name/models

で見れる。

学習どれくらいまわすか

個人の感想です、データセット等や使うverにも多く依存します

めっちゃ早く質が上がるので(2kステップあたりでもう声音はかなり似る)、回し過ぎに注意かもしれないけど回せば回すほどよくなる可能性もあるのかもしれない
最初に声音が2kとかのすぐに似て、その後はどんどん感情や抑揚が出てくる感じと同時に機械音感やガタガタがちょい出てくる、そこを乗り越えるといいかも、という感じかもしれない。多く回しても100エポックあれば十分。興味ある人は上のkeep_ckptsを-1にしといて全部のステップを聴き比べよう。Irisia Projectのデータセットでver 2.1で実験した、ステップ数ごとの音声はここから再生・比較できます。

自分の場合(処理後合計40分くらいのデータセット)では4k-8kステップあたり30-70エポックあたりが何かいい感じになること多数。

音声合成(推論)

学習は回さなくても、本家のwebuiで音声合成(推論)は可能。学習中にも使えるので、チェックしながらやるといいかもしれない。推論にはG_数字.pthファイルが必要。

まずconfig.ymlの以下の項目を設定する。

...
dataset_path: "Data/model_name"
...
webui:
  device: "cuda"  # cpuかcuda。学習中チェックする場合はcpuがいいかも
  model: "models/G_1000.pth"

この設定で、Data/model_name/models/G_1000.pthを使って音声合成ができる。

そして

python webui.py

で起動できる。

何か中国語でよく分からんが、左上のでかい入力欄に単純に日本語を入力して、LanguageをJPにしてその下の「生成音频!」ボタンをクリックすると合成される模様。

右上のやつは、「切分生成」は改行ごとに音声を生成してそれをつなぎ合わせたものを返してくれる。1つの生成ごとに感情とかを入れて読むっぽいので、一度に長い文章や複数の感情を生成するより、基本的には1文ごとに区切ったほうが質が高い読み上げができる

感情指定

verによって挙動がいろいろ異なる。たぶんver 2.3の感情指定が一番効いて効果がある気がする(自分がプルリクで提案しました✌)(2.3の感情指定は2.2や2.1のモデルでも動きます)。

ver 2.3の場合

右上の「融合文本语义」のところに、感情の参考にしたいセリフを入れる(例えば「やったー!私はとっても嬉しいよ!!ありがとう!」のように、単に「嬉しさ」のような指示でなく、実際に感情が入った読み上げテキストのようなものを入れる)。
その下の重みで効きを調整できるが、1にすると平坦な感じでもとの文章の抑揚やリズム等がちょっと損なわれるので適度なところで。

ver 2.2の場合

感情プロンプト or 感情リファレンス音声を一応指定できるところが下にある。Happyとか入れるらしい。が正直あまり機能していないような気がする。

ver 2.1の場合

Emotionという項目から0から9の数字を選ぶ(これは10種類のスタイルから選んでいるらしい、感情の強さとかいう意味ではない)、もしくはリファレンス音声を入れる。挙動としては、「emotionを0から9のどれかを指定」か「感情リファレンス音声を指定」のどちらかで、感情音声を入れた場合はそちらが優先、というふるまいらしい。
スタイルを変えると一応変わるが、どういう感情かは正直わからん。リファレンス音声も機能は微妙っぽい。

Discussion