Diff-SVCをColabで動かしてみる実験

えーっと、このDiff-SVCの件ですが、現状
julieraptor様が公開されていたcolabで、Diff-SVCを動かすノートが非公開になってしまった上に、利用するにはGoogleフォームから、使用用途を申請し(今できないみたいですが)、許可を得たうえで様々な権利関係の表示を行ったうえで、ようやっと触れるという状況みたいです。

正直使ってみたいけど、使いにくいなぁと。

そこで、公式の記述を元に、
イチから改めてノートを書いてみようかという実験です。
実際には、要件が厳しすぎて「RuntimeError: CUDA out of memory. Tried to allocate 124.00 MiB」とかエラーを吐き出して殆ど動かないので、協力してやろうという親切な方を探す目的もあります。
どなたか、上手く動かすためのアドバイスを是非よろしくお願いいたします。

さて、まずgoogle driveの設定ですが、こんな感じにしてみます。
/gdrive
 /my-diff-svc
  /checkpoints
   /hubert
          /mymodel
          /0102_xiaoma_pe
  /train_original
  /train_source
  /inference_target
  /inference_generated
googleドライブに、「my-diff-svc」というフォルダーをつくり、
その下に、「checkpoints」というフォルダーを作ります。
そのチェックポイントの中に、「hubert」「0102_xiaoma_pe」「mymodel」というフォルダーを作ります。

で必要ファイルを落として入れてゆきます。

「hubert」多分音質変換に必要な学習モデル
https://github.com/bshall/hubert/releases/download/v0.1/hubert-soft-0d54a1f4.pt

「0102_xiaoma_pe」事前に学習されたモデル

「mymodel」学習後の生成データの収納先

「train_original」には、学習元となる音声データを入れてください。
15秒から20秒単位のwavファイルを作ってそのまま入れておきます。
学習元のwavファイルの作り方は、いくつかあると思いますが、
いくつかお勧めのソフトを書いておきます。

Demucs-GUI
音声データから、「声(vocal)」と「音楽(雑音含む)」をある程度分離してくれるソフト

Audacity
ノイズ除去、無音区画の切りつめに使えるソフト

Free Batch Music Splitter
指定の時間、指定の回数でwavファイルを分割してくれるソフト

「inference_target」のフォルダーには変換する予定の音声ファイル(wav)を入れておきます。
「inference_generated」のフォルダーに変換後の音声ファイルが入れられる予定です。

で、Colabのノートの新規作成をします。
まず、Googleドライブと繋げてみましょう。

# Google Driveへのアクセス許可
from google.colab import drive
drive.mount('/gdrive')

で、まずDiff-SVCをダウンロードしてきます。合わせてGoogleドライブに設置した各種ファイルをコピーしたりします。

# diff-svcコードの取得
%cd /content/
! rm -rf /content/diff-svc
! git clone https://github.com/prophesier/diff-svc

%cd '/gdrive/MyDrive/my-diff-svc'
!cp -r diff-svc/* /content/diff-svc/

%cd /content/diff-svc
!ln -s /gdrive/MyDrive/my-diff-svc/checkpoints .

で、pytouchのバージョンをDiff-SVCの要件に揃えます。

# Colabのpytorchのダウングレード
!pip uninstall -y torchaudio torchvision torch torchtext
!wget https://download.pytorch.org/whl/cu113/torchvision-0.13.1%2Bcu113-cp38-cp38-linux_x86_64.whl
!wget https://download.pytorch.org/whl/cu113/torchaudio-0.12.1%2Bcu113-cp38-cp38-linux_x86_64.whl
!wget https://download.pytorch.org/whl/cu113/torch-1.12.1%2Bcu113-cp38-cp38-linux_x86_64.whl
!pip install torch-1.12.1+cu113-cp38-cp38-linux_x86_64.whl
!pip install torchvision-0.13.1+cu113-cp38-cp38-linux_x86_64.whl
!pip install torchaudio-0.12.1+cu113-cp38-cp38-linux_x86_64.whl

で、「requirements.txt」から、そのほかの依存ソフトを入れてゆきます。

# diff-svcが依存するPythonパッケージのインストール
%cd /content/diff-svc
!pip install -r requirements.txt

PytouchとCUDAのヴァージョンが、'1.12.1+cu113'となっていれば、OKです。

で、学習データセットの前処理をします。

# 学習データセットの前処理
%cd /content/diff-svc
%env PYTHONPATH=.
!CUDA_VISIBLE_DEVICES=0 python preprocessing/binarize.py --config training/config.yaml

その後、モデル学習を行います。この辺の仕様は公式の記述通りです。
ただ、動作するかどうかのテストしたいだけなら、検証の為、「training/config.yaml」の下記の項目のパラメータの値を少し小さくしておくことをお勧めます。
#max_epoch: 15
#val_check_interval: 100
でないと、終わりませんし、失敗したとき凹みます。

# 声質変換モデル学習

%cd /content/diff-svc
!CUDA_VISIBLE_DEVICES=0 python run.py --config training/config.yaml --exp_name mymodel --reset

実際は、上記の作業中にうまく動作するときもありますが、「RuntimeError: CUDA out of memory. Tried to allocate XXXX MiB」とエラーがでて動かないことが殆どだと思います。

以上がトレーニングの方法でした。
続いて、音質変換の方法ですが、これも公式の手順に従います。

なんとかtrainingが終わった学習ファイルにて、実際に変換を行う準備をします。

# 重要:下記の記述で、生成された学習ファイル名でmodel_ckpt_steps_xxx.ckpt の部分を書き換えてください。

%cd /content/diff-svc
#inference
from utils.hparams import hparams
from preprocessing.data_gen_utils import get_pitch_parselmouth,get_pitch_crepe
import numpy as np
import matplotlib.pyplot as plt
import IPython.display as ipd
import utils
import librosa
import torchcrepe
from infer import *
import logging
from infer_tools.infer_tool import *

logging.getLogger('numba').setLevel(logging.WARNING)

# プロジェクト名、とりあえずmymodelで設定
project_name = "mymodel"

# *重要* 学習ファイル名を生成した学習ステップの大きいものに置き換えてください
model_path = f'./checkpoints/{project_name}/model_ckpt_steps_xxx.ckpt'
config_path = f'./checkpoints/{project_name}/config.yaml'
hubert_gpu = True
svc_model = Svc(project_name, config_path, hubert_gpu, model_path)
print('model loaded')

で、実行します。

# 声質変換実施(推論/inference)

%cd /content/diff-svc
import glob
for wav_fn in glob.glob('/gdrive/MyDrive/my-diff-svc/inference_target/*.wav'):
  demoaudio, sr = librosa.load(wav_fn)
  key = 0  # 音高调整,支持正负(半音)
  # 加速倍数
  pndm_speedup = 20
  save_filename = wav_fn.split('/')[-1]
  wav_gen = '/gdrive/MyDrive/my-diff-svc/inference_generated/{}'.format(save_filename)
  f0_tst, f0_pred, audio = run_clip(svc_model,file_path=wav_fn, key=key, acc=pndm_speedup, use_crepe=True, use_pe=True, thre=0.05,
                                        use_gt_mel=False, add_noise_step=500,project_name=project_name,out_path=wav_gen)
  #break

とりあえず、一度モデルが学習できたら inference_target のファイルを置き換えてこのセルだけを実行すれば合成音が生成されるはずです。


以上ですが、まあ大体動きませんw
学習元のデータの問題なのか、事前学習ファイルの問題なのか、、
LIEEなどの事前学習ファイル

は、多分メモリ不足でピクリとも動かないでしょう。他にも原因がありそうですが、、

と、いうわけでこの辺のエラーを回避できる知識、ノウハウのある方、
是非アドバイスいただけますと、幸いです。
よろしくお願いいたします。

この記事が気に入ったらサポートをしてみませんか?