❄️

DDSP-SVCでリアルタイム音声合成をするのだ。

2023/06/12に公開

こんなツイートをしますた。
https://twitter.com/ddPn08/status/1667464817551237120

ということでDDSPを推していきます(?)

DDSP-SVCとは

https://github.com/yxlllc/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/フォルダーに解凍します。

トレーニングする

早速トレーニングしていきます。
今回は毎度おなじみずんだもんのデータセットを使っていきます。

データセットの準備

https://zunko.jp/multimodal_dev/login.php
👆からログインして、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.yamlconfigs/diffusion.yamlconfigs/zundamon/にコピーします。


こんな感じになる

configファイルを編集

configs/zundamon/combsub.yaml
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_extractorcrepeに変更
  • train_path, valid_pathを変更
  • expdirを変更
  • train.epochs10000に変更
configs/zundamon/diffusion.yaml
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.epochs3000に変更
  • train.interval_val1000に変更
  • train.interval_force_save1000に変更

拡散モデルの事前トレーニング済みモデルを配置

https://huggingface.co/datasets/ms903/Diff-SVC-refactor-pre-trained-model/blob/main/fix_pitch_add_vctk_600k/model_0.pt
👆のリンクから事前トレーニング済みモデルをダウンロードし、configで指定した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 Settingkstepdiffが有効の際のデノイズのステップ数です。
高いほど質が良くなりますが、ある程度行くと収束して変化がなくなります。
Accはまだ自分も理解できてないですがデノイズを高速化するみたいな物っぽいです。

おしまい

よかったらDDSPも使ってみてくださいね。
個人的にはRVCで出なかった音域が出てくれてとてもうれしかったりしてます。

AI声づくり技術研究会

Discussion