本地訓練,開箱可用,Bert-VITS2 V2.0.2版本本地基於現有資料集訓練(原神刻晴)

劉悅的技術部落格發表於2023-11-22

按照固有思維方式,深度學習的訓練環節應該在雲端,畢竟本地硬體條件有限。但事實上,在語音識別和自然語言處理層面,即使相對較少的資料量也可以訓練出高效能的模型,對於預算有限的同學們來說,也沒必要花冤枉錢上“雲端”了,本次我們來演示如何在本地訓練Bert-VITS2 V2.0.2模型。

Bert-VITS2 V2.0.2基於現有資料集

目前Bert-VITS2 V2.0.2大體上有兩種訓練方式,第一種是基於現有資料集,即原神各角色已經標註好的語音資料,這部分內容是公開的,但是不能商用,可以在這裡下載:

https://pan.ai-hobbyist.org/Genshin%20Datasets/%E4%B8%AD%E6%96%87%20-%20Chinese/%E5%88%86%E8%A7%92%E8%89%B2%20-%20Single/%E8%A7%92%E8%89%B2%E8%AF%AD%E9%9F%B3%20-%20Character

我們只需要選擇喜歡的角色進行下載即可:

第二種是沒有現有的資料集,即假設我們想克隆地球人隨便任意一個人的聲音,這種情況下我們需要收集這個人的語音素材,然後自己製作資料集。

本次我們只演示第一種訓練方式,即訓練現有資料集的原神角色,第二種暫且按下不表。

Bert-VITS2 V2.0.2配置模型

首先克隆專案:

git clone https://github.com/v3ucn/Bert-VITS2_V202_Train.git

隨後下載新版的bert模型:

連結:https://pan.baidu.com/s/11vLNEVDeP_8YhYIJUjcUeg?pwd=v3uc

下載成功後,解壓放入專案的bert目錄,目錄結構如下所示:

E:\work\Bert-VITS2-v202\bert>tree /f  
Folder PATH listing for volume myssd  
Volume serial number is 7CE3-15AE  
E:.  
│   bert_models.json  
│  
├───bert-base-japanese-v3  
│       config.json  
│       README.md  
│       tokenizer_config.json  
│       vocab.txt  
│  
├───bert-large-japanese-v2  
│       config.json  
│       README.md  
│       tokenizer_config.json  
│       vocab.txt  
│  
├───chinese-roberta-wwm-ext-large  
│       added_tokens.json  
│       config.json  
│       pytorch_model.bin  
│       README.md  
│       special_tokens_map.json  
│       tokenizer.json  
│       tokenizer_config.json  
│       vocab.txt  
│  
├───deberta-v2-large-japanese  
│       config.json  
│       pytorch_model.bin  
│       README.md  
│       special_tokens_map.json  
│       tokenizer.json  
│       tokenizer_config.json  
│  
└───deberta-v3-large  
        config.json  
        generator_config.json  
        pytorch_model.bin  
        README.md  
        spm.model  
        tokenizer_config.json

隨後下載預訓練模型:

https://openi.pcl.ac.cn/Stardust_minus/Bert-VITS2/modelmanage/model_readme_tmpl?name=Bert-VITS2%E4%B8%AD%E6%97%A5%E8%8B%B1%E5%BA%95%E6%A8%A1-fix

放入專案的pretrained_models目錄,如下所示:

E:\work\Bert-VITS2-v202\pretrained_models>tree /f  
Folder PATH listing for volume myssd  
Volume serial number is 7CE3-15AE  
E:.  
    DUR_0.pth  
    D_0.pth  
    G_0.pth

接著把上文提到的刻晴資料集放入專案的Data目錄中的raw目錄:

E:\work\Bert-VITS2-v202\Data\keqing\raw\keqing>tree /f  
Folder PATH listing for volume myssd  
Volume serial number is 7CE3-15AE  
E:.  
vo_card_keqing_endOfGame_fail_01.lab  
vo_card_keqing_endOfGame_fail_01.wav

如果想定製化目錄結構,可以修改config.yml檔案:

bert_gen:  
  config_path: config.json  
  device: cuda  
  num_processes: 2  
  use_multi_device: false  
dataset_path: Data\keqing  
mirror: ''  
openi_token: ''  
preprocess_text:  
  clean: true  
  cleaned_path: filelists/cleaned.list  
  config_path: config.json  
  max_val_total: 8  
  train_path: filelists/train.list  
  transcription_path: filelists/short_character_anno.list  
  val_path: filelists/val.list  
  val_per_spk: 5  
resample:  
  in_dir: raw  
  out_dir: raw  
  sampling_rate: 44100

至此,模型和資料集就配置好了。

Bert-VITS2 V2.0.2資料預處理

標註好的原始資料集並不能夠直接進行訓練,需要預處理一下,首先需要將原始資料檔案轉寫成為標準的標註檔案:

python3 transcribe_genshin.py

生成好的檔案:

Data\keqing\raw/keqing/vo_card_keqing_endOfGame_fail_01.wav|keqing|ZH|我會勤加練習,拿下下一次的勝利。  
Data\keqing\raw/keqing/vo_card_keqing_endOfGame_win_01.wav|keqing|ZH|勝負本是常事,不必太過掛懷。  
Data\keqing\raw/keqing/vo_card_keqing_freetalk_01.wav|keqing|ZH|這「七聖召喚」雖說是遊戲,但對局之中也隱隱有策算謀略之理。

這裡ZH代表中文,新版的Bert-VITS2 V2.0.2也支援日文和英文,程式碼分別為JP和EN。

隨後對文字進行預處理以及生成bert模型可讀檔案:

python3 preprocess_text.py  
  
python3 bert_gen.py

執行後會產生訓練集和驗證集檔案:

E:\work\Bert-VITS2-v202\Data\keqing\filelists>tree /f  
Folder PATH listing for volume myssd  
Volume serial number is 7CE3-15AE  
E:.  
    cleaned.list  
    short_character_anno.list  
    train.list  
    val.list

檢查無誤後,資料預處理就完成了。

Bert-VITS2 V2.0.2本地訓練

萬事俱備,只差訓練。先不要著急,開啟Data/keqing/config.json配置檔案:

{  
  "train": {  
    "log_interval": 50,  
    "eval_interval": 50,  
    "seed": 42,  
    "epochs": 200,  
    "learning_rate": 0.0001,  
    "betas": [  
      0.8,  
      0.99  
    ],  
    "eps": 1e-09,  
    "batch_size": 8,  
    "fp16_run": false,  
    "lr_decay": 0.99995,  
    "segment_size": 16384,  
    "init_lr_ratio": 1,  
    "warmup_epochs": 0,  
    "c_mel": 45,  
    "c_kl": 1.0,  
    "skip_optimizer": false  
  },  
  "data": {  
    "training_files": "Data/keqing/filelists/train.list",  
    "validation_files": "Data/keqing/filelists/val.list",  
    "max_wav_value": 32768.0,  
    "sampling_rate": 44100,  
    "filter_length": 2048,  
    "hop_length": 512,  
    "win_length": 2048,  
    "n_mel_channels": 128,  
    "mel_fmin": 0.0,  
    "mel_fmax": null,  
    "add_blank": true,  
    "n_speakers": 1,  
    "cleaned_text": true,  
    "spk2id": {  
      "keqing": 0  
    }  
  },  
  "model": {  
    "use_spk_conditioned_encoder": true,  
    "use_noise_scaled_mas": true,  
    "use_mel_posterior_encoder": false,  
    "use_duration_discriminator": true,  
    "inter_channels": 192,  
    "hidden_channels": 192,  
    "filter_channels": 768,  
    "n_heads": 2,  
    "n_layers": 6,  
    "kernel_size": 3,  
    "p_dropout": 0.1,  
    "resblock": "1",  
    "resblock_kernel_sizes": [  
      3,  
      7,  
      11  
    ],  
    "resblock_dilation_sizes": [  
      [  
        1,  
        3,  
        5  
      ],  
      [  
        1,  
        3,  
        5  
      ],  
      [  
        1,  
        3,  
        5  
      ]  
    ],  
    "upsample_rates": [  
      8,  
      8,  
      2,  
      2,  
      2  
    ],  
    "upsample_initial_channel": 512,  
    "upsample_kernel_sizes": [  
      16,  
      16,  
      8,  
      2,  
      2  
    ],  
    "n_layers_q": 3,  
    "use_spectral_norm": false,  
    "gin_channels": 256  
  },  
  "version": "2.0"  
}

這裡需要調整的引數是batch_size,如果視訊記憶體不夠,需要往下調整,否則會出現“爆視訊記憶體”的問題,假設視訊記憶體為8G,那麼該數值最好不要超過8。

與此同時,首次訓練建議把log_interval和eval_interval引數調小一點,即訓練的儲存間隔,方便訓練過程中隨時進行推理驗證。

隨後輸入命令,開始訓練:

python3 train_ms.py

程式返回:

11-22 13:20:28 INFO     | data_utils.py:61 | Init dataset...  
100%|█████████████████████████████████████████████████████████████████████████████| 581/581 [00:00<00:00, 48414.40it/s]  
11-22 13:20:28 INFO     | data_utils.py:76 | skipped: 31, total: 581  
11-22 13:20:28 INFO     | data_utils.py:61 | Init dataset...  
100%|████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:00<?, ?it/s]  
11-22 13:20:28 INFO     | data_utils.py:76 | skipped: 0, total: 5  
Using noise scaled MAS for VITS2  
Using duration discriminator for VITS2  
INFO:models:Loaded checkpoint 'Data\keqing\models\DUR_0.pth' (iteration 7)  
INFO:models:Loaded checkpoint 'Data\keqing\models\G_0.pth' (iteration 7)  
INFO:models:Loaded checkpoint 'Data\keqing\models\D_0.pth' (iteration 7)

說明訓練已經開始了。

訓練過程中,可以透過命令:

python3 -m tensorboard.main --logdir=Data/keqing/models

來檢視loss損失率,訪問:

http://localhost:6006/#scalars

一般情況下,訓練損失率低於50%,並且損失函式在訓練集和驗證集上都趨於穩定,則可以認為模型已經收斂。收斂的模型就可以為我們所用了,如何使用訓練好的模型,請移步:又欲又撩人,基於新版Bert-vits2V2.0.2音色模型雷電將軍八重神子一鍵推理整合包分享,囿於篇幅,這裡不再贅述。

訓練好的模型存放在Data/keqing/models目錄:

E:\work\Bert-VITS2-v202\Data\keqing\models>tree /f  
Folder PATH listing for volume myssd  
Volume serial number is 7CE3-15AE  
E:.  
│   DUR_0.pth  
│   DUR_550.pth  
│   DUR_600.pth  
│   DUR_650.pth  
│   D_0.pth  
│   D_600.pth  
│   D_650.pth  
│   events.out.tfevents.1700625154.ly.24008.0  
│   events.out.tfevents.1700630428.ly.20380.0  
│   G_0.pth  
│   G_450.pth  
│   G_500.pth  
│   G_550.pth  
│   G_600.pth  
│   G_650.pth  
│   train.log  
│  
└───eval  
        events.out.tfevents.1700625154.ly.24008.1  
        events.out.tfevents.1700630428.ly.20380.1

需要注意的是,首次訓練需要將預訓練模型複製到models目錄。

結語

除了中文,Bert-VITS2 V2.0.2也支援日語和英語,同時提供中英日混合的Mix推理模式,欲知後事如何,且聽下回分解。

相關文章