RVC : AIを使用したボイスチェンジャー
ailia SDKで使用できる機械学習モデルである「RVC」のご紹介です。エッジ向け推論フレームワークであるailia SDKとailia MODELSに公開されている機械学習モデルを使用することで、簡単にAIの機能をアプリケーションに実装することができます。
RVCの概要
RVC(Retrieval-based-Voice-Conversion)はAIを使用したボイスチャンジャーです。10分程度の短い音声で、高品質のボイスチェンジャーを学習可能です。従来のボイスチェンジャーは、自分の声と、変換先の声の2つのデータが必要で、自分の声のデータセットを準備しないといけないという問題がありました。RVCはHubertという汎用的な特徴抽出モデルを使用することで、任意の声から、特定の声に変換可能としています。

出典:https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI
RVCのアーキテクチャ
RVCの基本構成
RVCはhubertとnet_gの2つのモデルを使用しています。hubertで特徴抽出した後、net_gで音声を生成します。
hubertは汎用的な特徴抽出モデルです。hubertは、自然言語処理におけるBERTの音声版のようなもので、MFCCをフレームごとに抽出した後、マスクされたMFCCを予測するように学習されています。モデルアーキテクチャはTransformerです。
HuBERTで音声言語モデルの性能を改善テキストデータを使用せず、音声データのみを用いて構築した言語モデルの性能改善手法に関する続編となります。techblog.yahoo.co.jp
hubertへの入力はPCMで、特徴ベクトルが出力されます。(1, 156736)のPCMを入力した場合、hubertの特徴ベクトルは(1, 489, 256)となります。
net_gの入力は特徴ベクトルで、PCMが出力されます。net_gはRVCのバージョン1と2、if_f0の有無で、下記の4パターンになります。
self.if_f0 = cpt.get("f0", 1)
self.version = cpt.get("version", "v1")
if self.version == "v1":
if self.if_f0 == 1:
self.net_g = SynthesizerTrnMs256NSFsid(
*cpt["config"], is_half=config.is_half
)
else:
self.net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"])
elif self.version == "v2":
if self.if_f0 == 1:
self.net_g = SynthesizerTrnMs768NSFsid(
*cpt["config"], is_half=config.is_half
)
else:
self.net_g = SynthesizerTrnMs768NSFsid_nono(*cpt["config"])
net_gの内部は、Embedding、TextEncoder、PosteriorEncoder、ResidualCouplingBlock、GeneratorNSFで構成されます。
Embeddingでhubertの特徴ベクトルを符号化、TextEncoderでpitchを符号化した後、PosteriorEncoderでzを生成、ResidualCoupllingBlockでz_pを計算後、GeneratorNSFでPCMを生成します。
Pitch Guidance
RVCにはpitch guidanceという機能があります。内部的にはif_f0というフラグで扱われます。if_f0がTrueの場合、net_gの音声合成時に、入力音声のf0(基本周波数)を追加で与えます。
入力音声のf0の抽出には、worldや、CNNベースのcrepeなどが選択可能になっています。f0の抽出方法は学習時と合わせる必要はなく、推論時に任意に選択可能です。
f0を使用することで、元の音声のイントネーション(音程など)を反映させることが可能なため、歌唱などにも使用可能になります。
会話では、処理負荷を低減するために、f0を使用しないモデルを使用する場合もあります。
Faiss
RVCではFaissというベクトル検索ライブラリを使用して、より元の声に近づける機能があります。これは、入力された音声のhubertの特徴ベクトルから、学習に使用したデータセットの特徴ベクトルのうち距離が近いものを選択し、入力された音声のhubertと重み付き平均することで、元の音声に近づける方式になります。
Faissを使用する際に、Protectモードを有効にすると、f0が1より小さい場合に無音と判定し、元の音声の反映度を大きくします。これにより、ブレスなどを反映しやすくなります。
RVCの使用方法
RVCのセットアップ
公式のRVCはWEB UIとして起動します。
リポジトリをCloneして依存ライブラリをインストールします。Python3.11には依存ライブラリが対応していないため、Python3.10を使用します。
git clone https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI
pip3.10 install -r requirements.txt
hubert_base.ptを下記からダウンロードしてルートに配置します。

hubert_base.ptの配置
声のモデルはweightsフォルダに配置します。

声のモデルの配置
下記のコマンドでWEB UIを起動し、ブラウザからアクセスします。
python3.10 infer-web.py
macOSの場合は非対応レイヤーエラーが発生するため、下記のコマンドでCPU実行にする必要があります。
export PYTORCH_ENABLE_MPS_FALLBACK=1
RVCの推論
RVCが起動するので、モデルを指定、入力音声ファイルを指定して、変換ボタンを押します。F0を含むモデルで、男性から女性に変換する場合は、ピッチ変更で+12を指定します。

RVCを使用した推論
RVCの学習
学習にはトレーニングタブを使用します。
重みの初期値となるf0G40k.pthをダウンロードしてpretrained_v2に配置しておきます。
学習用の音声ファイルをフォルダに格納し、「データ処理」と「特徴抽出」を押します。その後、「モデルのトレーニング」を押します。

RVCの学習
必要に応じて、Fiassの特徴を取得するため、「特徴インデックスのトレーニング」を押します。学習結果はweightsフォルダに格納されます。
7分の音声で5分程度で学習が完了します。
RVCのv1とv2
学習時に、RVCのバージョンをv1とv2から選択可能です。v1はhubertの出力およびnet_gへの入力が256次元となります。v2はhubertの出力およびnet_gへの入力が756次元となります。
RVCのONNXへの変換
RVCは公式の機能でnet_gモデルのONNX変換が可能です。Onnxエクスポートタブを選択し、RVCモデルパスにpthを、Onnx出力パスにonnxを指定して、Onnxに変換ボタンを押すと、ONNXが出力されます。

ONNX変換
なお、過去のバージョンのRVCでnet_gモデルをONNXに変換した場合、opset=17のLayerNormalizationが出力される場合があります。ailia SDK 1.2.15ではLayerNormalizationに対応していないため、opset=13以下でエクスポートしてください。
公式のRVCは、下記のDirectML対応のPRでopset=13でエクスポートされるようになっているため、最新のRVCでONNXに変換した場合はailiaでも問題なく動作します。過去に出力したONNXでailiaで動作しない場合は、再エクスポートしてください。
Onnx推理dml支持 by NaruseMioShirakana · Pull Request #556 ·…Onnx推理dml支持Onnx推理dml支持github.com
なお、LayerNormalizationはailia SDK 1.2.16で対応予定です。
Hubertについては、RVCのソースコードを書き換え、torchのnightlyバージョンでONNX変換が可能です。Hubertは音源に依存せず共通なため、弊社で変換済みのONNXをそのまま使用可能です。
モデルサイズは、hubert_baseが293.5MB、net_gが110.2MBです。
ailia SDKからRVCを使用する
下記のコマンドで入力音声を変換可能です。
$ python3 rvc.py -i input.wav
デフォルトでは、MITライセンスの下記のモデルを使用させていただいています。このモデルはF0を使用しないモデルとなります。
F0を使用するモデルは、下記のコマンドで実行可能です。indexはFaiss用のオプションです。
python3 rvc.py -i 0-input.wav -m Rinne.onnx --f0_method harvest --f0 1 --f0_up_key 11 --tgt_sr 48000 --file_index Rinne.index --index_rate 0.75
弊社では下記のモデルテストを行なっています。このモデルは再配布不可なため、ONNXに変換後に使用してください。
RVC v2のモデルを使用する場合は、versionオプションで2を付与します。
UnityからRVCを使用する
ailia SDKを使用することで、UnityからRVCを使用可能です。下記のサンプルでは、入力音声をSileroVADでAudioClipに分割し、AudioClipにRVCを適用、ボイスチェンジしたAudioClipを出力し、AudioSourceで再生します。F0を使用したモデルとF0を使用しないモデルの両方に対応しており、F0の計算にはcrepe_tinyを使用しています。
アイリア株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。アイリア株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。
ailia Tech BLOG