👄

最近のAIボイスチェンジャー(RVC、so-vits-svc)

2023/04/09に公開

私は趣味で機械学習を学ぶ初学者であり、説明に間違いや勘違いがある可能性があります。そういった点がありましたらコメントで指摘していただけると助かります。
また、so-vits-svcやRVCは論文ベースでの技術発表が無いため、以下はコードや周辺情報からの想像を含みます。

修正履歴

2023/04/15 RVCの動作について誤りがあったので修正しました。nadare🌱さんご指摘ありがとうございます。

AIボイスチェンジャーとは

ある発話音声の入力を特定の話者が発話したような声質の発話音声に変換するための、深層学習を使用したアプローチがそう呼ばれている印象です。

以前から、深層学習を用いたリアルタイムボイスチェンジャーはMMVCなどが存在していました。
最近(2022年11月頃から2023年4月頃)では、Retrieval-based-Voice-Conversion 通称RVC や、SoftVC VITS Singing Voice Conversion 通称so-vits-svc、DDSP-SVC、リアルタイム性は薄いもののdiff-svcなど、主に中国語圏のコミュニティにて開発されており、日本語圏においてもにわかに盛り上がりを見せています。

VITSについて

RVCとso-vits-svcの二つのアプローチにおける共通点として、VITSと呼ばれるアーキテクチャを基盤としていることが挙げられます。

VITSというのはConditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speechで提案されたネットワーク構造です。実装
VITSは自己回帰などの並列実行を妨げる仕組みを持たないため素早い生成が可能なText-to-Speechのためのネットワークです。

この論文自体は2021年1月あたりに出版されたもので、そこまで新しいものではありません。
VITSを用いた特定話者から特定話者への変換に関しては論文の実装中でも実験されており、日本語圏でも2022年初頭の時点でzassouさんによる実験例があります。

しかし、VITSはText-to-Speech(テキスト読み上げ、VOICEVOXやCeVIOなどが有名)をメインに作られたモデルであり、そのままボイスチェンジャーとして用いるにはいくつか問題点が存在します。例えば、「学習不要で」「誰の声でも」特定の話者の声に変換するための仕組みの欠如や、ファインチューンする上で複雑度が高いことなどが挙げられます。

最近になって話題になった理由の一つとして、それらの問題点を補うアプローチが中国コミュニティから出てきたということがあると思います。

以上を踏まえて、この記事ではVITSのモデルがどう声質変換に応用されているのか、RVCとso-vits-svcの違い、「誰の声でも」特定の声に変換するためのそれぞれの工夫などを主に解説しようと思います。

VITSの構造

VITS自体のアーキテクチャに関する解説は既に分かりやすい記事が複数投稿されているため、この記事では最低限にとどめます。

参照:
【機械学習】VITSでアニメ声へ変換できるボイスチェンジャー&読み上げ器を作った話

VITSは推論時、音素を入力として取り、音声データを出力します。
音素は配列としてMaskなしのTransformerで構成されたTextEncoderに入力され、期待値μと分散δで表される多変量正規分布にそれぞれ変換されます。
その出力はStochastic Duration Predictor(音素の発話時間を予測するネットワーク)に入力され、出力された発話時間に応じてそれぞれの音素のトークンが複製されます。この時点でのトークン列は、特定の話者に寄らない発話表現を取り出すように学習されます。
そのトークン列がflowと呼ばれる構造を持つネットワークを通り、さらにDecoderを通ることにより最終的に再生可能な波形が生成されます。

つまり、「Conditional Variational Autoencoder」の名前の通り、VITSは確率的に埋め込みを行うVAEのような性質を持っており、スペクトログラムを潜在変数へと落とすVAEと、テキスト-潜在変数間の変換を確率的な埋め込みを経由して行うEncoder(Transformer)Decoder(flow)の二段構造になっています。

VITSをどう声質変換に応用するか

VITSは論文の14-15pでも主張されているように、話者トークンを用いて発話から特定の話者に寄らない発話表現を取り出すように学習されるため、話者に依存しない発話表現を作ることができればあらゆる話者から特定の話者へと声質変換することができます。
RVCとso-vits-svcではこの「話者に依存しない表現」の利用にそれぞれ異なる仕組みを用いています。

so-vits-svc

so-vits-svcでは、正式名称SoftVC VITS Singing Voice Conversionの通り、SoftVCという仕組みをVITSに組み合わせることによって変換元話者によらない声質変換を実現しています。

SoftVCは、Discrete Content Encoderと呼ばれる、何らかのEncoderを通して出力されたトークン情報をk平均法を用いてクラスタリングすることで、話者に特有の情報(この場合は声質など)を排しつつ発話表現を得るという手法の改善手法です。
Discrete Content Encoderではk平均法がボトルネックになり、本来含まれていてほしい発話情報が抜け落ちてしまう問題点がありました。

SoftVCではDiscrete Content Encoderとは別にSoft Content Encoderと呼ばれるEncoderを追加で用いることにより解決を図っています。
Soft Content EncoderはDiscrete Content Encoderの出力と一致するように学習され、Discrete Content Encoderで抜け落ちた情報を補完するような構造になっています。
Content Encoderには、HuBERTや、ContentVecが用いられます。

Content Encoderの出力はVITSのTextEncoderへと入力されます。また、声のピッチ(F0)は、別途計算されてTextEncoderでEmbeddingとして付加されます。

学習時はContent EncoderをVITSのネットワークに結合した状態で学習されます。

RVC (2023/04/15修正)

RVCでは、「Retrieval(検索)」の名前の通り、faissによるベクトル類似検索を利用しています。

学習時、VITSのモデルを学習データからHuBERTを用いて作られたEmbeddingでチューニングします。加えて、faissを用いてデータベースに学習データのEmbeddingを格納します。
推論時、話者音声から得られたEmbeddingをfaissを用いて学習時に作られたデータベースから検索し、学習データ中の特徴が似通ったEmbeddingを取得します。
取得されたEmbeddingと話者音声から得られたEmbeddingとを線形補完で混ぜ合わせることにより、より学習元に近いEmbeddingをVITSの入力とすることができるため、話者の特徴に寄らない安定した声質変換を実現しています。

RVC

RVCでは、「Retrieval(検索)」の名前の通り、faissによるベクトル類似検索を話者に依存しない発話表現ベクトルを得るために利用しています。
推論時、Hubertを用いて音声からEmbeddingを作成し、事前に作成されたHubertによるEmbeddingのベクトルデータベースから、faissを用いて類似したベクトルを取得し、VITSのTextEncoderの入力として利用します。
so-vits-svcと同様に、ピッチは別途計算されてEmbeddingとして付加されます。

ファインチューン時、新規にデータセットから得られたEmbeddingをデータベースに追加し再クラスタリングを行うことでデータベースについても最適化を行います。

Discussion