DDSP-SVCでリアルタイム音声合成をするのだ。
こんなツイートをしますた。
ということでDDSPを推していきます(?)
DDSP-SVCとは
👆これです。
Real-time end-to-end singing voice conversion system based on DDSP (Differentiable Digital Signal Processing).
らしいです。
RVC並みの学習速度でかつ品質はRVCより上(多分)っていうやつです。
さらにリアルタイム音声変換ではRVCよりもレイテンシが低いらしい。
拡散モデルと組み合わせればさらに質がよくなるようです。
なんか面白そうですよね。
ということで触っていきましょう。
インストール
1. リポジトリをクローンする
git clone https://github.com/yxlllc/DDSP-SVC.git
cd DDSP-SVC
2. ライブラリをインストールする
python -m venv venv
source venv/bin/activate # linux
venv\Scripts\activate.bat # windows
pip install -r requirements.txt
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 -U
3. モデルをダウンロードする
- Feature Encoder:
(1) 事前トレーニング済みの ContentVec エンコーダーをダウンロードし、pretrain/contentvec
フォルダーの下に置きます。
(2) 事前トレーニング済みの HubertSoft エンコーダをダウンロードし、pretrain/hubert
フォルダーに置きます。
- VocoderまたはEnhancer:
事前トレーニングされた NSF-HiFiGAN Vocoderをダウンロードし、pretrain/
フォルダーに解凍します。
トレーニングする
早速トレーニングしていきます。
今回は毎度おなじみずんだもんのデータセットを使っていきます。
データセットの準備
👆からログインして、ITAコーパスマルチモーダルデータベースからずんだもんボイスデータをクリックしてダウンロードします。
ダウンロードしたらzipを展開します。
中にあるemotion
フォルダに移動するとama
, normal
, sexy
, tsun
の4つのフォルダがあるので、好きなものを一つ選び、フォルダのパスをメモしておきましょう。
そうしたらDDSP-SVCのフォルダに戻り、datasets
フォルダを新しく作り、その中にzundamon
フォルダを作ります。
さらにzundamon
フォルダの中にtrain/audio
フォルダ、val/audio
フォルダを作成します。
そうしたらtrain/audio
フォルダに先ほどメモしたパスのフォルダの中身をコピーします。
こんな感じになる
次にdraw.pyを実行してvalidationデータを作成します。
python draw.py --train ./datasets/zundamon/train/ --val ./datasets/zundamon/val/
configファイルを作成
DDSP-SVCのフォルダに戻り、configs
フォルダの中に新しくzundamon
フォルダを作成します。
そうしたらconfigs/combsub.yaml
とconfigs/diffusion.yaml
をconfigs/zundamon/
にコピーします。
こんな感じになる
configファイルを編集
data:
f0_extractor: 'crepe' # 'parselmouth', 'dio', 'harvest', or 'crepe'
f0_min: 65 # about C2
f0_max: 800 # about G5
sampling_rate: 44100
block_size: 512 # Equal to hop_length
duration: 2 # Audio duration during training, must be less than the duration of the shortest audio clip
encoder: 'contentvec768l12' # 'hubertsoft', 'hubertbase', 'hubertbase768', 'contentvec', 'contentvec768' or 'contentvec768l12' or 'cnhubertsoftfish'
cnhubertsoft_gate: 10
encoder_sample_rate: 16000
encoder_hop_size: 320
encoder_out_channels: 768 # 256 if using 'hubertsoft'
encoder_ckpt: pretrain/contentvec/checkpoint_best_legacy_500.pt
train_path: datasets/zundamon/train # Create a folder named "audio" under this path and put the audio clip in it
valid_path: datasets/zundamon/val # Create a folder named "audio" under this path and put the audio clip in it
extensions: # List of extension included in the data collection
- wav
model:
type: 'CombSubFast'
n_spk: 1 # max number of different speakers
enhancer:
type: 'nsf-hifigan'
ckpt: 'pretrain/nsf_hifigan/model'
loss:
fft_min: 256
fft_max: 2048
n_scale: 4 # rss kernel numbers
device: cuda
env:
expdir: exp/zundamon/conbsub
gpu_id: 0
train:
num_workers: 2 # If your cpu and gpu are both very strong, set to 0 may be faster!
batch_size: 24
cache_all_data: true # Save Internal-Memory or Graphics-Memory if it is false, but may be slow
cache_device: 'cpu' # Set to 'cuda' to cache the data into the Graphics-Memory, fastest speed for strong gpu
cache_fp16: true
epochs: 10000
interval_log: 10
interval_val: 2000
lr: 0.0005
weight_decay: 0
save_opt: false
変更点は以下の通りです。
-
data.f0_extractor
をcrepe
に変更 -
train_path
,valid_path
を変更 -
expdir
を変更 -
train.epochs
を10000
に変更
data:
f0_extractor: 'crepe' # 'parselmouth', 'dio', 'harvest', or 'crepe'
f0_min: 65 # about C2
f0_max: 800 # about G5
sampling_rate: 44100
block_size: 512 # Equal to hop_length
duration: 2 # Audio duration during training, must be less than the duration of the shortest audio clip
encoder: 'contentvec768l12' # 'hubertsoft', 'hubertbase', 'hubertbase768', 'contentvec', 'contentvec768' or 'contentvec768l12' or 'cnhubertsoftfish'
cnhubertsoft_gate: 10
encoder_sample_rate: 16000
encoder_hop_size: 320
encoder_out_channels: 768 # 256 if using 'hubertsoft'
encoder_ckpt: pretrain/contentvec/checkpoint_best_legacy_500.pt
train_path: datasets/zundamon/train # Create a folder named "audio" under this path and put the audio clip in it
valid_path: datasets/zundamon/val # Create a folder named "audio" under this path and put the audio clip in it
extensions: # List of extension included in the data collection
- wav
model:
type: 'Diffusion'
n_layers: 20
n_chans: 512
n_hidden: 256
use_pitch_aug: true
n_spk: 1 # max number of different speakers
device: cuda
vocoder:
type: 'nsf-hifigan'
ckpt: 'pretrain/nsf_hifigan/model'
infer:
speedup: 10
method: 'dpm-solver' # 'pndm' or 'dpm-solver'
env:
expdir: exp/zundamon/diff
gpu_id: 0
train:
num_workers: 2 # If your cpu and gpu are both very strong, set to 0 may be faster!
amp_dtype: fp32 # fp32, fp16 or bf16 (fp16 or bf16 may be faster if it is supported by your gpu)
batch_size: 48
cache_all_data: true # Save Internal-Memory or Graphics-Memory if it is false, but may be slow
cache_device: 'cpu' # Set to 'cuda' to cache the data into the Graphics-Memory, fastest speed for strong gpu
cache_fp16: true
epochs: 3000
interval_log: 10
interval_val: 1000
interval_force_save: 1000
lr: 0.0002
decay_step: 100000
gamma: 0.5
weight_decay: 0
save_opt: false
変更点は以下の通りです。
-
train_path
,valid_path
を変更 -
expdir
を変更 -
train.epochs
を3000
に変更 -
train.interval_val
を1000
に変更 -
train.interval_force_save
を1000
に変更
拡散モデルの事前トレーニング済みモデルを配置
expdir
(今回はexp/zundamon/diff
)に配置します。
こんな感じ
学習
まずはデータセットのpreprocessを実行します。
python preprocess.py -c configs/zundamon/diffusion.yaml
そしたらDDSPモデルの学習を実行します。
python train.py -c configs/zundamon/combsub.yaml
このような感じでいくつかの.pt
ファイルが作成されていれば成功です。
DDSPモデルができたら同じように拡散モデルの学習を実行します。
python train_diff.py -c configs/zundamon/diffusion.yaml
VCClientで使ってみる
毎度おなじみw-okada
さんのVCClientを使ってみます。
起動したらDDSP-SVCを選択します。
次にModel Settings
で先ほど学習したモデルを選択していきます。
Model |
exp/zundamon/combsub フォルダに生成された学習済みモデル |
Model config | exp/zundamon/combsub/config.yaml |
Diff |
exp/zundamon/diff フォルダに生成された学習済みモデル |
Diff config | exp/zundamon/diff/config.yaml |
選択したらupload
ボタンをクリックして少し待ちます。
アップロードが終わったらStart
を押してボイチェンを有効にします。
Speaker Setting
のkstep
はdiff
が有効の際のデノイズのステップ数です。
高いほど質が良くなりますが、ある程度行くと収束して変化がなくなります。
Acc
はまだ自分も理解できてないですがデノイズを高速化するみたいな物っぽいです。
おしまい
よかったらDDSPも使ってみてくださいね。
個人的にはRVCで出なかった音域が出てくれてとてもうれしかったりしてます。
AIボイス・音楽の技術を専門に研究する、日本最大級のDiscordコミュニティです 下記のリンクから参加できます discord.gg/bmNezxjCq2
Discussion