【ddPn08 – RVC v1モデル対応版】RVC WebUIの設定解説
【更新状況】
2024年12月24日(火)
記事ページを公開しました。
これから、だだっこぱんださん版のRVC WebUIを始めてみたい方向けのチュートリアルです。
【対応ノートブック】
ダウンロード:RVC v1モデル – ddPn08版RVC WebUIチュートリアル用のノートブック
このチュートリアルは、RunPodでRVC WebUI起動後のRVC WebUIの各種設定に焦点を当てています。
RunPodの仕組みや使い方がわからない方は、以下の移行ガイドのチュートリアル
:【ddPn08 – RVC v1モデル対応版】移行ガイド:RunPodでRVC WebUIを使う方法(要点解説)
を事前に把握していただくと、RunPodでRVC WebUIを使う方法の理解が深まるのではないかと思います。
【動画で解説】RunPod編:RVC v1モデル – ddPn08版RVC WebUIの使い方(設定詳解)
動画でも解説予定です。
文字情報だけでは理解しにくい場合などにご活用ください。
一度動画を視聴いただき、手順の全体像のイメージを作ってから、記事を活用いただくと理解しやすいかもしれません。
【ddPn08 – RVC v1モデル対応版】RVC WebUIの使い方:音声分割
– Split Audio
* 画像をクリックすると拡大表示されます
「Split Audio」(音声分割)の機能は、データセットを作成する際に役に立つ機能です。
「Split Audio」(音声分割)のタブをクリックし、以下のように設定します。
(一例です)
Input Audio (File or Directory):
(入力音声:処理したい「音声ファイル」または「フォルダ」へのパスを入力します)
/workspace/rvc-webui/audio/splitauidotest.wav
*「audio」フォルダ内に処理したい音源「splitauidotest.wav」を配置した場合の例
音声ファイルは、「wav」「mp3」などを使います。
チュートリアル用のサンプル音声も無料公開しておきました。必要に応じて音声分割の練習用にご活用いただけますと幸いです。
サンプル音声ダウンロード
:ダウンロード:音声分割(Split Audio)を試す音声素材
Output Directory:
(音声分割後の音声ファイルが出力されるフォルダの指定)
OriginalDataset
「rvc-webui」フォルダ内に、ここで指定したフォルダ名のフォルダが作成され、音声ファイルが出力されます。
半角英数でお好きな名前に設定してください。
「Training」(学習)の際の設定で、分割後の音声ファイルが入ったフォルダ(例「OriginalDataset」)を「Dataset glob」(学習させるデータセットフォルダのパスを指定)で指定すれば、データセットとして使えるようになります。
Silence Threshold:
(無音の音量のしきい値の設定)
-40
デシベル(dB)単位で、無音と判定するための音量のしきい値を設定します。
初期設定では「-40dB」の音量を無音として検出しています。
【参考】
・10dB → かすかな呼吸(ほとんど音が聞こえない環境)
・30dB → 静かな場所(とても静かな環境)
・60dB → 普通の会話(日常会話)
・90dB → 混雑した場所の交通音(都市の騒音)
・110dB → 大音量のコンサート(大音量)
・130dB → ジェット機のエンジン音(耳が痛いほどの大音量)
・-40dB → 1/100倍
・-20dB → 1/10倍
・-10dB → 1/3倍
・-6dB → 1/2倍
・0dB → 1倍
・6dB → 2倍
・10dB → 3倍
・20dB → 10倍
・40dB → 100倍
・60dB → 1,000倍
・80dB → 10,000倍
・100dB → 100,000倍
・120dB → 1,000,000倍
Minimum Silence Length:
(無音区間の最小無音時間の設定)
750
ミリ秒単位で、無音区間の最小の時間を設定します。
* ミリ秒(ms):0.001秒。1秒は1000ミリ秒。
初期設定では「750ミリ秒」(0.75秒)以上の無音時間をを無音区間として検出しています。
Keep Silence:
(音声の分割後の前後に追加する無音時間の長さの設定)
750
ミリ秒単位で、分割後の音声ファイルの前後に追加する無音区間の長さを設定します。
初期設定では「750ミリ秒」(0.75秒)を分割後の音声ファイルの前後に追加しています。
Margin:
(マージン)
0
(おそらく..)デシベル単位で、マージンを設定します。
音量を検出する際の「余裕」(許容範囲)に関する設定かと思われます。
初期設定では「0」になっています。そのままでもいいかと思われます。
Padding:
(パディング)
チェックを入れる
(おそらく…)パディング(補正のようなもの)を施すかどうかの設定かと思われます。
初期設定ではパディングを「有効化」になっています。そのままでもいいかと思われます。
Minimum audio length:
(音声ファイルの最小の長さの設定)
1000
ミリ秒単位で、出力する音声ファイルの長さの最小の時間を設定します。
初期設定では「1000ミリ秒」(1秒)に設定されています。
Maximum audio length:
(音声ファイルの最大の長さの設定)
5000
ミリ秒単位で、出力する音声ファイルの長さの最大の時間を設定します。
初期設定では「5000ミリ秒」(5秒)に設定されています。
設定ができたら「Separate」(音声ファイルを分割する)をクリックします。
初期設定のままだと
・1秒〜5秒程度の音声ファイルに分割
される設定になっています。
チュートリアルの設定では処理が完了すると「OriginalDataset」フォルダ内に
・「splitauidotest_0.wav」
・「splitauidotest_1.wav」
・「splitauidotest_2.wav」
〜
・「splitauidotest_14.wav」
などの音声ファイル名に数字の付いた音声ファイルが出力されます。
「Training」(学習)の際に
Dataset glob:
(学習させるデータセットフォルダのパスを指定)
/workspace/rvc-webui/OriginalDataset
*「rvc-webui」フォルダ内にある「OriginalDataset」というデータセットフォルダを指定した場合の例
などと、分割された音声ファイルが出力されたフォルダを指定すると、データセットとして使えます。
【ddPn08 – RVC v1モデル対応版】RVC WebUIの使い方:学習
(データセットで学習モデル作成)- Training
* 画像をクリックすると拡大表示されます
「Training」(学習)のタブをクリックし、以下のように設定します。
(一例です)
Model Name:
(出力される学習モデルの名前)
amitaro
チュートリアルでは分かりやすいように「amitaro」という名前にしています。
RunPodでは「Volume Disk」(ボリュームディスク領域:ポッド契約中の永続保存領域)にファイルが保存され続けます。RunPodの仕様を考慮すると「amitaro48kv1id0」などと後述する設定内容を忘れないようにしておくと、「Speaker ID:」(識別IDの設定)にまつわる音質の低下を予防できるのではないかと思います。
また、学習モデル同士を融合させる場合に、違う「Target sample rate」(サンプリングレート)ではエラーとなるようでしたので、作成した学習モデルを融合させる予定の方は、周波数も名前に記載しておくといいかもしれません。
Ignore cache:
(キャッシュを無視するか)
チェックなし
ここのチェックをなしの状態にするとキャッシュの使用が有効化されます。
Dataset glob:
(学習させるデータセットフォルダのパスを指定)
/workspace/rvc-webui/datasets/dataset
*「rvc-webui」フォルダ内にある「datasets」フォルダの中に「dataset」というデータセットフォルダを配置した場合の例
Speaker ID:
(識別IDの設定)
0
推論の際に識別できるように、識別IDを指定しておきます。
識別IDの番号は「Inference」(推論)の際の音質に影響しますので、「Model Name:」(出力される学習モデルの名前)の設定で「amitaro48kv1id0」などと識別ID番号を入れておくといいかもしれません。
識別IDは、RunPodで使う際の利便性を考慮し「0〜1000」の範囲で指定できるようにコードを改変しておきました。
また、「modele」フォルダ内の「checkpoints_link」フォルダの中に出力される該当フォルダ(チュートリアルでは「amitato_index」フォルダ)内に
・「学習モデル名.識別ID.index」
・「学習モデル名.識別ID.big.npy」
という形で「識別ID」付きのindexファイルやnpyファイルが出力されるようでしたので、識別IDを忘れた際などに参考にしてみてください。
Target sample rate:
(サンプリングレート)
48k
(48000Hz)
基本的には音声ファイルのサンプリングレートに近い数値に合わせますが、お好みに応じて「32k」(32000Hz)「40k」(40000Hz)「48k」(48000Hz)から選択してみてください。
f0 Model:
(f0モデルの設定)
yes
「f0」とは、ピッチ情報・基本周波数のことをさしているようです。
おそらくですが、ここの設定を「yes」にすると、「ピッチありのモデル」になり。「no」に設定すると、「ピッチレスモデル」になるのではないかと思われます。
音質の精度を求めている方や、リアルタイムボイスチェンジを予定されている方、そして、楽曲から抽出したボーカルの音声の変換を予定されている方などは、「ピッチありのモデル」にするために、ここの設定を「yes」にするようにします。
リアルタイムボイスチェンジ時の難点としては、「ピッチありのモデル」の場合には、精度が良い代わりに、パソコンに負荷をかけるようです。そのため、精度よりも遅延の影響を気にされる方は、ここの設定を「no」にして、「ピッチレスモデル」にするという選択肢もあるようです。
しかし、だだっこさん版のRVC v1モデル対応RVC WebUIで、「ピッチレスモデル」を試したところ、学習の途中で正常に処理が完了しない(学習モデルが出力されない)ようでした。そのため、設定にまつわるエラー回避を目的として、「ピッチありのモデル」のみの選択となるようにプログラムを改変しておきました。
Using phone embedder:
(phone embedderの設定)
contentvec
事前学習モデルを選択します。
「hubert_base」(フーベルト・ベイス/ヒューバート・ベイス)・「contentvec」(コンテント・ベック/コンテンツ・ベック)や、「hubert-base-japanese」(フーベルト・ベイス・ジャパニーズ/ヒューバート・ベイス・ジャパニーズ)という、日本語の音声に特化したHuBERTモデルを選択できます。
* 注:hubert_base
HuBERT: Self-supervised representation learning for speech recognition, generation, and compression – 2021 | arxiv
(HuBERT:音声認識・生成・圧縮のための自己教師あり特徴表現学習 2021年)
* 注:contentvec
約1000時間のLibriSpeech(英語のデータセット)で学習したHuBERT-baseをベースに、話者性を除いた特徴量を得られるようにLibriSpeechで再び学習したモデル。
ContentVec: An Improved Self-Supervised Speech Representation by Disentangling Speakers – 2022 | arxiv
(ContentVec:話者を分離することで改善された自己教師あり音声表現)
* 注:hubert-base-japanese
約16000時間のReazonSpeech(日本語のデータセット)で学習したHuBERT-base。日本語の特徴量を得る傾向がある。
「contentvec」(コンテント・ベック/コンテンツ・ベック)は、「hubert_base」(フーベルト・ベイス/ヒューバート・ベイス)から話者性を除いた特徴量を得られるように学習し直しています。両方とも英語で学習していることもあり、声質は似せることができますが、日本語の発音が苦手な傾向があるようです。
今回は、お試しで「hubert-base-japanese」も使えるようにプログラムを改変しておきましたが、「hubert-base-japanese」の「40k」版は、音質が不安定な印象を受けており、うまく音声変換できない印象を受けています。
そのため「hubert-base-japanese」で音声変換したい場合には以下の
ダウンロード:RVC v2モデル – ddPn08版RVC WebUIチュートリアル用のノートブック
RVC v2モデル対応のだだっこぱんださん版のRVC WebUIで、「48k」版の「hubert-base-japanese」を試してみてください。
だだっこぱんださん版のRVC v1モデル対応のRVC WebUIでは、ここの設定は
・contentvec
が第一選択になるかと思います。
その他のモデルはお試し程度に活用してみてください。
Embedding channels:
(次元数の設定)
768
「256」(256次元)と「768次元」のどちらかを選択できます。
精度を求める場合には、「256次元」よりも「768次元」の方が良いようです。
GPU ID:
(GPUのID)
0
初期状態は「0」です。
GPUの数が「1つ」の場合には
GPU ID
(使用するGPUのID)
0
にします。
RunPodの設定で、GPUメモリを2つ以上利用している場合には、ここの設定で
・ハイフン[-]で区切って使用するカード番号を入力
(例:0-1-2はカード0、カード1とカード2を使用)
します。
例としてGPUの数を「2つ」にした場合には、
GPU ID
(使用するGPUのID)
0-1
と半角英数で「–」「1」を付け足します。
GPUの数を「3つ」にした場合には、同じように
GPU ID
(使用するGPUのID)
0-1-2
と半角英数で「–」「1」「–」「2」を付け足します。
試した範囲では、メモリを2つ以上使用している場合には、自動的に設定が反映されるようでした。
ただ、学習を実行中にJupyterLab上の出力でエラー表示
エラー出力例:(メモリを2つ以上利用している場合)
train_all: emb_name: contentvec
〜
File "/workspace/rvc-webui/modules/tabs/training.py", line 182, in train_all
train_model(
File "/workspace/rvc-webui/lib/rvc/train.py", line 199, in train_model
if device.type == "mps":
AttributeError: 'NoneType' object has no attribute 'type'
(属性エラー:'NoneType'オブジェクトには属性'type'がありません。)
になり、学習の処理が完了しないようでした。
そのため、
・GPUメモリは1つだけにする
ように注意してください。
Number of CPU processes:
(CPUプロセス数)
128
初期設定は「128」です。
RunPod上で試した範囲では、数を増やしても減らしてもどちらでも大差はないかと思われました。
Normalize audio volume when preprocess:
(前処理として音声のボリュームを正規化するかどうか)
yes
処理の過程で、音量を調整する機能のようです。
初期設定では「yes」になっています。
Pitch extraction algorithm:
(ピッチ抽出アルゴリズム)
harvest
歌声の処理を高速化するには「pm」を使用します。入力した音声が高音質でCPUが貧弱な場合には「dio」で高速化できます。「harvest」の方が「pm」と「dio」に比べて品質は良いですが処理が完了するのに時間がかかります。
Batch size:
(バッチサイズ)
3
学習するデータセットをどの程度の1回あたりの処理量にするかを指定します。
GPUメモリが多い場合には、ここの数値を大きくすると、過学習が予防できるようです。
注意点としては、膨大な量のデータセットで学習させる際などに、あまり大きな数値にすると、メモリが足りなくなりエラーとなるリスクも考えられますので、RunPodの管理画面のGPUメモリ使用率の状況を見つつ、途中でエラーとなる方などはここの数値を試行錯誤してみてください。
参考情報として、「RTX A4000」(GPU 16GB)で1〜3秒の音声ファイル200個(25MB:16ビット・モノラル・44.1kHz)を使って100回学習(48k・768次元・contentvec・harvest)させた際に、ここの値を「20」にすると
Extracting f0… (ピッチ抽出の処理)
:GPU Utilization 0%
:GPU Memory Used 7%
Training model…(学習)
:GPU Utilization 100%〜75%(エポックの表示開始後100%。数分経過後に一時的に75%〜80%。50回以降で96%〜100%推移)
:GPU Memory Used 59%
の結果でした。
「GPU Memory Used」の割合が100%以下であれば学習を完了できるようでした。
その後、さらにバッチサイズの値を上げてみました。
上述の200ファイルのデータセットを使いここの設定を「50」にすると、
・Training model…(学習中…)
の途中でJupyterLab上の出力で以下のエラー
エラー出力例:(メモリオーバー)
〜
torch.cuda.OutOfMemoryError: CUDA out of memory.
(メモリ容量超えのエラー)
Tried to allocate 28.00 MiB
(GPU 0; 15.72 GiB total capacity; 12.78 GiB already allocated; 15.06 MiB free; 14.74 GiB reserved in total by PyTorch)
(28.00MiBを割り当てようとしました。GPU 0; 総容量15.72GiB; 既に12.78GiBが割り当てられている; 15.06MiBが解放されている; PyTorchによって合計14.74GiBが予約されています。)
If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
(もしも「予約メモリ」が「割り当てメモリ」を大きく超えてしまう場合には、断片化を避けるために「max_split_size_mb」を設定してみてください。
詳しくは、「メモリ管理とPYTORCH_CUDA_ALLOC_CONF」のドキュメントを参照してください。)
が出力され、学習が完了しませんでした。
一例として、メモリオーバーの際にはRunPodの管理画面上のGPUの使用率のバーは反応しない場合もあるようでした。
そのため、RVC WebUI上の学習の「Status」(状況)の表示が「Training model…(学習中…)で止まってしまう(点滅が止まる)現象や、「Error」(エラー表示)などがある場合には、JupyterLab上の出力結果で、エラーの原因を確認してみてください。
Number of epochs:
(学習回数 – エポック数)
10
2024年10月時点のRVC公式のQ&Aでは、
推奨される学習回数としては
・低品質の音声ファイルによるデータセット
:20〜30回
* 低品質の音声ファイル:データセットの音声の品質が低く、ノイズフロアが高い場合
* ノイズフロア:音声ファイル全体に含まれるノイズ
とのことで、設定を高くしすぎると低品質の音声ファイルによるデータセットによる学習では、これ以上学習しても音質の改善は見込めないようです。
一方で
・高品質の音声ファイルによるデータセット
:200回(学習回数の許容範囲)
* 高品質の音声ファイル:データセットの音声の品質が高く、ノイズフロアが低い、十分な合計再生時間(5分〜10分)のある場合
とのことです。
また、データセットの合計再生時間の推奨時間は
・10分〜50分程度
とのことです。
音声変換の質を向上させたい場合には
・「5〜10分」の高品質のデータセットを用意
・学習回数の許容範囲「200回」
がとりあえずの目安かもしれません。
ただ、これまでに報告をいただいた情報では
・学習回数を減らすことで音声変換の質が向上
された事例の報告もいただいていますので、試行錯誤してみてください。
だだっこぱんださん版のRVC WebUIでは
・Using phone embedder:
(phone embedderの設定)
を何にするかでも大きく品質が変わってくるのではないかと感じています。
RVC v1モデル対応のだだっこぱんださん版のRVC WebUIの場合には「contentvec」の利用が無難かもしれません。
【再学習に関して】
再学習させる場合にはチェックポイントファイル(「D_〜.pth「G_〜.pth」)が保存されている必要があります。
* チェックポイントファイルの場所:「models」フォルダ内の「training」フォルダの中の「models」フォルダの「該当学習モデル」フォルダ内の「state」フォルダの中
チェックポイントファイル(「D_〜.pth「G_〜.pth」)が保存されている場合には
Model Name:
(出力される学習モデルの名前)
amitaro
Speaker ID:
(識別IDの設定)
0
* 識別IDを合わせるのは必須ではありませんが、合わせるのが無難かと思います
を同じにした状態にします。
前回の学習回数が「10」回の場合には
Number of epochs:
(学習回数 – エポック数)
20
と設定すると追加の「10」回分の学習ができます。
Save every epoch:
(学習の状況の保存頻度)
5
チェックポイントファイル(「D_〜.pth「G_〜.pth」)の保存頻度を設定します。
「Training」(学習)後に出力される「models」フォルダ内の「training」フォルダの中の「models」フォルダの該当フォルダ内の「state」フォルダに出力される学習ログのチェックポイントファイルがディスク容量を圧迫す原因になります。
「Volume Disk」(ボリュームディスク領域:ポッド契約中の永続保存領域)の残りの容量に応じて保存頻度を調整してください。
試した範囲では、チェックポイントファイルを1回保存すると「1GB」程のディスク容量が必要です。
再学習させたい場合には一番数字の大きな「D_〜.pth「G_〜.pth」ファイルを残しておくだけで大丈夫ですので、必要に応じて不要なチェックポイントファイルを削除してください。
Cache batch:
(キャッシュバッチ)
チェックあり
チェックを入れると、高速化されるようです。
初期設定では「チェックあり」になっています。
FP16:
(エフピー16)
チェックあり
「16ビットの浮動小数点数フォーマット」でデータ量を削減するかどうかを設定できるようです。
そのため、チェックを入れると軽量化と、高速化されるようです。ただ、データ量を削減するので品質は低下するようです。
初期設定では「チェックあり」になっています。
Pre trained generator path:
(事前学習生成器のパス)
/workspace/rvc-webui/models/pretrained/f0G48k768.pth
各種設定状況に応じて自動的に設定されます。
Pre trained discriminator path:
(事前学習弁別器・識別器のパス)
/workspace/rvc-webui/models/pretrained/f0D48k768.pth
各種設定状況に応じて自動的に設定されます。
設定ができたら
・Train
(学習開始)
のボタンをクリックします。
しばらくすると以下のような表示になります。
RCV WebUI上の出力結果
*「Status」の出力
Training completed(学習完了)
RunPod-v1-RVC-WebUI-ddPn08-Historical-Legacy-for-Japanese-AI-beginners.ipynb上の出力結果
*【手順4:RVC WebUIの起動】の出力
〜
content/rvc-webui/models/training/models/amitaro/state/G_5.pth
Saving model and optimizer state at epoch 5 to /content/rvc-webui/models/training/models/amitaro/state/D_5.pth
save: emb_name: contentvec 768
100% 50/50 [01:03<00:00, 1.66it/s, epoch=10, loss_d=1.85, loss_g=40.1, lr=9.99e-5, use_cache=0]Saving model and optimizer state at epoch 10 to /content/rvc-webui/models/training/models/amitaro/state/G_10.pth
Saving model and optimizer state at epoch 10 to /content/rvc-webui/models/training/models/amitaro/state/D_10.pth
save: emb_name: contentvec 768
Training is done. The program is closed.
(学習が実行されました。プログラムを終了します。)
* 注:「Save every epoch:」(学習の状況の保存頻度)の設定を「0」にした場合には「Saving model and 〜Training is done. The program is closed.」までの表示がないようでした
出力された学習モデルは、JupyterLab上でダウンロードできます。
「models」フォルダの「checkpoints_link」フォルダ内に
・「amitaro.pth」
*「Model Name:」(出力される学習モデルの名前)で「amitaro」という名前に設定した場合の例
という学習モデルが出力されています。
必要に応じてローカル環境(自分のパソコン)にダウンロードして、リアルタイムボイスチェンジなどに挑戦してみてください。
AIを利用したリアルタイムボイスチェンジャーのクライアントソフトウェアVC Client:
w-okada/voice-changer(The MIT License)| GitHub
【ddPn08 – RVC v1モデル対応版】
RVC WebUIの使い方:推論(音声変換)- Inference
* 画像をクリックすると拡大表示されます
「Inference」(推論)のタブをクリックし、以下のように設定します。
(一例です)
上記のボタンをクリック後に
Model:
(学習モデル)
amitaro.pth
*学習の際に「Model Name:」(出力される学習モデルの名前)を「amitaro」にした場合の例
が設定できるようになります。
Speaker ID:
(識別IDの設定)
0
学習の際の「Speaker ID:」(識別IDの設定)に合わせます。
識別IDを変えると音質が変わるようでした。
「modele」フォルダ内の「checkpoints_link」フォルダの中に出力される該当フォルダ(チュートリアルでは「amitato_index」フォルダ)内に
・「学習モデル名.識別ID.index」
・「学習モデル名.識別ID.big.npy」
という形で「識別ID」付きのindexファイルやnpyファイルが出力されていますので、必要に応じて参考にしてみてください。
Source Audio:
(ボイスチェンジする音声ファイルの指定)
/workspace/rvc-webui/voice/originalvoice.wav
音声変換した音声ファイルへのパスを入力します。
「rvc-webui」フォルダ内の「voice」フォルダに入っている「originalvoice.wav」という音声ファイルを配置した場合の例です。
Out folder:
(ボイスチェンジ後の音声ファイルの出力先を指定)
/workspace/rvc-webui/outputs
音声変換後の音声ファイルの出力先のフォルダ名を指定します。
初期設定では「outputs」フォルダ内に音声ファイルが出力されます。
Transpose:
(変調)
12
ボイスチェンジ時に推奨されることとして、男性から女性への音声変換は「+ 12キー」、女性から男性への音声変換は、「– 12キー」にすることが推奨されているようです。
声の高さが同じ声質の場合には、設定を「0」にします。声のキーが高い女性の声にする場合には、12キーよりもさらに上げてもいいかもしれません。
チュートリアルの設定や音声では、あみたろさんの声に近づけるには、「12」よりも、さらにキーを高くした方がよさそうでした。
Pitch extraction algorithm:
(ピッチ抽出アルゴリズム)
harvest
RVC v1モデル対応のだだっこぱんださん版RVC WebUIでは、「pm」と「harvest」を選択できます。
「pm」は、 処理が高速ですは音声の品質は低いようです。
「harvest」は、品質は向上しますが処理が遅いようです。また、低音の音声変換の場合に推奨のようです。
Embedder Model:
(Embedderモデル)
auto
学習の際に「Using phone embedder:」(phone embedderの設定)で設定したモデルを選択します。
「auto」にすると、自動的に「contentvec」か?「hubert_base」か?「hubert-base-japanese」か?を判別してくれますので便利です。
Auto Load Index:
(自動的にindex形式ファイルを取得)
チェックあり
学習の際に出力された「index形式ファイル」のパスを自動的に取得してくれる便利な機能です。
Faiss Index File Path:
(Faissインデックスファイルのパスなどを設定)
未記入
(一例です)
* Faiss(Facebook AI Similarity Search):Facebookが開発した近似最近傍検索ライブラリ
チュートリアルでは「Auto Load Index:」(自動的にindex形式ファイルを取得)の機能を使うので、ここの欄は未記入(空欄)にします。
「Auto Load Index:」(自動的にindex形式ファイルを取得)の機能を使わない場合には、手動でパスを入力する必要があります。
一例として、学習の際に「Model Name:」(出力される学習モデルの名前)を「amitaro」にした場合、手動で入力したい方は
/workspace/rvc-webui/models/checkpoints_link/amitaro_index/amitaro.0.index
*「rvc-webui」のフォルダの「models」フォルダの「checkpoints_link」フォルダの「amitaro_index」フォルダ内の「〜.index」のファイルのパスをコピー後に入力欄に貼り付けてください
と入力します。
Big NPY File Path:
(Big NPYファイルのパスを設定)
未記入
(一例です)
チュートリアルでは「Auto Load Index:」(自動的にindex形式ファイルなどを取得)の機能を使うので、ここの欄は未記入(空欄)にします。
「Auto Load Index:」(自動的にindex形式ファイルなどを取得)の機能を使わない場合には、手動でパスを入力する必要があります。
一例として、学習の際に「Model Name:」(出力される学習モデルの名前)を「amitaro」にした場合、手動で入力したい方は
/workspace/rvc-webui/models/checkpoints_link/amitaro_index/amitaro.0.big.npy
*「rvc-webui」のフォルダの「models」フォルダの「checkpoints_link」フォルダの「amitaro_index」フォルダ内の「〜.npy」のファイルのパスをコピー後に入力欄に貼り付けてください
と入力します。
Retrieval Feature Ratio:
(検索特徴率)
0.5
アクセントの強さをコントロールします。高すぎる(「1に近づける」)とアーチファクトが発生する場合もあるようです。
数値を変えて音声がどうなるか?色々と試してみてください。
チュートリアルの設定では、「1に近づける」とアーチファクトが発生するようでした。「0.5」にするとよさそうでした。
検索特徴率を「1」に近づけるほど、今回学習させた「学習モデル」の特徴(音色の品質)に偏らせるようです。
1〜3秒の音声ファイル200個(25MB:16ビット・モノラル・44.1kHz)を使って100回学習(48k・768次元・contentvec・harvest・Batch size:20)させた学習モデルを使うと、ここの値を「1」に近づけてもアーチファクトが気にならなくなりました。音声ファイルを増やし、学習回数を増やすと音質が向上するようでした。
学習の際にJupyterLab上に出力された学習の指標の1つである損失関数の値の経過を見てみると
・「epoch=1 loss_d=3.56 loss_g=47」
(学習1回目・dの損失関数=3.56・gの損失関数=47)
* d:discriminator(弁別器・識別器)
* g:generator(生成器)
* 損失関数:0に近づくほど性能が良い
↓
・「epoch=100 loss_d=0.892 loss_g=47」
(学習100回目・dの損失関数=0.892・gの損失関数=47)
ということで「dの損失関数」の値が良くなっているようでした。
追加で学習回数を増やした際には、損失関数の値がどうなっているのかをチェックするといいかもしれません。
損失関数の値が頭打ちになった際には、それ以上学習しても性能が上がらない可能性が考えられます。
F0 Curve File:
(ピッチ曲線ファイル)
未設定
* F0(最低共振周波数:エフゼロ・エフォー):ピッチ(音高)の低域の最下限のこと。単位はHz
* F0 curve:f0曲線・ピッチ曲線
ピッチ曲線ファイル(F0曲線ファイル)を設定することができるようです。
おそらくですが、ピッチ(音高)の低域の最下限を指定したい場合などに活用できるのではないかと思われます。
個人で調べられた範囲の情報では、ピッチ曲線ファイルは、学習を実行後に出力される「models」フォルダ内の「training」フォルダの中の「models」フォルダ内に出力される学習モデル名の該当フォルダ内にある
・「2a_f0」フォルダの「00000」フォルダ
の中にあるnpyファイルのことのようです。
チュートリアルの設定では、データセットで10個の音声ファイルを使っているので
・0_1.wav.npy
・0_2.wav.npy
〜
・9_1.wav.npy
・mute.wav.npy
などと、10個以上のnpyファイルが出力されています。
npyファイルは
・「dataset」フォルダを表示させた際の音声ファイルの順番
に左端の数字が「0」から順番に割り当てられています。
「_ 」(アンダーバー)の右にある数字は、基本的に「1」になりますが、データセットの音声を処理の過程で分割した場合に、「2」などの1以降の数字が割り当てられます。
例:
1番目のデータセットの音声ファイル2つに分割した2つ目の音声ファイルのピッチ曲線ファイル
→ 0_2.wav.npy
10番目のデータセットの音声ファイルのピッチ曲線ファイル
→ 9_1.wav.npy
上記の規則を理解すれば、概ね該当の音声ファイルの見当がつくのではないかと思います。
また、数字が割り当てられた音声ファイルを確認することもできます。
数字が割り当てられた音声ファイルは、「models」フォルダ内の「training」フォルダの中の「models」フォルダ内に出力される学習モデル名の該当フォルダ内にある
・「1_16k_wavs」フォルダの「00000」フォルダ(「2a_f0」フォルダと同じ階層)
の中にあります。
RunPodで実行中のJupyterLabから、ローカル環境(自分のパソコン)に音声ファイルをダウンロードして音声を確認し、ここの設定で指定したいピッチ曲線ファイルを決めます。
指定したいピッチ曲線ファイル(npyファイル)が決まったら、ローカル環境から
・「f0 curve file」をドラッグ&ドロップ
します。
ただ、試した範囲では推論はできるが、JupyterLabの出力上に以下のエラー
エラー出力例:(フォルダの参照エラー)
Traceback (most recent call last):
File "/workspace/rvc-webui/lib/rvc/pipeline.py", line 285, in __call__
lines = f.read().strip("\n").split("\n")
File "/usr/lib/python3.10/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 0: ordinal not in range(128)
(ユニコードのデコードエラー: 'ascii'コーデックは位置 0 のバイト0x93をデコードできません。序数が128の範囲にありません。)
が出るようでした。
また、文字のエンコーディングを指定してみても新たなエラーとなるようでしたので、ここの機能は使えないのかもしれません。
設定が完了したら
・Infer
(推論を開始)
のボタンをクリックします。
数秒〜20秒ほどで推論完了。
1〜3秒ほどのファイル10個で学習させただけでしたが、聞いてみると女性っぽい声に変換されていました。また、声の高さに関しては、変換したい声質に応じてキーの調整が必要そうでした。
さらに音声変換の品質を向上させるには、ファイル数や学習回数を増やす必要はありそうです。
今回の使い方を参考にしつつ、試行錯誤しながらオリジナルのボイスチェンジャーを作成してみてください。
尚、出力された音声ファイルは
「Output」
(出力された音声 – 右下隅の3つのドット、クリックしてダウンロード)
のところでダウンロードできます。
その他にも、
「outputs」
* 推論の際の「Out folder:」(ボイスチェンジ後の音声ファイルの出力先を指定)の設定で、何も指定しなかった場合の例
フォルダ内に以下の
・「1-amitaro-originalvoice.wav」(ファイル例)
のようなファイル名で保存されますので、必要に応じてローカル環境(自分のパソコン)にダウンロードして使ってみてください。
また、新たに推論をさせるとファイルが追加されていきます。
動画チュートリアル作成時点では、だだっこぱんだ🍞(ddPn08)さん版のRVC WebUIでは、日本語に特化した事前学習モデルを始め、学習させるために色々なパラメータを指定できるようにしてくださっているので、ボイスチェンジの高みを目指している方にとっては、ありがたいですね。
また、RVC WebUIを、日本人の方向けに独自に調整したプログラムを公開してくださっている、だだっこぱんだ🍞(ddPn08)さんと、だだっこぱんだ🍞(ddPn08)さんの支援者の皆さんに感謝です。
【ddPn08 – RVC v1モデル対応版】
RVC WebUIの使い方:学習モデルの融合 – Merge
* 画像をクリックすると拡大表示されます
「Merge」(学習モデルの融合)では、RVC WebUIで作成したPyTorchの学習モデルであるpth形式ファイル同士を融合することができます。
「Merge」(学習モデルの融合)のタブをクリックし、以下のように設定します。
(一例です)
まずは、「♻️」ボタン
をクリックし、これまでに作成した学習モデルのファイルを反映させます。
【「Merge and save」(学習モデルの融合と保存)・「Merge and gen」(学習モデルの融合と音声変換)の共通設定】
Model A
(融合させる「学習モデルA」を設定)
amitaroA
* 一例
Model B
(融合させる「学習モデルB」を設定)
amitaroB
* 一例
Model C
(融合させる「学習モデルC」を設定)
未指定
* 一例
これまでに学習させた学習モデルを選択します。
マージ機能の挙動を検証した感じでは
✔︎「Using phone embedder:」(phone embedderの設定)は「contentvec」「hubert_base」「hubert-base-japanese」などの違うものでも融合できる
✔︎「Pitch extraction algorithm:」(ピッチ抽出アルゴリズム)は違うものでも融合できる
ということがわかりました。
ただ、
✔︎ サンプリングレートが「40k」「48k」を融合するとエラー
✔︎ 次元数が「256」「768」を融合するとエラー
(✔︎ f0モデルの設定が「yes」「no」を融合するとエラー)
になるようでした。
以下、エラー表示例です。
エラー表示例:サンプリングレート「40k」「48k」を融合
Loading /workspace/rvc-webui/models/checkpoints/amitaro40k.pth...
Loading /workspace/rvc-webui/models/checkpoints/amitaro48k.pth...
Traceback (most recent call last):
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/queueing.py", line 407, in call_prediction
output = await route_utils.call_process_api(
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/route_utils.py", line 226, in call_process_api
output = await app.get_blocks().process_api(
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/blocks.py", line 1550, in process_api
result = await self.call_function(
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/blocks.py", line 1185, in call_function
prediction = await anyio.to_thread.run_sync(
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/anyio/to_thread.py", line 56, in run_sync
return await get_async_backend().run_sync_in_worker_thread(
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 2441, in run_sync_in_worker_thread
return await future
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 943, in run
result = context.run(func, *args)
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/utils.py", line 661, in wrapper
response = f(*args, **kwargs)
File "/workspace/rvc-webui/modules/tabs/merge.py", line 83, in merge_and_gen
merged = merge_ckpt(
File "/workspace/rvc-webui/modules/tabs/merge.py", line 38, in merge_ckpt
return merge(
File "/workspace/rvc-webui/modules/merge.py", line 52, in merge
raise RuntimeError("Failed to merge models.")
RuntimeError: Failed to merge models.
(ランタイムエラー:学習モデルの融合に失敗しました)
エラー表示例:次元数「256次元」「768次元」を融合
Loading /workspace/rvc-webui/models/checkpoints/amitaro256.pth...
Loading /workspace/rvc-webui/models/checkpoints/amitaro768.pth...
0%| | 0/516 [00:00 ?, ?it/s]
Traceback (most recent call last):
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/routes.py", line 321, in run_predict
output = await app.blocks.process_api(
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/blocks.py", line 1006, in process_api
result = await self.call_function(fn_index, inputs, iterator, request)
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/blocks.py", line 847, in call_function
prediction = await anyio.to_thread.run_sync(
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/anyio/to_thread.py", line 33, in run_sync
return await get_asynclib().run_sync_in_worker_thread(
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 877, in run_sync_in_worker_thread
return await future
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 807, in run
result = context.run(func, *args)
File "/workspace/rvc-webui/modules/tabs/merge.py", line 56, in merge_and_save
merged = merge_ckpt(
File "/workspace/rvc-webui/modules/tabs/merge.py", line 38, in merge_ckpt
return merge(
File "/workspace/rvc-webui/modules/merge.py", line 70, in merge
merged["weight"][key] = merge_weight(weight_a[key], weight_b[key], None, a)
File "/workspace/rvc-webui/modules/merge.py", line 59, in merge_weight
return (1 - alpha) * a + alpha * b
RuntimeError: The size of tensor a (768) must match the size of tensor b (256) at non-singleton dimension 1
(ランタイムエラー:テンソルaのサイズ 768 は、非シングルトン次元1のテンソルbのサイズ 256 と一致しなければいけません)
そのため、「Merge」(学習モデルの融合)の機能を使う予定の方は
・事前に「Target sample rate」(サンプリングレート)・「Embedding channels」(次元数の設定)を学習モデル名に含めておく
と周波数や次元数の違いによるエラーを回避できるのではないかと思います。
Merge method:
(学習モデルを融合させる方法を選択)
Weight sum:A*(1-alpha)+B*alpha
(学習モデルの重みを合計:「学習モデルA」×(1 −「alpha値の設定値」)+「学習モデルB」×「alpha値の設定値」)
上記の設定の「Weight sum」(学習モデルの重みを合計)では、2つのモデルを合算することができます。
一方「Add difference:A+(B-C)*alpha」(学習モデルの重みの違いを合計)では
・「学習モデルA」+(「学習モデルB」−「学習モデルC」)×「alpha値の設定値」)
ということで、ベースとなる学習モデル(「学習モデルA」)を設定し、他の2つの学習モデル(「学習モデルB」−「学習モデルC」)の違いに特定の値(「alpha値の設定値」)を掛けたものを合算することができます。
「Add difference:A+(B-C)*alpha」(学習モデルの重みの違いを合計)を使う際の注意点としては
・一度「Model C」まで設定すると空欄にできない
ので、その後「Weight sum」(学習モデルの重みを合計)の機能を使いたい場合にはRVC WebUIのWebページを再読み込みするようにしてみてください。
Output name
(融合後の学習モデル名を設定)
amitaro-fusion
拡張子(「.pth」)なしの名前を指定します。
チュートリアルの設定の場合「amitaro-fuion.pth」という学習モデルが出力されます。
Each key merge
(各キー毎に融合する比率を指定)
チェックを入れない
初期設定は「チェックを入れない」になっています。
ここの設定で「チェックを入れる」と
・enc_p
(「enc_p.encoder.attn_layers.0〜5」「enc_p.encoder.norm_layers_1.0〜1.5」「enc_p.encoder.ffn_layers.0〜5」「enc_p.encoder.norm_layers_2.0〜2.5」「enc_p.emb_phone」「enc_p.emb_pitch」)
・dec
(「dec.noise_convs.0〜5」「dec.ups.0〜3」「dec.resblocks.0〜11」「dec.m_source.l_linear」「dec.conv_pre」「dec.conv_post」「dec.cond」)
・flow
(「flow.flows.0〜6」「emb_g.weight」)
のパラメータ毎に比率を変えることができるようでした。
「JSON」の項目では、
・各種パラメータの設定値の一覧
が表示されるようでした。
Base alpha
(alpha値の設定値を指定)
0.5
2つの「MERGE_METHODS」(学習モデルを融合させる方法を選択)
・Weight sum:A*(1-alpha)+B*alpha
(学習モデルの重みを合計:「学習モデルA」×(1 −「alpha値の設定値」)+「学習モデルB」×「alpha値の設定値」)
・Add difference:A+(B-C)*alpha
(学習モデルの重みの違いを合計:「学習モデルA」+(「学習モデルB」−「学習モデルC」)×「alpha値の設定値」)
の「alpha値の設定値」を指定します。
「0〜1」の範囲で「0.01」単位で指定できます。
設定が完了したら「Merge and save」(学習モデルを融合する)のボタンをクリックします。
処理が完了すると「models」フォルダの「checkpoints_link」フォルダ内に
・「amitaro-fusion.pth」
*「Model Name:」(出力される学習モデルの名前)で「amitaro」という名前に設定した場合の例
という学習モデルを融合後の学習モデルが出力されます。
【「Merge and gen」(学習モデルの融合と音声変換)の設定】
* 画像をクリックすると拡大表示されます
上述の「Merge and save」(学習モデルの融合と保存)に加えて、「Inference options」(推論オプション)で以下の設定をします。
Speaker ID
(識別IDを指定)
1
融合する学習モデルの識別IDを指定します。
チュートリアルでは「amitaroA.pth」の識別ID「1」を指定しています。
Source Audio:
(ボイスチェンジする音声ファイルの指定)
/workspace/rvc-webui/voice/originalvoice.wav
音声変換した音声ファイルへのパスを入力します。
「rvc-webui」フォルダ内の「voice」フォルダに入っている「originalvoice.wav」という音声ファイルを配置した場合の例です。
Transpose:
(変調)
12
ボイスチェンジ時に推奨されることとして、男性から女性への音声変換は「+ 12キー」、女性から男性への音声変換は、「– 12キー」にすることが推奨されているようです。
声の高さが同じ声質の場合には、設定を「0」にします。声のキーが高い女性の声にする場合には、12キーよりもさらに上げてもいいかもしれません。
チュートリアルの設定や音声では、あみたろさんの声に近づけるには、「12」よりも、さらにキーを高くした方がよさそうでした。
Pitch extraction algorithm:
(ピッチ抽出アルゴリズム)
harvest
RVC v1モデル対応のだだっこぱんださん版RVC WebUIでは、「pm」と「harvest」を選択できます。
「pm」は、 処理が高速ですは音声の品質は低いようです。
「harvest」は、品質は向上しますが処理が遅いようです。また、低音の音声変換の場合に推奨のようです。
Embedder Model:
(Embedderモデル)
auto
学習の際に「Using phone embedder:」(phone embedderの設定)で設定したモデルを選択します。
「auto」にすると、自動的に「contentvec」か?「hubert_base」か?「hubert-base-japanese」か?を判別してくれますので便利です。
Auto Load Index:
(自動的にindex形式ファイルを取得)
チェックあり
学習の際に出力された「index形式ファイル」のパスを自動的に取得してくれる便利な機能です。
Faiss Index File Path:
(Faissインデックスファイルのパスなどを設定)
未記入
(一例です)
* Faiss(Facebook AI Similarity Search):Facebookが開発した近似最近傍検索ライブラリ
チュートリアルでは「Auto Load Index:」(自動的にindex形式ファイルを取得)の機能を使うので、ここの欄は未記入(空欄)にします。
「Auto Load Index:」(自動的にindex形式ファイルを取得)の機能を使わない場合には、手動でパスを入力する必要があります。
一例として、学習の際に「Model Name:」(出力される学習モデルの名前)を「amitaro」にした場合、手動で入力したい方は
/workspace/rvc-webui/models/checkpoints_link/amitaro_index/amitaro.0.index
*「rvc-webui」のフォルダの「models」フォルダの「checkpoints_link」フォルダの「amitaro_index」フォルダ内の「〜.index」のファイルのパスをコピー後に入力欄に貼り付けてください
と入力します。
Big NPY File Path:
(Big NPYファイルのパスを設定)
未記入
(一例です)
チュートリアルでは「Auto Load Index:」(自動的にindex形式ファイルなどを取得)の機能を使うので、ここの欄は未記入(空欄)にします。
「Auto Load Index:」(自動的にindex形式ファイルなどを取得)の機能を使わない場合には、手動でパスを入力する必要があります。
一例として、学習の際に「Model Name:」(出力される学習モデルの名前)を「amitaro」にした場合、手動で入力したい方は
/workspace/rvc-webui/models/checkpoints_link/amitaro_index/amitaro.0.big.npy
*「rvc-webui」のフォルダの「models」フォルダの「checkpoints_link」フォルダの「amitaro_index」フォルダ内の「〜.npy」のファイルのパスをコピー後に入力欄に貼り付けてください
と入力します。
Retrieval Feature Ratio:
(検索特徴率)
0.5
アクセントの強さをコントロールします。高すぎる(「1に近づける」)とアーチファクトが発生する場合もあるようです。
数値を変えて音声がどうなるか?色々と試してみてください。
設定が完了したら「Merge and gen」(学習モデルの融合と音声変換を実行する)のボタンをクリックします。
処理が完了すると音声が再生できるようになります。
また、「outputs」フォルダ内に
・「2-merge-originalvoice.wav」(ファイル例)
などの名前で音声ファイルが出力されます。
【ddPn08版RVC v1モデル】RunPod編:RVC WebUIの設定の解説動画へのコメントと対応例など
視聴者の方から動画へのコメントをいただけるようでしたら、回答などを、ここにまとめていく予定です。
by 子供プログラマー
:【RunPod編】RVC WebUIをはじめよう – AIボイスチェンジャー(一覧)