ReFlow-VAE-SVCの使い方
はじめに
どうも、うんわです🫠
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をメモ帳などで開き、
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
このプロジェクトを気に入っていただけて嬉しいです。現在のところ、データセットと推論ソースの質が高い場合、ReflowベースのSVCモデルはこれまでのすべてのSVCモデル(So-Vits-SVC、RVCなど)を超えています。この素晴らしいプロジェクトをもっと多くの日本のAI愛好者に紹介していただけると嬉しいです。ありがとうございます。
気になるものがあります。 ReFlow-VAE-SVCは、複数の話者を学習するときに事前学習されたモデルを使用できないのですか? (n_spkを2以上にしておくと仮定する)(この文は翻訳者を使って書かれています。)