RVC (Retrieval-based-Voice-Conversion) のモデル作成 (学習) や、リアルタイム音声変換に関する知見が溜まったので、自分用のメモも兼ねてここに共有します。
なお、本記事は RVC のバージョン updated0618v2 を基に作成しています。
RVC とは
機械学習ベースの音声変換技術です。
学習が簡単かつ高速で、少量のデータによる学習でも良好な結果が得られることが特徴とされています。
RVC WebUI 導入
GitHub から最新のバージョンをダウンロードします。
RVC-beta.7z
を任意の場所に展開し、go-web.bat
を起動します。
しばらくするとブラウザタブで RVC の画面が開きます。
RVC モデル作成
データの準備
変換先の声が含まれる音声データを用意します。
音声データの長さは、10 ~ 50 分が推奨されています。 いくつかの長さで試したところ、10 分ではあまり安定せず、30 分あれば充分、2 時間でもそれほど品質は上がらない、という印象です。
無音の時間があっても学習前に自動でカットされるため、特に問題はありません。
BGM や効果音が入っている場合は、次の項で説明するデータの前処理を行って音声のみを抽出します。 その際、音声データの時間が長いと後述の問題が発生するため、事前に 20 ~ 30 分毎に音声データを分割しておくことをお勧めします。
データの前処理 (音声抽出)
BGM や効果音を取り除いて、学習に適した音声データに変換します。
RVC を起動して、「伴奏人声分离&去混响&去回声」と書かれたタブをクリックします。
画像の 1, 2, 3 の部分を変更します。
-
音声データを入れたフォルダのパス
フォルダ名やファイル名にスペースが含まれると処理に失敗するようです。
-
モデル
-
データに対象の声以外の声が含まれない場合 :
HP2
orHP3
を選択HP3
はHP2
より非音声が入る可能性があるが、音声は綺麗に残りやすいらしい。お好みで。 -
データに対象の声以外の声が含まれる場合 :
HP5
を選択楽曲などをデータにする場合はこちらを選びます。
-
-
出力形式
学習時に最終的に wav に変換されるので、この段階で wav を選んでおきます。
「変換」をクリックしてしばらく待つと、opt
フォルダの中に変換後の音声データが出力されます。
音声抽出を行った結果、変換後の音声にエコーがかかる場合があります。
その場合は、2 のモデル選択で onnx_dereverb_By_FoxJoy
を指定し、抽出後の音声に対してエコー除去を行います。
学習
RVC を起動して、「トレーニング」と書かれたタブをクリックします。
画像の 1 ~ 9 の部分を変更します。
-
モデル名
-
目標サンプリングレート
高ければ良いというわけではなく、学習データに合わせて選ぶのが良いらしい。迷ったら
40k
を選択。 -
高音ガイド
true
を選択。 -
バージョン
v2
を選択。 -
CPU スレッド数
上げると処理が速くなる。(CPU の論理プロセッサ数) * 0.7 くらいが良さそう。
-
音声データを入れたフォルダのパス
フォルダ名やファイル名にスペースが含まれると処理に失敗するようです。
-
音高抽出アルゴリズム
harvest
を選択。 -
総エポック数
値に比例して学習時間が長くなる。必要以上に高く設定してもモデルの品質が上がるわけではない。
学習データの品質が良くない場合は20
~30
、品質が高く十分な再生時間がある場合は50
程度が良さそう。 -
GPU ごとのバッチサイズ
バッチサイズを上げると学習時間が短くなる。
値に比例して VRAM の使用量が増えるので、容量と相談して設定する。
VRAM 12 GB の RTX 3060 で、15
までは問題なく設定できた。
設定出来たら「ワンクリックトレーニング」をクリックしてしばらく待ちます。
学習にかかる時間は GPU のスペックや学習データの量、設定によって変わります。
学習が完了したら、weights
フォルダに生成された XXX.pth
ファイル、logs
フォルダに生成された added_XXX.index
ファイルを保存しておきます。
リアルタイム音声変換
作成したモデルを使ってリアルタイムに音声変換する方法を紹介します。
VB-CABLE 導入
Discord やゲームのボイスチャットなどで使用する場合、変換後の音声をマイク入力に流すため、VB-CABLE を利用します。
公式サイト から最新版をダウンロードし、任意の場所に展開します。
VBCABLE_Setup_x64.exe
を実行し、ドライバをインストールします。
インストール後、システムのサウンド設定から、出力と入力にそれぞれ CABLE Input
と CABLE Output
が追加されていることを確認します。
(サウンド設定が自動で CABLE に変更されてしまった場合は、元の設定に戻しておきます。)
VB-CABLE 利用時は以下のように、音声取り込み元 (今回は RVC GUI) の出力先を CABLE Input
に設定し、音声取り込み先 (Discord やゲーム) の入力元を CABLE Output
に設定します。
[RVC GUI] ---> [CABLE Input] >> VB-CABLE >> [CABLE Output] ---> [Voice Chat]
RVC GUI
VC Client を使ったリアルタイム音声変換が多く紹介されていますが、ここでは RVC 付属の RVC GUI を使う方法を紹介します。
go-realtime-gui.bat
を起動します。
画像の 1 ~ 4 を変更します。
3 と 4 については、2 の出力デバイスをスピーカーにして、自分で聴きながら調整すると良いでしょう。
-
モデル選択
作成した
XXX.pth
ファイルとadded_XXX.index
ファイルを選択します。 -
オーディオデバイス
入力デバイスに使用するマイクを指定し、出力デバイスに
CABLE Input
を指定します。
いくつかのドライバが選択できるので、マイク入力が検知されるものを選択します。
筆者の環境ではMME
が使用できました。 -
一般設定
-
反応閾値
値を下げるほど反応が高感度になり、小さな音まで入力されるようになります。
-
音程設定
入力音声の音程を調整します。男性→女性の変換では 12 (= 1 オクターブ) を基準に調整します。
-
Index Rate
値を上げると音程の変化がモデルに近付きますが、上げ過ぎると言葉が聞き取りづらくなります。
-
-
パフォーマンス設定
-
サンプル長
値を下げると変換の品質が下がるかわりに遅延が減って、リアルタイム性が向上します。
0.5 くらいが品質と遅延のバランスに優れていると感じました。 -
追加推論時間
値を下げると変換の品質が下がるかわりに遅延が減って、リアルタイム性が向上します。
サンプル長ほどは品質も遅延も変化しないです。 -
ノイズの低減
入れない方が変換の品質が良いです。
-
「音声変換を開始」をクリックすると変換が始まります。
まとめ
RVC モデルの作成方法と、作成したモデルによるリアルタイム音声変換の方法を紹介しました。
モデルの品質が向上する学習設定や、より高品質で遅延の少ない変換方法が判明したら、また更新しようと思います。