🎤

ReFlow-VAE-SVCの使い方

2024/05/06に公開
2

はじめに

どうも、うんわです🫠

Zennで記事を書くのは初めてなので、間違ってたら教えていただけると助かります。

この記事ではReFlow-VAE-SVCの導入と学習、推論のやり方についてステップバイステップで解説します。

導入

1. インストール

まず、インストールしたい場所をエクスプローラーで開き、右クリックメニューの”ターミナルで開く(T)”を押します。

するとPowerShellが立ち上がるので、

git clone https://github.com/yxlllc/ReFlow-VAE-SVC

と入力しEnterを押します。

コピーが終わるのを待つとReFlow-VAE-SVCというフォルダが作成されているはずです。

2. 環境の構築

まず、

cd ReFlow-VAE-SVC

と入力しカレントディレクトリをインストール場所\ReFlow-VAE-SVCに変更します。

次に、

python -m venv venv

と入力し仮想環境を構築します。

そして、

./venv/scripts/activate

と入力し仮想環境をActivateします。

つづいて、

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

と入力しCUDA 11.8用のPyTorchをインストールします。

最後に、

pip install -r requirements.txt

と入力し必要なパッケージ類をインストールします。

3. 事前学習済みモデルの構成

ContentVecの事前学習済みモデル
ダウンロードしたcheckpoint_best_legacy_500.ptをpretrain/contentvec内に配置します。

NSF-HiFiGANの事前学習済みモデル
ダウンロードしたzipファイルの中身をpretrain/nsf_hifigan/model内に配置します。

RMVPEの事前学習済みモデル
ダウンロードしたzipファイルの中身をpretrain/rmvpe内に配置します。

ReFlow-VAE-SVCの事前学習済みモデル
ダウンロードしたzipファイルの中身をexp/reflowvae-wavenet-attention内に配置します。

これで導入は完了です。

学習

1. データセットの配置

話者IDのフォルダを作成し、その中にそれぞれ配置します。

data/train/audio/1/1.wav
data/train/audio/1/2.wav
・・・
data/train/audio/2/a.wav
data/train/audio/2/b.wav
・・・

というようになります。

2. 前処理(Preprocessing)

まず、

python draw.py

と入力し学習用データ(train)と検証用データ(val)に分けます。

もし検証用データの総数が10個以上であったり、長過ぎる場合は検証に時間が掛かり、学習速度が低下するので減らすことをおすすめします。

また、もし何もなかった場合は学習用データから一つ適当なのをdata/val/audio/話者IDフォルダ内に移動してください。

次に、

python preprocess.py -c configs/reflow-vae-wavenet.yaml

と入力し前処理を開始します。

これには少し時間と負荷がかかります。しばらく待ちましょう。

処理が終わったらdata/train内が以下のようになっているはずです。

3. 学習(Training)

学習前にconfigを編集します。

exp/reflowvae-wavenet-attention/config.yamlをメモ帳などで開き、

config.yaml
data:
  block_size: 512
  duration: 1
  encoder: contentvec768l12
  encoder_ckpt: pretrain/contentvec/checkpoint_best_legacy_500.pt
  encoder_hop_size: 320
  encoder_out_channels: 768
  encoder_sample_rate: 16000
  extensions:
  - wav
  - flac
  f0_extractor: rmvpe
  f0_max: 2400
  f0_min: 40
  sampling_rate: 44100
  train_path: data/train
  valid_path: data/val
device: cuda
env:
  expdir: exp/reflowvae-wavenet-attention
  gpu_id: 0
infer:
  infer_step: 2
  method: euler
model:
  back_bone: wavenet
  n_chans: 768
  n_hidden: 256
  n_layers: 30
  n_spk: 133
  type: RectifiedFlow_VAE
  use_attention: true
  use_pitch_aug: true
spk_dict:
  10KuroBousuku-CN: 0
  11Barber-CN: 1
  12ChuMing-CN: 2
  13ChangGe-CN: 3
  14QueHe-CN: 4
  15QiXuan-CN: 5
  16NamineRitsu-CN: 6
  17LiYuan-CN: 7
  18WenLi-CN: 8
  19RanHuhu-CN: 9
  1Crimson-CN: 10
  20HuoLian-CN: 11
  21XiaoYe-CN: 12
  22QiLi-CN: 13
  23QiFu-CN: 14
  24XiaoMo-CN: 15
  25YunHao-CN: 16
  26ChuCi-CN: 17
  27Tarara-CN: 18
  28LuanMing-CN: 19
  29HiragiYuki-CN: 20
  2Orange-CN: 21
  30TuYuan-CN: 22
  3Tangerine-CN: 23
  4Growl-CN: 24
  5Steel-CN: 25
  6Ghost-CN: 26
  7David-CN: 27
  8Lien-CN: 28
  9Bianca-CN: 29
  OpenSinger_ManRaw_0: 30
  OpenSinger_ManRaw_1: 31
  OpenSinger_ManRaw_10: 32
  OpenSinger_ManRaw_11: 33
  OpenSinger_ManRaw_12: 34
  OpenSinger_ManRaw_13: 35
  OpenSinger_ManRaw_14: 36
  OpenSinger_ManRaw_15: 37
  OpenSinger_ManRaw_16: 38
  OpenSinger_ManRaw_17: 39
  OpenSinger_ManRaw_18: 40
  OpenSinger_ManRaw_19: 41
  OpenSinger_ManRaw_2: 42
  OpenSinger_ManRaw_20: 43
  OpenSinger_ManRaw_21: 44
  OpenSinger_ManRaw_22: 45
  OpenSinger_ManRaw_23: 46
  OpenSinger_ManRaw_24: 47
  OpenSinger_ManRaw_25: 48
  OpenSinger_ManRaw_26: 49
  OpenSinger_ManRaw_27: 50
  OpenSinger_ManRaw_3: 51
  OpenSinger_ManRaw_4: 52
  OpenSinger_ManRaw_5: 53
  OpenSinger_ManRaw_6: 54
  OpenSinger_ManRaw_7: 55
  OpenSinger_ManRaw_8: 56
  OpenSinger_ManRaw_9: 57
  OpenSinger_WomanRaw_0: 58
  OpenSinger_WomanRaw_1: 59
  OpenSinger_WomanRaw_10: 60
  OpenSinger_WomanRaw_11: 61
  OpenSinger_WomanRaw_12: 62
  OpenSinger_WomanRaw_13: 63
  OpenSinger_WomanRaw_14: 64
  OpenSinger_WomanRaw_15: 65
  OpenSinger_WomanRaw_16: 66
  OpenSinger_WomanRaw_17: 67
  OpenSinger_WomanRaw_18: 68
  OpenSinger_WomanRaw_19: 69
  OpenSinger_WomanRaw_2: 70
  OpenSinger_WomanRaw_20: 71
  OpenSinger_WomanRaw_21: 72
  OpenSinger_WomanRaw_22: 73
  OpenSinger_WomanRaw_23: 74
  OpenSinger_WomanRaw_24: 75
  OpenSinger_WomanRaw_25: 76
  OpenSinger_WomanRaw_26: 77
  OpenSinger_WomanRaw_27: 78
  OpenSinger_WomanRaw_28: 79
  OpenSinger_WomanRaw_29: 80
  OpenSinger_WomanRaw_3: 81
  OpenSinger_WomanRaw_30: 82
  OpenSinger_WomanRaw_31: 83
  OpenSinger_WomanRaw_32: 84
  OpenSinger_WomanRaw_33: 85
  OpenSinger_WomanRaw_34: 86
  OpenSinger_WomanRaw_35: 87
  OpenSinger_WomanRaw_36: 88
  OpenSinger_WomanRaw_37: 89
  OpenSinger_WomanRaw_38: 90
  OpenSinger_WomanRaw_39: 91
  OpenSinger_WomanRaw_4: 92
  OpenSinger_WomanRaw_40: 93
  OpenSinger_WomanRaw_41: 94
  OpenSinger_WomanRaw_42: 95
  OpenSinger_WomanRaw_43: 96
  OpenSinger_WomanRaw_44: 97
  OpenSinger_WomanRaw_45: 98
  OpenSinger_WomanRaw_46: 99
  OpenSinger_WomanRaw_47: 100
  OpenSinger_WomanRaw_5: 101
  OpenSinger_WomanRaw_6: 102
  OpenSinger_WomanRaw_7: 103
  OpenSinger_WomanRaw_8: 104
  OpenSinger_WomanRaw_9: 105
  Opencpop: 106
  Popcs: 107
  m4singer_Alto-1: 108
  m4singer_Alto-2: 109
  m4singer_Alto-3: 110
  m4singer_Alto-4: 111
  m4singer_Alto-5: 112
  m4singer_Alto-6: 113
  m4singer_Alto-7: 114
  m4singer_Bass-1: 115
  m4singer_Bass-2: 116
  m4singer_Bass-3: 117
  m4singer_Soprano-1: 118
  m4singer_Soprano-2: 119
  m4singer_Soprano-3: 120
  m4singer_Tenor-1: 121
  m4singer_Tenor-2: 122
  m4singer_Tenor-3: 123
  m4singer_Tenor-4: 124
  m4singer_Tenor-5: 125
  m4singer_Tenor-6: 126
  m4singer_Tenor-7: 127
  "\u6771\u5317\u304D\u308A\u305F\u3093": 128
  "\u6771\u5317\u30A4\u30BF\u30B3": 129
  "\u6D3E\u8499_CHS": 130
  "\u6D3E\u8499_EN": 131
  "\u6D3E\u8499_JA": 132
train:
  amp_dtype: bf16
  batch_size: 128
  cache_all_data: true
  cache_device: cpu
  cache_fp16: true
  decay_step: 500
  epochs: 1000
  gamma: 0.995
  interval_force_save: 5000
  interval_log: 2
  interval_val: 500
  lr: 0.00015
  num_workers: 4
  save_opt: false
  weight_decay: 0
vocoder:
  ckpt: pretrain/nsf_hifigan/model.ckpt
  type: nsf-hifigan

に変更します。(変更箇所を変更してください)

ただしbatch_sizeはVRAM容量に合わせて調節してください。この場合は700MB程度のデータセットで8GB程度使用します。

また、Turingアーキテクチャ(RTX 2xxxシリーズ/GTX 16xx)やそれ以前のGPUを使用している場合はamp_dtypeをfp16またはfp32にしてください。

コンフィグの編集が終わったら、

python train.py -c exp/reflowvae-wavenet-attention/config.yaml

と入力し学習を開始します。
かなり時間が掛かり、GPU使用率も100%に張り付くので寝ている間などにやると良いです。
あまりに長すぎる!という場合はCtrl+Cで中断できます。
再開する場合も同じように

python train.py -c exp/reflowvae-wavenet-attention/config.yaml

で再開できます。

(Optional) 学習の可視化

もう1ウィンドウ分PowerShellを立ち上げ、カレントディレクトリをReFlow-VAE-SVCに変更し、venvをActivateして、

pip install tensorboard

と入力しtensorboardをインストールします。

次に、

tensorboard --logdir=exp/reflowvae-wavenet-attention

と入力するとtensorboardが起動し、学習を可視化することができます。

また、Audioタブから検証用データと実際に生成された音声を聴き比べることができます。

推論

学習が終わったらいよいよ変換ができます。
まず、変換したい音声をReFlow-VAE-SVC/に配置します。ここではinput.wavとします。
次に、

python main.py -i input.wav  -m exp/reflowvae-wavenet-attention/model_*****.pt -o output.wav -k 0 -f 0 -tid 1 -step 2

と入力します。model_*****.ptは最も大きいもの、またはTensorBoardで聴いてみて品質が良かったものに合わせておいてください。
変換が終わるとoutput.wavが出力されます。

オプションの意味

-kはキー変更 0でそのまま、12で1オクターブ上になります。単位はsemitone
-fはフォルマントシフト 符号付き小数で入力できます。 効果は聴いてみたら分かります🫠
-tidは目標話者ID 学習した話者をここで指定できます。デフォルトは1です。
-stepはステップ数 Stable Diffusionにおけるステップ数に似ています。多いほど時間がかかります。2で十分な印象です。

最後に

問題なく推論まで行けましたか?
高品質で、学習も早く、複数話者学習にも対応しているReFlow-VAE-SVC、日本であまり流行ってないのはやはりCUIのみという点や導入に少し手間がかかる点、ドキュメントが整っていない点のせいでしょうか🥺
この記事が普及の一助になれば幸いです。

Discussion

CN_NianciCN_Nianci

このプロジェクトを気に入っていただけて嬉しいです。現在のところ、データセットと推論ソースの質が高い場合、ReflowベースのSVCモデルはこれまでのすべてのSVCモデル(So-Vits-SVC、RVCなど)を超えています。この素晴らしいプロジェクトをもっと多くの日本のAI愛好者に紹介していただけると嬉しいです。ありがとうございます。

EssidEssid

気になるものがあります。 ReFlow-VAE-SVCは、複数の話者を学習するときに事前学習されたモデルを使用できないのですか? (n_spkを2以上にしておくと仮定する)(この文は翻訳者を使って書かれています。)