音声AIの情報を纏めるWikiです

×
2つかそれ以上のRVCモデルを合わせて1つのモデルを作る機能。



単純なマージ

RVC本家を使ったやりかた

ckptファイルの処理タブからできる。

「Aモデルの重み a」は、出来上がったモデル=A * a + B * (1 - a)で計算されるので、0にするとBモデルが、1にするとAモデルが出てくる。
よって例えば0.3にするとA:B = 3:7の割合でマージされる。(逆だったらすまん、まあ聞けば分かるやろ)

VC Clientを使ったやり方

実はVC Clientから複数モデルのマージができてすぐボイチェンで実験できる。
しかも2モデル以上にも対応。

VC Clientを起動し、下の方を見ていく。

下の方に「Merge Lab」が隠れているので、クリックすると、次のような画面が開く:

ここではスロットに入っているモデルが一覧で表示されている。
この画面で、混ぜたいモデル(複数可)の数値を0から100の範囲で動かす。合計100にしなくてもよい。
例えば上の画面では、モデル名が「E」「H」「K」「M」「N」の5モデルを、「2:2:2:1:1」の比率で混ぜたモデルが出てくる。
そして「merge」ボタンを押すと、一番最後のスロット(現在は200個目のスロット)にマージされた結果が入る。
pthファイル自体は、VC Clientがインストールされているフォルダの中の(おそらく)「model_dir/199」に入っているはずである。

ddpn08版を使用した場合

全く同様なので省略。正直次のeach key merge以外だったら、VC Clientを使ってマージするのがすぐ試せるし複数モデル混ぜられるし良い気がする。

Each key merge(キー別マージ・階層マージ・層別マージ)

ddpn08版のRVCのみに備わっているマージ機能。いわゆるStable Diffusionでの階層マージ(merge block weighted)に対応すると思われる。
RVCのモデルファイルの中には様々なkeyがあってそこに数値が保存されており、そのkeyごとにAとBをどれほどの比率で混ぜるかを指定してマージできる。

概要


起動し、「Merge」タブを開き「Each key merge」をクリックする。
すると下の方に「enc_p」「dec」「flow」「JSON」という項目が出てくる(JSONは比率を記録するためのものなので設定には関係ない)。
例えば「enc_p」をクリックすると、26個のパラメータが出てくる。

同様に「dec」も26個のパラメータ、「flow」も8個のパラメータがある。
要するに60項目の数字を入れる必要があり、沼である。
だが実験する上では、「enc_p」「dec」「flow」や、その中の小分類(enc_p.encoder.attn_layersの全6層やら)全てを「0」「1」にしてみていろいろ試すとよいと思われる。
(各key類別の、筆者による大まかな実験結果所見は後で記す。)

数値の見方は、それぞれの数値を「0」にするとモデルAのみが、「1」にするとモデルBのみがそのkeyについては使われる。
よって60個全てを0にするとモデルAが、1にするとモデルBが出てくる。

実際の使い方

一番上のModel AとModel Bからそれぞれモデルを選び(これはmodels/checkpointsフォルダの中身から選ぶ、よってそこに予めモデルを入れておく)、
Merge methodをWeight sumにし、Each key mergeにチェック(Add differenceは使いこなせないしまだ応用が分からない……研究者求む)。
上の要領で60個のパラメータそれぞれに値を入れていき(実験上では類別ごとに0か1かとかで試すとよい)、
一番下のほうを見る。

ここで「Merge and save」と「Merge and gen」がある。
  • 「Merge and save」では、入力したパラメータに従って、マージされ、一番上にある「Output name」に入力した名前でmodels/checkpointsに保存される。
  • 「Merge and gen」では、マージ結果を保存はせずに、代わりに「Inference options」をクリックした中にある「Source Audio」に指定したオーディオをそのマージで変換して再生してくれる。
実用上はMerge and genでひたすらマージ結果を試行錯誤しつつ、よいものが見つかったらMerge and saveをして保存すればよい。
(現在、本家RVC v2モデル2つを指定すると「Embedder Model」を「contentvec」に指定してやらないとオーディオが変換されないバグがある模様なので注意。)

筆者の所見(独自研究)

https://rentry.co/dkirg
手持ちモデルでいろいろ実験した結果を上にまとめている。
概要は以下の感じ。学習のデータ量やデータセットの性質やエポック数など様々なことに依存する可能性もある。また完全に独自見解なのでいろいろ間違っている可能性もある。みなさんマージして実験して情報を教えてください。

各類別の役割:
  • enc_p:入力音声に対する解像度のようなもの。事前学習モデルそのままだとヘナヘナ。あまり学習させた人の声音情報は持っていないが、「enc_p.encoder.ffn_layers」の層は学習データに近いピッチの解像度を上げる役割があり、さらに学習話者の母音の響きの特徴も持っている気がする。
  • dec: ここに声音の特徴が主に保存されている気がする。中でも一番「Aが喋ってるかBが喋っているか」の聴覚的判別に影響するのは「dec.resblocks」。さらにその第8層「dec.resblocks.8」は、他の層と比べてかなり多くの情報(低音の響きや録音特性のようなもの?)を持っている気がして、ここ一箇所を別のモデルと取り替えるだけでも体感音声がかなり変わって聞こえる。
  • flow: あまり分かっていない。子音の感じを司っている気がしなくもないが分からない(ここが事前学習モデルのままだと子音ノイズが目立つモデルになる気がする…)。

応用:
Model Aに質が高いモデル、Model Bに質は微妙だが声を使いたいモデルを入れ、次のパラメータでマージする:
  • enc_p.encoder.ffn_layers(母音の響き?)とdec全部を1(モデルBに全振り)、他を全て0(モデルA寄り)にする。
  • さらに追加で「dec.resblocks.8」を0の方へ下げていく。
すると、Model Bの声音のままで、Model Aのような響き・音質の、質がよいモデルができる(ことが多い)(気がする)(Model AとModel Bの学習音声のピッチは揃えたほうが良さそう)。
「dec.resblocks.8」をAに下げれば下げるほど音の響きがModel Aに寄っていき質が高く聞こえる気がするが、声がModel Aの雰囲気がちょっと出てきてしまう気もする。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

どなたでも編集できます

広告募集中