3ヶ月前くらいに読み上げ白上フブキを作っていたのですが、色々気になる点も多かったので作り直してみました。読み上げ白上フブキ 3.0です。
ついでに、so-vits-svc向けのデータセットの作り方をメモ書き程度に解説しておきます。
前回との違い
まず、so-vits-svcのバージョンが4.0から4.1 (Stable)に新しくなりました。
なんか世間では一瞬でRVCが流行って過ぎ去っていった気がしますが、個人的にRVCはあまり好みじゃなかったので、前回から引き続きso-vits-svcを利用しています。
前にやったときは最初にDiff-SVC向けに作ったデータセットをずっと使いまわしていましたが、今回はデータセットを1からちゃんと作り直しました。
前に使っていたデータセットは音声の切り方が雑だったり、背景雑音が残っていたりしたので、そのあたりを中心に改善しました。
今回は主にこの話をしたいと思います。
データセットの作り方
①まず元となる音声を用意します。自分の場合は、今回も適当な配信を使っています。
音声データの中で明らかに要らない区間があるときは、ここでざっくり編集して必要な部分だけ残しておきます。
前回データセットの音声データの総量は3時間分くらいにしてましたが、今回は70分程度の長さにしました。推奨される長さについては相変わらず公式から特に何も提示されていないのでよく分かりません。たくさんデータがあるなら使ったほうが良いと思います。
次に、②背景雑音の除去をします。①で用意したデータに元々BGMや他の人の声などが含まれていない場合には、このステップが飛ばしてよいです。
ここでは特に音声データにBGMが含まれている場合の話をします。
今回はUltimate Vocal Remover (UVR)を使いました。Vocal Removerというアプリ名ですが声を音源から抽出する作業もできます。
UVRを使いますがやることは前と同じで、モデルはDemucs (v4)を利用しました。GUIだから操作が楽というだけです。
UVR等を利用して背景雑音の除去ができたら、③音声データを分割します。
このステップにはso-vits-svcのドキュメント内で紹介されているAudio Slicerを利用しました。
学習データセット内の1つの音声の長さは5秒から15秒の長さにすることが推奨されているので、これに従って用意した音声データを分割します。
Audio SlicerのMinimum Lengthの設定はデフォルトで5000msになっているのですが、なぜかこの設定のまま分割処理をすると3秒とかのデータが発生したので、8000msでやるといい感じでした。(バグ?)
最後に、④音声データの音量調整をします。このステップも、既に調整済みの場合はしなくてよいです。
今回はffmpeg-normalizeというユーティリティを使ってみました。
ラウドネス正規化というやつだと思いますが、正直そこらへんのことはよく分かってません。なんかいい感じに音量をブーストしてもらいました。
以上が今回のデータセット作りの過程です。前回よりは格段に良いものになったと思います。
学習の結果
学習データセットとしては8秒から10秒程度の音声クリップが460個で、480epoch(7200steps)まで学習させました。
また、Speech Encoderとしてはvec768l12、F0 predictorはdioを選択しました。デフォルト値です。
F0 predictorについてまだ良く分かっていないのですが、調べても論文くらいしか出てこないので読むしかないのか。どういう差異があるのかくらいは知りたいのですが、分かりやすい文献とか欲しいです。
あと、4.1になってからRVCっぽいFeature retrievalができるようになってたので、これ用のインデックスもついでに訓練しました。いくつかの種類の音声データの変換をやってみたのですが、元が人間の音声の場合はこの機能を使わないほうが自然で、元が合成音声(VOICEVOX)とかの場合は使ったほうが自然?(あまり差異が明らかでない)という感じでした。この機能については要検証です。
以下は生成サンプルです。いつも通りあみたろさんのITAコーパス読み上げ音声を変換しています。
推論時のF0 predictorはpmにしています。harvestは微妙でした。
RECITATION324_016:
RECITATION324_025:
RECITATION324_268:
以前のモデルでは学習データの背景雑音が除去できていなかったためか生成時に声が二重になったりなどの課題があったのですが、それは解決できている気がします。
変換後の音声にはまだ違和感はありますが、声質の変換自体は特に問題無いようです。とりあえず満足しました。