-
Notifications
You must be signed in to change notification settings - Fork 310
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ADD RVC Voice Changer #1096
Comments
fairseqのhubertモデルが内部で用いられているが、ONNXエクスポートが難しい |
RVCのコアモデルはONNXに変換できそうに思われる |
推論サンプルの中でhubertをloadしている |
hubertは音声におけるbertのような表現学習モデル |
hubertをonnxにエクスポートすると推論できない |
latestのtorchだとエクスポートと推論ができるとのこと |
@ooe1123 現在、取り組まれているモデルの後に、こちらのモデルの変換をお願いしてもよいでしょうか。 |
F.scaled_dot_product_attentionのエクスポートは、Nightly版で対応されたとのこと。
torch 2.1.0.dev20230722+cu118 |
RVC WebUIの導入 |
アーキテクチャとしてはPCM入力、PCM出力となっている。
|
リアルタイムモードにも対応したいため、バッチとリアルタイムで同じONNXが使用できるかを確認する必要がある。 |
VCモデルのONNX変換はWEBUIにも搭載されている。 |
MITライセンスのVCモデル。
if_f0はweightの中に入っている。下記のようにcptを取得し、cpt.f0で参照している。このモデルはf0を使用していない。
|
if_f0はpitch guidanceで歌声用にpitchを追加情報として与えるために追加されている気がする。 |
4secの音声ファイルのM2での処理時間。ailia SDK 1.2.15
|
MPS Profile hubert
vc
|
BLAS Profile hubert
vc
|
hubertはmatmulネック、vcはConv1Dネック。 |
4secの音声ファイルのRTX3080での処理時間。ailia SDK 1.2.15。
PCであればリアルタイム処理が可能。 |
WebUIの起動。
事前に下記のweightをダウンロードしておく必要がある。
声のモデルはweightsフォルダに配置する。 macOSの場合はCPU実行にする必要がある。
|
・filtfiltで16kHzのhigh pass filterをかけているが入力音声が16kHzだと不要ではないか? コメントアウトしても音質に問題はなさそうなので、C++実装では外しても良さそう。 ・長い音声で窓分割した場合のオーバラップはどのようにしているか? audioのshapeが(60736,)の場合、前後にt_padを加えて、audio_padのshapeは(156736,) = 60736 + 48000*2になる。 パラメータ
windowサイズがpadに比べて小さすぎて、ペナルティが大きい気もするが、デフォルト値は160になっている。 ・rms_mix_rateの効果は? rms_mix_rateのデフォルトは0.25。rmsは音の短時間のエネルギー。 ・リアルタイムモードの動作は? realtimeモードでは、gui_v1.pyにおいて、 indataがpushされると、input_wavにappendする。 ONNXモデルとしては、リアルタイムモードとバッチモードで共通のモデルを使用できる。 |
C++から呼び出す場合、if_f0がfalseであれば、16kHzのPCMから1つ目のモデルでEmbeddingを取得して、2つ目のモデルでPCMを取得するだけでシンプルに実装できそう。 |
feats = F.interpolate(feats.permute(0, 2, 1), scale_factor=2).permute(0, 2, 1) 下記でも等価になる。
下記で計算した誤差は0になる。
|
RMSは下記のコードで計算可能。
|
RVCのモデルサイズはhubert_baseが293.5MB、vcが110.2MB。 |
音声ファイルによってはailiaでもonnx runtimeでもhubertが下記のエラーになることがある。入力長に何か制約がありそう。onnxruntimeはhubertの出力の次元が0になって、その後のinterpolateでエラーになる。
|
サンプル数ごとに推論が成功するかどうか。 156736 -> OK |
40secの音声でもエラーになるので、入力長が一定以上になると動かない気がする。 |
hubertのONNXエクスポート時の音声ファイルの長さに影響されている可能性があるかどうか。 |
Transposeまでは正しい値が取れていて、Sliceで次元数が0になってしまっている。
|
下記の値が壊れていそうなのだけれど、グラフ的には壊れるのが不思議。 /encoder/Unsqueeze_6_output_0 <- "/encoder/Neg_output_0" <- "/encoder/Cast_2_output_0" <- "/encoder/Sub_output_0" <- "/encoder/Mul_3_output_0" |
@ooe1123 hubertのエクスポート時に、何らかのコードで、MatMulの前にSliceが入ってしまっているようでして、エクスポート時にこれを削除することは可能でしょうか? |
@kyakuno paddingがある場合とない場合とでif文による分岐が発生しており、どちらかのパターンにしか対応できていないモデルになってしまっているようですね。 |
hubertモデルのエクスポートにあたってfairseqの修正箇所 ○ fairseq/utils.py
↓
○ fairseq/models/wav2vec/utils.py
↓
○ fairseq/models/wav2vec/wav2vec2.py
↓
|
if_f0 = Trueの場合は、net_gにpitchとpitchfの引数が加わる。 |
protectが有効な場合、下記の式で補正する。この時、featsはfaissを適用したもの、feats0はfaissを適用しないものである。
|
faissは、k=8の近いfeature vectorを取得し、元のfeature vectorに重み付けする機能。 |
bug in the rvc.py does not actually get that layer from onxx model |
AIを使用したボイスチェンジャー。
https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI
The text was updated successfully, but these errors were encountered: