Style-Bert-VITS2の後継? VoiceSpeechMaker-core
こんにちは。休暇亭 向日葵 です。
今回はVoiceSpeechMaker-coreの変更点を解説していきます。
VoiceSpeechMaker-coreについて
私はVoiceSpeechMakerというAivisSpeech派生(互換)ソフトウェアを作ってます。
VoiceSpeechMaker-coreはStyleBertVITS2をベースにしたVoiceSpeechMakerの推論、学習ライブラリです。
今までの変更点は主に辞書を拡張でしたが、今回モデルアーキテクチャを変えずに特徴量抽出(埋め込み?)モデルをmodernBertに変更し継続事前学習を行いました。
(まだVoiceSpeechMaker-Engineの方は対応していません)
Style=Bert=VITS2に関してはStyle-Bert=VITS2の作者litaginさんの記事をお読みください。
modernBertについて
今回はmodernBertの解説は省いて要点だけ解説します。
modernBertの特徴ですがパラメータ数が少なくてもパラメータ数が大きい従来のモデルと変わらない性能を誇ることです。
パラメータ数は小さいほどモデルの容量や推論時間が小さくなります。
Bertを変更すれば理論的には音声合成の精度はそのまま推論時間やストレージを小さくできるはずです。
ただ、音声合成には学習時のBertを使う必要があるので、Bert変更前の過去の音声合成モデルを使用するには以前のBertが必要になります。
両方のバージョンに対応したBertを含めるのは大変なのでVoiceSpeechMaker-coreはmodernBertしかサポートしません。
なので、VoiceSpeechMaker はStyle-Bert-VITS2と完全な互換性がありません。
一応アーキテクチャを変更していないので推論はできます。
挙動としてはBert特徴量が入っていない推論みたいになります。
具体的な変更点
Bert特徴量を単語単位で入力していたが、文章単位で入力するよう変更。
modernBertアーキテクチャの日本語埋め込みモデルcl-nagoya/ruri-30mを使用するよう変更
(Style-Bert-VITS2は埋め込みモデルでもないbertから特徴量を取ってきていました。特徴量埋め込みに使うので今回埋め込みモデルを使用してみました。)
主な変更位置
ruri-v3-30mの次元が256次元なので1024次元に整形しています。
音素の先頭記号の位置に1行にした出力をいれ、その他の部分をゼロで埋めることで推論時の互換性を保っています
事前学習モデルについて
bertモデルを変えたことにより事前学習モデルの再作成が必要になります。
今回はモデルのアーキテクチャを変更していないので継続事前学習をすることにしました。
rtx3060 12gbでjvnvコーパスを10エポック、22000step学習しました。
学習には4時間かりました。
学習機材はローカルllmに向き合う会の過去のイベントでいただいたものを使用しました(現在はやっていません)
この場を借りてお礼申し上げます。
pthからsafetensorへの変換はようさんの記事のコードを使わせていただきました。
onnx対応について
onnx化した埋め込みモデルはhugging faceWarihima/ruri-v3-30m-onnxに置いています。
変換コードは以下にあります。
optimumがmodernBertのonnx変換に対応したことにより、以下の問題は解決されました。
注意点として、
fp16化と最適化したら性能が落ちたのでfp32のままだが、コードの互換静的にモデルの名前がmodel_fp16.onnx
flash attentionがonnx変換で動かなかったので、普通のattentionを使用。
性能について
Style-Bert-VITS2のデフォルトモデルのjvnb-F2-JPと比較するために、同じデータセットを使ってVoiceSpeechMaker-coreでモデルを学習しました。
jvnv-no-nvデータセットのF2を使用して学習しました。
パラメータは バッチサイズ1 検証データ10 10エポック 5000step
かかった時間はrtx 3060で一時間
下記の記事を参考にDNSMOSを使用しました。
結果(小数点第2位まで)
p_808は多分、国際的な音声判定基準?
P.808: Subjective evaluation of speech quality with a crowdsourcing approach
のことっぽいです。
p_808のスコアが高くて、あとは大体据え置きなので、結構いい感じではないでしょうか。
デフォルトのjvnv-f2のモデルより学習エポックが10分の1くらいなので、めちゃくちゃいい結果だと思います。
最後に
意外とうまくいったので、驚いてます。
最後まで読んでくださりありがとうございました。
Discussion