🎤

so-vits-svc で声質変換を試すメモ

2023/03/13に公開

so-vits-svc で声質変換しゅごいね...
私も試したい!

so-vits-svc, VITS ベースの Voice conversion と思われますが, 何をベースにしているのかは不明です.

2023/03/31 時点では, v4.0 と v4.0-v2 がありますが, ここでは v4.0 版を試します.

情報

https://economylife.net/so-vits-svc-windows/

ありがとうございます.

環境

  • 32 GB mem Ryzen9 3950X
    • CPU もそこそこ学習に使うので, 最低 6 cores CPU は必要そう
  • 3080 10 GB
    • GPU なくても CPU でも学習できると思われるが, コードが CUDA 前提でかかているため, とりあえずは GPU 必要
  • Python 3.9(3.10 のがいいかも)

repo

2023/03/31 時点ではこちらです.

https://github.com/svc-develop-team/so-vits-svc

setup

pip

requirements.txt がありますが, pyworld のコンパイルで, requirements.txt にある numpy のバージョンによってはコケます.

numpy は pip で最新のをいれるとよさそうです.

pretrained model

  • ContentVec
  • G_0,D_0(Optional, but highly recommended)

が必要です.

G_0.pth D_0.pth は直ダウンロードできないです.
ライセンス的には公開しても問題は少ないようなので, いろいろ確認されたのち, 開発者がそのうち huggingface にアップロードされるかもです.
(2023/03/31 時点では, 野良? モデルがいくつか huggingface などにアップロードされているようです)

とりあえずは無くても動くので, 今回は無しで進めます.
ただ, いい感じに結果を得たい場合は epoch 10,000 くらいまで学習(3080 で 2 日程度)する必要がありますので, G_0 D_0 取得できる場合は利用するほうがよいでしょう.
(so-vits-svc 開発者が, なんかいい感じの音声コーパスで学習させたものが G_0.pth, D_0.pth なのですかね)

ContentVec は普通に落とせます.

https://github.com/auspicious3000/contentvec

ContentVec の Pretrained model のライセンスは不明ですが, 論文によると HuBert

https://github.com/facebookresearch/fairseq/tree/main/examples/hubert

をベースにしているとあるので, fairseq は MIT ライセンスですから, HuBert および ContentVec も permissive なライセンスと思われます(TODO: 要ライセンス確認)

音声データ

音声データについては↑の解説 URL にあるように,「つくよみちゃんコーパス」を利用させていただきました. ありがとうございます.

音声合成(「声質の学習」など、より具体的に説明しても可)には、フリー素材キャラクター「つくよみちゃん」が無料公開している音声データを使用しています。

■つくよみちゃんコーパス(CV.夢前黎)
https://tyc.rei-yumesaki.net/material/corpus/

処理

あとは↑の紹介 URL, REDAME や Colab ノートブック参考に処理していけばいけます!

batch size 8 で, powerlimit 120W で 1 epoch 15 秒くらいでした.

INFO:44k:====> Epoch: 4, cost 15.34 s
INFO:44k:====> Epoch: 5, cost 15.45 s
INFO:44k:====> Epoch: 6, cost 15.46 s
INFO:44k:====> Epoch: 7, cost 15.40 s
INFO:44k:====> Epoch: 8, cost 15.45 s
INFO:44k:====> Epoch: 9, cost 15.28 s
INFO:44k:====> Epoch: 10, cost 15.14 s
INFO:44k:====> Epoch: 11, cost 15.09 s
INFO:44k:====> Epoch: 12, cost 15.22 s
INFO:44k:====> Epoch: 13, cost 15.35 s

今回の設定では 17 epoch くらいで 200 step になりました. 何かしら結果が得られる 1000 epoch(~= 10,000 steps) だと学習に 4 時間というところですかね.

推論

まず, 10,000 steps 程度(epoch 867)進んだところの weight を使いました.
今回は普通の発話(not 歌声)で試しました.

元音声は Common Voice 36037897(ケチャップをたっぷりかけてじっくり炒める)です.
変換後(-t 0 -a)はこちら

https://drive.google.com/file/d/1bUoAp3R9zkuALM9Pwf4tl3wzVIWNXe5q/view

Voila!

でも, ちょっと機械的なノイズが入っている感じでしょうか.

2 WAV(+12dB増幅)版を使い, また 10,000 epoch(120,000 steps くらい) まで学習させました!

https://drive.google.com/file/d/1nAiT125IIGyAMLsgtQC-xuS-SqlZ1Isb/view?usp=sharing

Super coool! ノイズもすくなくいい感じです!

考察

ただ, Common Voice のほかのデータでも試しましたが, あまりうまくいかないケースもありました.
元音声が男性とか. あと Common Voice は, 元データが音声はあんまりきれいな感じではない(ぶつ切りになっていたり, なんかよくわからない台本の日本語音声だったりするのもある(聞き取れん... 音声処理にはいい台本なのかもしれんが)ので, 変換が難しいのもあるかもです.

元音声は TTS とかで生成した音声がいいかも.

  • G_0.pth D_0.pth が得られればそれを使う
  • より学習用の音声を増やす

とより安定 + 音質改善するかもです!

歌声に適用するとどうなるかも試してみたいですね.

その他の音声合成の話題

音声系は毎年のように流行り廃りがあってついていくのがめんどい.

https://qiita.com/4wavetech/items/28441857d2139aecaf6a

so-vits-svc もいつの間にか repo 消えたり開発止まったりする可能性ありますので, あとでいろいろ手法切り替えられるように, so-vits-svc の仕組みを理解しておいてコード流用などできるようにしておくとよいでしょう.

日本勢(?)だと ESPNet ベースでいろいろ作られていますが, とはいえ ESPNet もなんか動かすのめんどいね...

最近だと SiFiGAN がいいのかしらん?

https://github.com/chomeyama/SiFiGAN

Vall-E など, 汎用(?) neural codec から, 固有の音声データ与えて voice conversion できるのも出てきているので, この方向性にも期待でしょうか.

https://github.com/enhuiz/vall-e

Vall-e (の実装)がベースにしている EnCodec は CC-BY-NC 4.0 で商用利用ができないので注意です!

スマホとかで動かしたい...

モデルサイズは hubert で 1.3G, G_*.pth で 500 MB くらいです. so-vits-svc には onnx export して quantize すれば 500MB ~ 1GB くらいでしょうか.

https://github.com/svc-develop-team/so-vits-svc#exporting-to-onnx

音声の生成は, 多少時間かかるかもですが, すごいかかるわけではないでしょう.

librosa 周りとか, nanosnap

https://github.com/lighttransport/nanosnap

にいろいろ足りない部分実装して頑張れば
スマホでも声質変換うごかせるやも?

TODO

  • 【丁寧解説】SO-VITS-SVC-v4をWindowsに導入しローカルで音声学習&合成する方法 https://economylife.net/so-vits-svc-windows/ を参考に, 2 WAV(+12dB増幅)を使ってみる
  • 10000 epoch まで学習させてみる(1.5 日くらい)
  • DiffGan とか SiFiGAN とか他のも試す
  • 元音声は TTS だったり, 素の(標準的な声質での)歌声生成で得られたものを使ってみる
  • スマホで声質変換動かす

Discussion