Style-Bert-VITS2の事前学習モデルを独自データで作成する

初めに

Style-Bert-VITS2は、日本語におけるアクセントなどの改善によりTTSでは感情表現を含めてかなり使えます。 しかし、事前学習モデルを独自のデータセットで使用したい場合一から作る必要があります。
今回は、Style-Bert-VITS2における事前学習モデルの作成方法についてまとめました

わかっている人向け

Data/{model_name}/modes内にあるモデルファイルを消してから学習ボタンを押してください

デモ

以下のように つくよみちゃんコーパスを使用した事前学習モデルを公開しました!
クリーンなデータセット(学習データが明確)であるため、安心してご使用いただけます

huggingface.co

24/04/09 追記

事前学習データを増やしたクリーンな事前学習モデル ver2を公開しました!

huggingface.co

開発環境

環境の準備

まずは Style-Bert-VITS2が使える環境を準備します

pip install -r requirements.txt
python initialize.py

以下のコマンドを実行して、GradioのWeb画面が立ち上がれば問題ありません

python webui_train.py

データセットの準備

学習をするためには音声ファイルおよびその音声の文字おこしされた音声ファイルが必要です。 今回は、つくよみちゃんコーパス│声優統計コーパス(JVSコーパス準拠)を使用するため、文字起こしはされているものとします。

esd.list というファイル名で、ReadMeに沿って以下のフォーマットで音声ファイルの情報を作成します。

****.wav|{話者名}|{言語IDZHJPEN}|{書き起こしテキスト}

つくよみちゃんコーパスの場合は、以下のような書き方になります
(今回は 話者名を 事前学習としてわかりやすいように名前を変えています)

VOICEACTRESS100_001.wav|pretraing|JP|また、東寺のように、五大明王と呼ばれる、主要な明王の中央に配されることも多い。
VOICEACTRESS100_002.wav|pretraing|JP|ニューイングランド風は、牛乳をベースとした、白いクリームスープであり、ボストンクラムチャウダーとも呼ばれる。
VOICEACTRESS100_003.wav|pretraing|JP|コンピュータゲームのメーカーや、業界団体などに関連する人物のカテゴリ。

独自の場合は、Whisperreazon-research/reazonspeech-nemo-v2を使うといいでしょう

フォルダ内の音声をreazonspeech-nemo-v2を使って文字起こしする際には、以下の記事もご覧ください

(後から記事を追加する)

データの配置

準備をしたデータを以下のようにおいていきます

├── Data
│   ├── {モデルの名前}
│   │   ├── esd.list
│   │   ├── raw
│   │   │   ├── ****.wav
│   │   │   ├── ****.wav
│   │   │   ├── ...

前処理の実行

データ配置が終わったら、Web画面を立ち上げて以下のように設定をします。    各種パラメータは各自変更してください

学習ステップ量はデータセットにも依存しますが、だいたい200k ~ 300k stepあたりまでは行ったほうがいいと感じています

事前学習の開始

開始前に Data/models の中にあるモデルを削除します。こちらを削除しないと事前学習ではなく追加学習扱いになります

事前学習開始がされた場合は、以下のログが学習開始時に表示されるためこちらでも確認できます

02-24 04:33:29 |  INFO  | data_utils.py:66 | Init dataset...
0it [00:00, ?it/s]
02-24 04:33:29 |  INFO  | data_utils.py:81 | skipped: 0, total: 0
02-24 04:33:29 |  INFO  | train_ms_jp_extra.py:221 | Using noise scaled MAS for VITS2
02-24 04:33:30 |WARNING | train_ms_jp_extra.py:427 | No such file or directory: "Data\\test\\models\\G_0.safetensors"
02-24 04:33:30 |WARNING | train_ms_jp_extra.py:428 | It seems that you are not using the pretrained models, so we will train from scratch.

以下の画像のボタンを押せば事前学習開始です。使用しているGPUにもよりますがかなり時間がかかりますので、気長に待ちましょう

pthをsafetensorsに変換する

学習が終わったら、事前学習モデルとして使えるように以下のように safetensors に変換します。

以下のスクリプトを使って変換をします

import torch

model_root = "Data/pretraing/models"
step = {学習したstep}

g_model = torch.load(f"{model_root}/G_{step}.pth", map_location="cpu")
d_model = torch.load(f"{model_root}/D_{step}.pth", map_location="cpu")
dur_model = torch.load(f"{model_root}/WD_{step}.pth", map_location="cpu")

g_dict = {}
for key in g_model["model"].keys():
    if key.startswith("emb_g"):
        print(key)
    else:
        g_dict[key] = g_model["model"][key]

d_dict = {}
for key in d_model["model"].keys():
    d_dict[key] = d_model["model"][key]

dur_dict = {}
for key in dur_model["model"].keys():
    dur_dict[key] = dur_model["model"][key]

from safetensors.torch import save_file


save_file(g_dict, f"G_0.safetensors")
save_file (d_dict, f"D_0.safetensors")
save_file (dur_dict, f"WD_0.safetensors")

マルチGPUで学習をする場合

今回はノード数が1、ノードあたり2つのGPUが載っているとします

マルチGPUで実行をする場合、torchrunを使用して以下のようにコマンド上で実行します

torchrun --standalone --nnodes=1 --nproc_per_node=2 train_ms_jp_extra.py -c Data/pretraing/config.json -m Data/pretraing

また学習を再開する場合は、--skip_default_style をつける必要があるので以下になります

torchrun --standalone --nnodes=1 --nproc_per_node=2 train_ms_jp_extra.py -c Data/pretraing/config.json -m Data/pretraing --skip_default_style

もしかしたら以下も必要かも?

CUDA_VISIBLE_DEVICES=0,1