【ddPn08 – RVC v2モデル対応版】RVC WebUIの設定解説
【更新状況】
2024年12月24日(火)
記事ページを公開しました。
これから、だだっこぱんださん版のRVC WebUIを始めてみたい方向けのチュートリアルです。
【対応ノートブック】
ダウンロード:RVC v2モデル – ddPn08版RVC WebUIチュートリアル用のノートブック
このチュートリアルは、RunPodでRVC WebUI起動後のRVC WebUIの各種設定に焦点を当てています。
RunPodの仕組みや使い方がわからない方は、以下の移行ガイドのチュートリアル
:【ddPn08 – RVC v2モデル対応版】移行ガイド:RunPodでRVC WebUIを使う方法(要点解説)
を事前に把握していただくと、RunPodでRVC WebUIを使う方法の理解が深まるのではないかと思います。
【動画で解説】RunPod編:RVC v2モデル – ddPn08版RVC WebUIの使い方(設定詳解)
動画でも解説予定です。
文字情報だけでは理解しにくい場合などにご活用ください。
一度動画を視聴いただき、手順の全体像のイメージを作ってから、記事を活用いただくと理解しやすいかもしれません。
【ddPn08 – RVC v2モデル対応版】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」の音量を無音として検出しています。
【参考】
・10 dB → かすかな呼吸(ほとんど音が聞こえない環境)
・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 v2モデル対応版】RVC WebUIの使い方:学習
(データセットで学習モデル作成)- Training
* 画像をクリックすると拡大表示されます
「Training」(学習)のタブをクリックし、以下のように設定します。
(一例です)
Model Name:
(出力される学習モデルの名前)
amitaro
チュートリアルでは分かりやすいように「amitaro」という名前にしています。
RunPodでは「Volume Disk」(ボリュームディスク領域:ポッド契約中の永続保存領域)にファイルが保存され続けます。RunPodの仕様を考慮すると「amitaro48kv2id0」などと後述する設定内容を忘れないようにしておくと、「Speaker ID:」(識別IDの設定)にまつわる音質の低下を予防できるのではないかと思います。
また、学習モデル同士を融合させる場合に、違う「Target sample rate」(サンプリングレート)ではエラーとなるようでしたので、作成した学習モデルを融合させる予定の方は、周波数も名前に記載しておくといいかもしれません。
その他にも、「Training」(学習)の設定で「Train Index:」(indexファイル・npyファイルを作成するかを設定)を有効化した際には、「modele」フォルダ内の「checkpoints_link」フォルダの中に出力される該当フォルダ(チュートリアルでは「amitato_index」フォルダ)内に
・「学習モデル名.識別ID.index」
・「学習モデル名.識別ID.big.npy」
という形で「識別ID」付きのindexファイルやnpyファイルが出力されるようでしたので、識別IDを忘れた際などに参考にしてみてください。
Ignore cache:
(キャッシュを無視するか)
チェックなし
ここのチェックをなしの状態にするとキャッシュの使用が有効化されます。
Dataset glob:
(学習させるデータセットフォルダのパスを指定)
/workspace/rvc-webui/datasets/dataset
*「rvc-webui」フォルダ内にある「datasets」フォルダの中に「dataset」というデータセットフォルダを配置した場合の例
学習させたい音声ファイルの入ったフォルダのパスを指定します。
データセットの規模に関する参考情報として、「RTX A4000」(GPU 16GB)で1〜3秒の音声ファイル200個(25MB:16ビット・モノラル・44.1kHz)を使って100回学習(48k・チャンネル768次元・出力12次元・hubert-base-japanese・crepe・Batch size:20)させてみると16GBのGPUメモリでも学習が可能でした。
一方、1〜3秒の音声ファイル200個(25MB:16ビット・モノラル・44.1kHz)を使って100回学習(48k・チャンネル768次元・出力12次元・contentvec・crepe・Batch size:20)しようとしたところ、16GBのGPUメモリでは、メモリオーバー(GPUメモリの容量超え)となり学習ができませんでした。
「Using phone embedder:」(phone embedderの設定)の設定で「hubert-base-japanese」「contentvec」のどちらを選ぶかによって、データセットの規模によるメモリオーバーとなる可能性があるようでしたので注意してみてください。
試した感じでは、「contentvec」の場合には、1〜3秒の音声ファイル100個(12.2MB:16ビット・モノラル・44.1kHz)にすれば、「RTX A4000」(GPU 16GB)でも100回学習(48k・チャンネル768次元・出力12次元・contentvec・crepe・Batch size:20)できるようでした。
また、「RTX 3090」(GPU 24GB) で1〜3秒の音声ファイル200個(25MB:16ビット・モノラル・44.1kHz)を使って100回学習(48k・チャンネル768次元・出力12次元・contentvec・crepe・Batch size:20)させてみると24GBのGPUメモリで学習が可能でした。
Recursive:
(ファイル読み込みの設定)
チェックを入れる
「Dataset glob:」(学習させるデータセットフォルダのパスを指定)で指定したデータセットのフォルダ内の音声を全て使う場合には、ここの設定でチェックを入れます。
注意点として、ここのチェックを外した状態で、「Dataset glob:/workspace/rvc-webui/datasets/dataset」の設定にすると「Exception: No audio files found」というエラーになります。
対応方法例としては、「Dataset glob:」(学習させるデータセットフォルダのパスを指定)の設定を「/workspace/rvc-webui/datasets/dataset/*.wav」にすると、うまくファイルを読み込めるようでした。
特定の音声ファイルを使いたい場合などに、ここのチェックを外した状態で、特定の音声ファイル群を指定するといいのかもしれません。
Multiple speakers:
(複数の話者かどうか)
チェックなし
ここにチェックを入れると「複数話者に対応した学習」もできるようですが、今回は、単一の話者の音声を利用するため、ここのチェックを外しておきます。
ここの機能を有効化した場合には、以下のフォルダ構造
【フォルダ構造】
dataset
|
|—voiceA
| |— 〜1.wav
| |— 〜2.wav
| ・
| ・
| ・
| |— 〜10.wav
|
|
|—voiceB
|— 〜1.wav
|— 〜2.wav
・
・
・
|— 〜10.wav
のデータセットを「Dataset glob:」(学習させるデータセットフォルダのパスを指定)の設定の際に指定する必要がありますので注意してください。
「Multiple speakers:」(複数の話者かどうか)を有効化した際に、普通のデータセット(1つのフォルダ内に音声ファイルだけ入っている)を「Dataset glob:」(学習させるデータセットフォルダのパスを指定)の設定で指定すると以下のようなファイルの読み込み関連のエラー
エラー出力例:(フォルダの参照エラー)
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 1199, in call_function
prediction = await utils.async_iteration(iterator)
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/utils.py", line 519, in async_iteration
return await iterator.__anext__()
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/utils.py", line 512, in __anext__
return 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 495, in run_sync_iterator_async
return next(iterator)
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/utils.py", line 649, in gen_wrapper
yield from f(*args, **kwargs)
File "/workspace/rvc-webui/modules/tabs/training.py", line 181, in train_all
datasets = glob_dataset(
File "/workspace/rvc-webui/lib/rvc/train.py", line 81, in glob_dataset
for audio in tqdm.tqdm(os.listdir(speaker_path)):
File "/workspace/rvc-webui/webui.py", line 10, in listdir4mac
return [file for file in _list_dir(path) if not file.startswith(".")]
NotADirectoryError: [Errno 20] Not a directory: '/workspace/rvc-webui/datasets/dataset/〜.wav'
(ディレクトリエラー:「〜.wav」というディレクトリ(フォルダ)はありません。)
となるようでした。
Speaker ID:
(識別IDの設定)
0
推論の際に識別できるように、識別IDを指定しておきます。
識別IDの番号は「Inference」(推論)の際の音質に影響しますので、「Model Name:」(出力される学習モデルの名前)の設定で「amitaro48kv2id0」などと識別ID番号を入れておくといいかもしれません。
識別IDは、RunPodで使う際の利便性を考慮し「0〜1000」の範囲で指定できるようにコードを改変しておきました。
「Training」(学習)の設定で「Train Index:」(indexファイル・npyファイルを作成するかを設定)を有効化した際には、「modele」フォルダ内の「checkpoints_link」フォルダの中に出力される該当フォルダ(チュートリアルでは「amitato_index」フォルダ)内に
・「学習モデル名.識別ID.index」
・「学習モデル名.識別ID.big.npy」
という形で「識別ID」付きのindexファイルやnpyファイルが出力されていますので、必要に応じて参考にしてみてください。
Model version:
(RVC公式の事前学習済みモデルのバージョンを指定)
v2
元のプログラムでは「v1」も選択できる仕様でしたが、自動的に事前学習モデルが反映されないように改変されていたため、混乱を避けるために「v1」が表示されないようにしておきました。
Target sample rate:
(サンプリングレート)
48k
初期設定は「40k」のみ使える仕様になっています。
「48k」を使うためにはノートブック上にある
・【手順4:「48k」の「hubert-base-japanese」用のファイルをダウンロード】
* 拡張オプション②(省略可)
・【手順5:「48k」の「contentvec」用のファイルをダウンロード】
* 拡張オプション③(省略可)
などの拡張オプションをダウンロード(該当コードを実行)する必要があります。
「hubert-base-japanese」または「contentvec」の「48k」用の事前学習モデルをダウンロードされていない方は、ここの設定は「40k」を選択するようにしてください。
f0 Model:
(f0モデルの設定)
yes
「f0」とは、ピッチ情報・基本周波数のことをさしているようです。
おそらくですが、ここの設定を「yes」にすると、「ピッチありのモデル」になり。「no」に設定すると、「ピッチレスモデル」になるのではないかと思われます。
音質の精度を求めている方や、リアルタイムボイスチェンジを予定されている方、そして、楽曲から抽出したボーカルの音声の変換を予定されている方などは、「ピッチありのモデル」にするために、ここの設定を「yes」にするようにします。
リアルタイムボイスチェンジ時の難点としては、「ピッチありのモデル」の場合には、精度が良い代わりに、パソコンに負荷をかけるようです。そのため、精度よりも遅延の影響を気にされる方は、ここの設定を「no」にして、「ピッチレスモデル」にするという選択肢もあるようです。
しかし、だだっこさん版のRVC v2モデル対応RVC WebUIでは、設定が自動反映されない仕様になった点と、拡張機能や48kの拡張オプション(ピッチありモデルでないとエラーとなる)の兼ね合いも考慮すると、「ピッチありのモデル」だけを選択できるようにした方が、設定にまつわるエラー回避ができるのではないかと思いましたので、「ピッチありのモデル」のみの選択となるようにプログラムを改変しておきました。
Using phone embedder:
(phone embedderの設定)
hubert-base-japanese
事前学習モデルを選択します。
「hubert-base-japanese」(フーベルト・ベイス・ジャパニーズ/ヒューバート・ベイス・ジャパニーズ)という、日本語の音声に特化したHuBERTモデルと、「contentvec」(コンテント・ベック/コンテンツ・ベック)というモデルを選択できます。
* 注:hubert-base-japanese
約16000時間のReazonSpeech(日本語のデータセット)で学習した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」の「40k」版は、音質が不安定な印象を受けており、うまく音声変換できない経験をしていましたが、「48k」版では音質が改善されているようでしたので、チュートリアルでは「hubert-base-japanese」を選択しています。
「hubert-base-japanese」を使いたい場合には、「48k」版を使うのが無難かと思います。
「hubert-base-japanese」の「48k」版は、単一話者による学習のためか、話者の影響が残る傾向があるようです。対策としては、推論(音声変換)の際に「npyファイル」と「indexファイル」を指定すると良いようです。
また、日本語の発音が明瞭になりますが、音声変換が少し不安定になりやすい傾向があるようです。そして、声質を似せるには「Retrieval Feature Ratio:」(検索特徴率)を「0.8〜1.0」にすると良いようです。
「contentvec」の「48k」版は、声質に似せることが可能ですが、日本語の発音が少し苦手なようです。
Embedding channels:
(次元数の設定)
768
元のプログラムでは「256」(256次元)も選択できる仕様でしたが、自動的に事前学習モデルが反映されないように改変されていたため、混乱を避けるために「256」が表示されないようにしておきました。
精度を求める場合には、「256次元」よりも「768次元」の方が良いようです。
Embedding output layer:
(出力層の設定)
12
初期設定では「12」になっています。
「Target sample rate:」(サンプリングレート)を「48k」にした場合には、利用する事前学習モデルの兼ね合いで「12次元」が推奨設定になっています。
試した範囲では、「48k」の場合にも、「9次元」の設定で学習することはできました。
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つ以上利用している場合)
gin_channels: 256 self.spk_embed_dim: 109 emb_channels: 768
gin_channels: 256 self.spk_embed_dim: 109 emb_channels: 768
〜
-- Process 0 terminated with the following error:
Traceback (most recent call last):
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/torch/multiprocessing/spawn.py", line 69, in _wrap
fn(i, *args)
File "/workspace/rvc-webui/lib/rvc/train.py", line 597, in training_runner
net_g.module.load_state_dict(net_g_state)
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1614, in __getattr__
raise AttributeError("'{}' object has no attribute '{}'".format(
AttributeError: 'SynthesizerTrnMs256NSFSid' object has no attribute 'module'. Did you mean: 'modules'?
(属性エラー:'SynthesizerTrnMs256NSFSid' オブジェクトには 'module' という属性がありません。'modules'のことを意味していますか?)
になり、学習の処理が完了しないようでした。
そのため、
・GPUメモリは1つだけにする
ように注意してください。
Number of CPU processes:
(CPUプロセス数)
64
初期設定は「64」です。
RunPod上で試した範囲では、数を増やしても減らしてもどちらでも大差はないかと思われました。
Normalize audio volume when preprocess:
(前処理として音声のボリュームを正規化するかどうか)
yes
処理の過程で、音量を調整する機能のようです。
初期設定では「yes」になっています。
Pitch extraction algorithm:
(ピッチ抽出アルゴリズム)
crepe
RVC v2モデル対応のだだっこぱんださん版RVC WebUIでは、「dio」「harvest」「crepe」「mangio-crepe」を選択できます。
高品質の音声を処理するには、「dio」を選択します。さらに品質向上で処理をしたい場合には、処理が遅くなりますが、「harvest」を選択します。品質を最高にしたい場合にはGPUに負荷がかかりますが「crepe」または「mangio-crepe」を選択します。
尚、
・crepe(クレープ)
*オリジナル版のcrepe
・mangio-crepe(マンジョクレープ:イタリア語でクレープを食べる)
*Mangio621/Mangio-RVC-Fork – GitHub によるcrepe
についてさらに知りたい場合には、上記リンク先の「Mangio621」さんによる「RVC WebUI」のページが参考になるのではないかと思います。
Webブラウザの拡張機能などの翻訳機能を使えば、大体の意味はわかるのではないかと思います。
結論としては、
・どっちも試してみて!
です。
Batch size:
(バッチサイズ)
3
学習するデータセットをどの程度の1回あたりの処理量にするかを指定します。
GPUメモリが多い場合には、ここの数値を大きくすると、過学習が予防できるようです。
注意点としては、膨大な量のデータセットで学習させる際などに、あまり大きな数値にすると、メモリが足りなくなりエラーとなるリスクも考えられますので、RunPodの管理画面のGPUメモリ使用率の状況を見つつ、途中でエラーとなる方などはここの数値を試行錯誤してみてください。
参考情報として、「RTX A4000」(GPU 16GB)で1〜3秒の音声ファイル200個(25MB:16ビット・モノラル・44.1kHz)を使って100回学習(48k・チャンネル768次元・出力12次元・hubert-base-japanese・crepe)させた際に、ここの値を「20」にすると
Extracting f0… (ピッチ抽出の処理)
:GPU Utilization 0%
:GPU Memory Used 6%
Training model…(学習)
:GPU Utilization はじめ0%。24回以降から85%〜99%推移
:GPU Memory Used はじめ7%。24回以降から68%
の結果でした。
何回か試した範囲では「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.98 GiB already allocated; 9.44 MiB free; 15.46 GiB reserved in total by PyTorch)
(28.00MiBを割り当てようとしました。GPU 0; 総容量15.72GiB; 既に12.98GiBが割り当てられている; 9.44MiBが解放されている; PyTorchによって合計15.46GiBが予約されています。)
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」のドキュメントを参照してください。)
が出力され、学習が完了しませんでした。
RVC WebUI上の学習の「Status」(状況)の表示で「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の設定)
を何にするかでも大きく品質が変わってくるのではないかと感じています。
「Target sample rate:」(サンプリングレート)を「40k」を選択した場合には「contentvec」の利用が無難かもしれません。
「48k」を選択した場合には、「contentvec」と「hubert-base-japanese」を比較してみるといいかもしれません。
【再学習に関して】
再学習させる場合にはチェックポイントファイル(「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」ファイルを残しておくだけで大丈夫ですので、必要に応じて不要なチェックポイントファイルを削除してください。
save_wav_with_checkpoint:
(チェックポイント毎にaugmentの音声を保存する)
チェックなし
ここにチェックを入れると、(おそらくですが…)学習途中段階の学習モデルを使ったと思われる声の音声ファイルが
・「state」フォルダ内
*「rvc-webui」フォルダの「models」フォルダの「training」フォルダの「models」フォルダの「該当学習モデル」内
に、
・「wav_sample_(Save_every_epochで指定した数値毎の値)」フォルダ
に
・00_y_pred.wav
・00_y_true.wav
・01_y_pred.wav
・01_y_true.wav
などの音声ファイルとして出力されるようです。
初期設定では「チェックなし」になっています。
Cache batch:
(キャッシュバッチ)
チェックあり
チェックを入れると、高速化されるようです。
初期設定では「チェックあり」になっています。
FP16:
(エフピー16)
チェックあり
「16ビットの浮動小数点数フォーマット」でデータ量を削減するかどうかを設定できるようです。
そのため、チェックを入れると軽量化と、高速化されるようです。ただ、データ量を削減するので品質は低下するようです。
初期設定では「チェックあり」になっています。
Save only the latest G and D files:
(最新のGファイルとDファイルのみを保存)
チェックなし
最後に出力されるチェックポイントファイル(「D_〜.pth「G_〜.pth」)のみを保存するかどうかを設定できます。
ここの機能を使いたい場合には、ここの設定で「チェックあり」にした状態で「Save every epoch:」(学習の状況の保存頻度)の設定を「1以上」の数値を指定しておく必要があります。「Save every epoch:」(学習の状況の保存頻度)の設定を「0」にするとチェックポイントファイルは保存されないので注意してください。
初期設定では「チェックなし」になっています。
チュートリアルで動作を確認後、本格的に学習を始める際には、ここの機能を有効化しておくとディスク容量を節約できるのではないかと思います。
Augment:
(データオーグメンテーション機能の有効化の設定)
チェックあり
2023年6月から追加された新機能です。
従来のだだっこぱんださん版のRVC WebUIでは「Using phone embedder:」(phone embedderの設定)の設定で「hubert-base-japanese」を指定した場合、話者の音声の特徴が残りやすいようですが、データオーグメンテーション機能を使うことで、軽減するようです。
ここの機能を使うには、ノートブック上にある
・【手順3:「data augmentation」(データ拡張)用ファイルのダウンロード】
* 拡張オプション①(省略可)
でコードを実行して必要ファイルをダウンロードする必要があります。
【使い方】
「Training」(学習)の際のデータオーグメンテーション機能の設定で
・Augment:(データオーグメンテーション機能の有効化の設定)
チェックを入れる
・Augment From Pretrain(pth):(追加の事前学習済みモデルによるデータオーグメンテーション機能の有効化の設定)
チェックを入れる
・Pre trained generator path:(追加の事前学習生成器のパス)
初期設定で以下のパスに設定済み
/workspace/rvc-webui/models/pretrained/augment/vctk_multispeaker_jphubert_augment_f048k768.pth
・speaker info path (npy): (追加の事前学習済みモデルの「npyファイル」のパス)
初期設定で以下のパスに設定済み
/workspace/rvc-webui/models/pretrained/augment/speaker_info.npy
と設定すると使えるようになります。
試した感じでは
・Target sampling rate:(サンプリングレート)
「40k」「48k」どちらでも使えます
・Using phone embedder:(phone embedderの設定)
「hubert-base-japanese」「contentvec」どちらでも使えますが、「contentvec」にすると推論(音声変換)が不安定になるようでした
などと、各種設定に対応しているようでした。
Augment From Pretrain:
(追加の事前学習済みモデルによるデータオーグメンテーション機能の有効化の設定)
チェックあり
2023年6月から追加された新機能です。
ここの機能を有効化するには「Augment:」(データオーグメンテーション機能の有効化の設定)の項目に「チェックを入れる」必要があります。
ここの機能を有効化すると
・Pre trained generator path:(追加の事前学習生成器のパス)
初期設定で以下のパスに設定済み
/workspace/rvc-webui/models/pretrained/augment/vctk_multispeaker_jphubert_augment_f048k768.pth
・speaker info path (npy): (追加の事前学習済みモデルの「npyファイル」のパス)
初期設定で以下のパスに設定済み
/workspace/rvc-webui/models/pretrained/augment/speaker_info.npy
に初期設定されている
・【手順3:「data augmentation」(データ拡張)用ファイルのダウンロード】
* 拡張オプション①(省略可)
のコードを実行した際にダウンロードしたファイルを使うことができるようになります。
Pre trained generator path (pth):
(追加の事前学習済みモデル「pthファイル」のパスを指定)
/workspace/rvc-webui/models/pretrained/augment/vctk_multispeaker_jphubert_augment_f048k768.pth
2023年6月から追加された新機能です。
ここの機能を有効化するには「Augment:」(データオーグメンテーション機能の有効化の設定)と「Augment From Pretrain:(追加の事前学習済みモデルによるデータオーグメンテーション機能の有効化の設定)の項目の両方に「チェックを入れる」必要があります。
追加の事前学習済みモデルを使いやすいように、初期設定でファイルへのパスを入力しておきました。
speaker info path (npy):
(追加の事前学習済みモデルの「npyファイル」のパスを指定)
/workspace/rvc-webui/models/pretrained/augment/speaker_info.npy
2023年6月から追加された新機能です。
ここの機能を有効化するには「Augment:」(データオーグメンテーション機能の有効化の設定)と「Augment From Pretrain:(追加の事前学習済みモデルによるデータオーグメンテーション機能の有効化の設定)の項目の両方に「チェックを入れる」必要があります。
追加の事前学習済みモデルを使いやすいように、初期設定でファイルへのパスを入力しておきました。
Pre trained generator path:
(事前学習生成器のパス)
/workspace/rvc-webui/models/pretrained/48kjphubert/f0G48k768_jphubert_v2.pth
チュートリアルでは「hubert-base-japanese」の「48k」版を使ってみます。
だだっこぱんださん版のRVC v2モデル対応のRVC WebUIでは、ここの設定は手動で設定する必要があります。
初期設定では、「RVC v2モデル」の「40kHz」の事前学習モデル
・Pre trained generator path:(事前学習生成器のパス)
/workspace/rvc-webui/models/pretrained/v2/f0G40k.pth
・Pre trained discriminator path:(事前学習弁別器・識別器のパス)
/workspace/rvc-webui/models/pretrained/v2/f0D40k.pth
が設定されています。
Pre trained discriminator path:
(事前学習弁別器・識別器のパス)
/workspace/rvc-webui/models/pretrained/48kjphubert/f0D48k768_jphubert_v2.pth
チュートリアルでは「hubert-base-japanese」の「48k」版を使ってみます。
だだっこぱんださん版のRVC v2モデル対応のRVC WebUIでは、ここの設定は手動で設定する必要があります。
初期設定では、「RVC v2モデル」の「40kHz」の事前学習モデル
・Pre trained discriminator path:(事前学習弁別器・識別器のパス)
/workspace/rvc-webui/models/pretrained/48kjphubert/f0D48k768_jphubert_v2.pth
が設定されています。
Train Index:
(indexファイル・npyファイルを作成するかを設定)
チェックを入れる
チェックを入れると「models」フォルダの「checkpoints」内に学習モデル名のフォルダ「amitaro_index」が作成され「〜.index」ファイルと「〜.npy」ファイルが出力されます。
*「Model Name:」(出力される学習モデルの名前)の設定を「amitaro」にした場合の例
* ここの項目で、「チェックなし」にすると「〜.index」ファイルと「〜.npy」ファイルが出力されません。
Reduce index size with kmeans
(k-means法によりindexファイルのサイズを小さくする機能)
チェックなし
2023年6月から追加された新機能「k-means法によるindexファイルの圧縮機能」です。
音声変換の品質にあまり影響を与えずに数百MB程度のindexファイルが生成される場合に、数十MB程度までファイルを小さくする機能のようです。
indexファイルを圧縮することで、リアルタイムボイスチェンジの際の遅延を軽減させる効果を狙っているようです。
近似近傍探索による特徴量を検索するためのindexファイルが軽量化されることで、軽量化前のindexファイルに比べると表現の幅は減少しますが、検索速度が速くなるようです。
「Train Index:」(indexファイル・npyファイルを作成するかを設定)を有効化しておかないと意味のない機能かと思いますが、確認時点では、「Train Index:」を無効化した状態で、ここの設定を有効化しておいてもエラーにならないようでした。
maximum index size:
(indexファイルの大きさの最大値の設定)
10000
2023年6月から追加された新機能「k-means法によるindexファイルの圧縮機能」の詳細設定をする項目です。
初期設定値「10000」です。
ここの設定は
【ここの機能を有効化する設定】
・Train Index:
(indexファイル・npyファイルを作成するかを設定)
チェックを入れる
・Reduce index size with kmeans
(k-means法によりindexファイルのサイズを小さくする機能)
チェックを入れる
状態にした場合に反映されるようでした。
試しに「0」に設定して学習させたところ、学習モデル(pthファイル)は作成されましたが、以下のエラー表示となりました。
エラー出力例:
InvalidParameterError(
sklearn.utils._param_validation.InvalidParameterError: The 'n_clusters' parameter of MiniBatchKMeans must be an int in the range [1, inf). Got 0 instead.
(無効なパラメータエラー:sklearn.utils._param_validation.InvalidParameterError: MiniBatchKMeans の 'n_clusters' パラメータは [1, inf]の範囲の int でなければなりません。代わりに0が返されました。)
その他にも
maximum index size:
(indexファイルの大きさの最大値の設定)
10
などと、ファイルの大きさの設定が小さすぎると、最後まで学習は進み学習モデルは保存でいますが、指定サイズが小さすぎてindexファイルが出力されないエラーが出るようでした。
エラー出力例:
Saving model and optimizer state at epoch 30 to /workspace/rvc-webui/models/training/models/test-12/state/D_30.pth
save: emb_name: contentvec 768
Training is done. The program is closed.
save: emb_name: contentvec 768
100%|█| 150/150 [01:06 00:00, 2.26it/s, epoch=30, loss_d=4, loss_g=29.8, lr=9.9
Time: 70.41552826482803
0%| | 0/1 [00:00 ?, ?it/s]
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 1199, in call_function
prediction = await utils.async_iteration(iterator)
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/utils.py", line 519, in async_iteration
return await iterator.__anext__()
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/utils.py", line 512, in __anext__
return 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 495, in run_sync_iterator_async
return next(iterator)
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/utils.py", line 649, in gen_wrapper
yield from f(*args, **kwargs)
File "/workspace/rvc-webui/modules/tabs/training.py", line 276, in train_all
train_index(
File "/workspace/rvc-webui/lib/rvc/train.py", line 292, in train_index
index.train(big_npy)
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/faiss/class_wrappers.py", line 298, in replacement_train
self.train_c(n, swig_ptr(x))
File "/workspace/rvc-webui/venv/lib/python3.10/site-packages/faiss/swigfaiss_avx2.py", line 5188, in train
return _swigfaiss_avx2.IndexIVF_train(self, n, x)
RuntimeError: Error in void faiss::Clustering::train_encoded(faiss::Clustering::idx_t, const uint8_t*, const faiss::Index*, faiss::Index&, const float*) at /project/faiss/faiss/Clustering.cpp:277: Error: 'nx >= k' failed: Number of training points (10) should be at least as large as number of clusters (25)
(ランタイムエラー:voidでのエラー /project/faiss/faiss/Clustering.cpp:277
faiss::Clustering::train_encoded(faiss::Clustering::idx_t, const uint8_t*, const faiss::Index*, faiss::Index&, const float*))
リアルタイムボイスチェンジを予定されていない方は、初期設定が無難かもしれません。
チュートリアルの設定で試した範囲では
・「62」が最低ラインの設定
indexファイル:373.1KB
npyファイル:186.1KB
・「1200」以上で通常のファイル容量が出力
indexファイル:3600KB(3.6MB)
npyファイル:4400KB(4.4MB)
のようでした。
何回か試して、ここの設定の単位は何なのか?と検証してみたところ、「training points」(学習のポイント)というのが関係ありそうかと思われましたが、最終的には(自分の現状の知識では…)不明という結論に達しました…
設定ができたら
・Train
(学習開始)
のボタンをクリックします。
しばらくすると以下のような表示になります。
RCV WebUI上の出力結果
*「Status」の出力
Training completed(学習完了)
RunPod-v2-RVC-WebUI-ddPn08-Historical-Legacy-for-Japanese-AI-beginners.ipynb上の出力結果
*【手順7:RVC WebUIの起動】の出力
Saving model and optimizer state at epoch 5 to /workspace/rvc-webui/models/training/models/amitaro/state/D_5.pth
save: emb_name: hubert-base-japanese 768
100%|█| 50/50 [00:33 00:00, 2.80it/s, epoch=10, loss_d=2.12, loss_g=59.7, lr=9.Saving model and optimizer state at epoch 10 to /workspace/rvc-webui/models/training/models/amitaro/state/G_10.pth
Saving model and optimizer state at epoch 10 to /workspace/rvc-webui/models/training/models/amitaro/state/D_10.pth
save: emb_name: hubert-base-japanese 768
Training is done. The program is closed.
(学習が実行されました。プログラムを終了します。)
save: emb_name: hubert-base-japanese 768
100%|█| 50/50 [00:39 00:00, 1.27it/s, epoch=10, loss_d=2.12, loss_g=59.7, lr=9.
Time: 57.79315211251378
0%| | 0/1 [00:00 ?, ?it/s]WARNING clustering 1221 points to 279 centroids: please provide at least 10881 training points
100%|█████████████████████████████████████████████| 1/1 [00:00<00:00, 1.29it/s]
gin_channels: 256 self.spk_embed_dim: 109 emb_channels: 768
/workspace/rvc-webui/venv/lib/python3.10/site-packages/gradio/components/dropdown.py:176: UserWarning: Using the update method is deprecated. Simply return a new object instead, e.g. `return gr.Dropdown(...)` instead of `return gr.Dropdown.update(...)`.
warnings.warn(
* 注:「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 v2モデル対応版】
RVC WebUIの使い方:推論(音声変換)- Inference
* 画像をクリックすると拡大表示されます
「Inference」(推論)のタブをクリックし、以下のように設定します。
(一例です)
上記のボタンをクリック後に
Model:
(学習モデル)
amitaro.pth
*学習の際に「Model Name:」(出力される学習モデルの名前)を「amitaro」にした場合の例
が設定できるようになります。
Speaker ID:
(識別IDの設定)
0
学習の際の「Speaker ID:」(識別IDの設定)に合わせます。
識別IDを変えると音質が変わるようでした。
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キーよりもさらに上げてもいいかもしれません。
Pitch extraction algorithm:
(ピッチ抽出アルゴリズム)
crepe
高品質の音声を処理するには、やや速度が遅くなりますが、「dio」を選択します。さらに品質向上で処理をしたい場合には、処理が遅くなりますが、「harvest」(低音の音声変換の場合に推奨)を選択します。品質を最高にしたい場合にはGPUに負荷がかかりますが「crepe」または「mangio-crepe」を選択します。
尚、
・crepe(クレープ)
*オリジナル版のcrepe
・mangio-crepe(マンジョクレープ:イタリア語でクレープを食べる)
のどちらにしたらいいのか?についてですが、結論としては、
・どっちも試してみて!
のようです。
Embedder Model:
(Embedderモデル)
auto
学習の際に「Using phone embedder:」(phone embedderの設定)で設定したモデルを選択します。
「auto」にすると、自動的に「hubert-base-japanese」か?「contentvec」か?を判別してくれますので便利です。
Embedder Output Layer:
(Embedderの出力層)
auto
学習の際に「Embedding output layer:」(出力層の設定)で設定した層の数を選択します。
「auto」にすると、自動的に「9」か?「12」か?を判別してくれますので便利です。
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」のファイルのパスをコピー後に入力欄に貼り付けてください
と入力します。
Retrieval Feature Ratio:
(検索特徴率)
0.2
アクセントの強さをコントロールします。高すぎる(「1に近づける」)とアーチファクトが発生する場合もあるようです。
数値を変えて音声がどうなるか?色々と試してみてください。
検索特徴率を「1」に近づけるほど、今回学習させた「学習モデル」の特徴(音色の品質)に偏らせるようです。
「hubert-base-japanese」の「48k」版は、日本語の発音が明瞭になりますが、音声変換が少し不安定になりやすい傾向があるようです。「hubert-base-japanese」で声質を似せるには「Retrieval Feature Ratio:」(検索特徴率)を「0.8〜1.0」にすると良いようです。
ただ、チュートリアルの設定(データセットの音声ファイル10個・学習10回)で試した範囲では、「Retrieval Feature Ratio:」(検索特徴率)を「0.8〜1.0」に設定すると、ややノイズが入る印象を受けました。「0.1〜0.2」あたりにするとノイズが軽減されるようでした。
1〜3秒の音声ファイル200個(25MB:16ビット・モノラル・44.1kHz)を使って100回学習(48k・チャンネル768次元・出力12次元・hubert-base-japanese・crepe・Batch size:20)させた学習モデルを使うと、ここの値を「1」に近づけてもアーチファクトが気にならなくなりました。音声ファイルを増やし、学習回数を増やすと音質が向上するようでした。
学習の際にJupyterLab上に出力された学習の指標の1つである損失関数の値の経過を見てみると
・「epoch=1 loss_d=3.06 loss_g=52.9」
(学習1回目・dの損失関数=3.06・gの損失関数=52.9)
* d:discriminator(弁別器・識別器)
* g:generator(生成器)
* 損失関数:0に近づくほど性能が良い
↓
・「epoch=100 loss_d=1.41 loss_g=50.7」
(学習100回目・dの損失関数=1.41・gの損失関数=50.7)
ということで「dの損失関数」「gの損失関数」の値が良くなっているようでした。
追加で学習回数を増やした際には、損失関数の値がどうなっているのかをチェックするといいかもしれません。
損失関数の値が頭打ちになった際には、それ以上学習しても性能が上がらない可能性が考えられます。
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
(推論を開始)
のボタンをクリックします。
数秒〜10秒ほどで推論完了。
1〜3秒ほどのファイル10個で学習させただけでしたが、聞いてみると女性っぽい声に変換されていました。また、声の高さに関しては、変換したい声質に応じてキーの調整が必要そうでした。
さらに音声変換の品質を向上させるには、ファイル数や学習回数を増やす必要はありそうです。
今回の使い方を参考にしつつ、試行錯誤しながらオリジナルのボイスチェンジャーを作成してみてください。
尚、出力された音声ファイルは
「Output」
(出力された音声 - 右下隅の3つのドット、クリックしてダウンロード)
のところでダウンロードできます。
その他にも、
「outputs」
* 推論の際の「Out folder:」(ボイスチェンジ後の音声ファイルの出力先を指定)の設定で、何も指定しなかった場合の例
フォルダ内に以下の
・「1-amitaro-originalvoice.wav」(ファイル例)
のようなファイル名で保存されますので、必要に応じてローカル環境(自分のパソコン)にダウンロードして使ってみてください。
また、新たに推論をさせるとファイルが追加されていきます。
動画チュートリアル作成時点では、だだっこぱんだ🍞(ddPn08)さん版のRVC WebUIでは、日本語に特化した事前学習モデルを始め、学習させるために色々なパラメータを指定できるようにしてくださっているので、ボイスチェンジの高みを目指している方にとっては、ありがたいですね。
また、RVC WebUIを、日本人の方向けに独自に調整したプログラムを公開してくださっている、だだっこぱんだ🍞(ddPn08)さんと、だだっこぱんだ🍞(ddPn08)さんの支援者の皆さんに感謝です。
【ddPn08 - RVC v2モデル対応版】
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の設定)は「hubert-base-japanese」「contentvec」などの違うものでも融合できる
✔︎「Embedder Output Layer:」は「9」「12」は違うものでも融合できる
✔︎「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」(学習モデルを融合する)のボタンをクリックします。
処理が完了すると「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:
(ピッチ抽出アルゴリズム)
crepe
RVC v2モデル対応のだだっこぱんださん版RVC WebUIでは、「dio」「harvest」「crepe」「mangio-crepe」を選択できます。
高品質の音声を処理するには、「dio」を選択します。さらに品質向上で処理をしたい場合には、処理が遅くなりますが、「harvest」を選択します。品質を最高にしたい場合にはGPUに負荷がかかりますが「crepe」または「mangio-crepe」を選択します。
Embedder Model:
(Embedderモデル)
auto
学習の際に「Using phone embedder:」(phone embedderの設定)で設定したモデルを選択します。
「auto」にすると、自動的に「contentvec」か?「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 v2モデル】RunPod編:RVC WebUIの設定の解説動画へのコメントと対応例など
視聴者の方から動画へのコメントをいただけるようでしたら、回答などを、ここにまとめていく予定です。
by 子供プログラマー
:【RunPod編】RVC WebUIをはじめよう - AIボイスチェンジャー(一覧)