GPT-SoVITS : ファインチューニングできる0ショットの音声合成モデル
ファインチューニングできる0ショットの音声合成モデルであるGPT-SoVITSの紹介です。GPT-SoVITSを使用することで、高品質な日本語音声合成が可能です。
GPT-SoVITSの概要
GPT-SoVITSは2024年2月18日に公開された音声合成モデルです。リファレンス音声を使用した0ショットによる音声合成と、ファインチューニングに対応しています。
GPT-SoVITSの機能
GPT-SoVITSの機能は下記となります。
ゼロショットTTS
5秒の音声サンプルを入力して、即座に音声合成します。
フューショットTTS
わずか1分のトレーニングデータでモデルを微調整して、声の類似性とリアリティを向上させます。
クロスリンガルサポート
トレーニングデータとは異なる言語での推論をサポートし、現在は英語、日本語、中国語をサポートしています。
WebUIツール
音声と伴奏の分離、自動トレーニングセットのセグメンテーション、中国語のASR(音声認識)、およびテキストラベリングを含む統合ツールを備え、トレーニングデータセットの作成とGPT/SoVITSモデルの構築を支援します。
GPT-SoVITSのアーキテクチャ
GPT-SoVITSは近年の音声合成およびボイスチェンジャーモデルの研究を元にしています。
VITSは2021年1月に公開されたEnd2Endの音声合成モデルです。従来のEnd2Endの音声合成モデルは、テキストを中間表現に変換する2段階のTTSシステムよりも性能が低いという問題がありました。VITSでは、Flowモデルを導入し、話者の特徴を取り除く正規化フローと敵対的なトレーニングプロセスを取り入れることで、音声合成の性能を改善します。
VITS2は2023年7月に公開されたEnd2Endの音声合成モデルです。VITSの開発者のJungil Kongさんがセカンドオーサーに入っています。VITSにおけるFlowをTransformer Flowに置き換えています。従来のEnd2Endの音声合成モデルは、不自然さ、計算効率、音素変換への依存という問題がありました。VITS2はVITSから改善された構造とトレーニングメカニズムを提案し、音素変換への強い依存性を抑制します。
Bert-VITS2は2023年9月に公開されたEnd2Endの音声合成モデルで、VITS2のTextEncoderをMultilingual Bertに置き換えました。
SoVits(SoftVC VITS)は2023年7月に公開されたモデルで、VITSのText Encoderを音声からSoftVCのContent Encoderに置き換えることで、Text2Speechではなく、RVCのようなSpeech2Speechを実現しています。
GPT-SoVITSはこれらの研究を元にしており、VITSの高品質な音声合成と、SoVITSの0ショットの音色適用を融合しています。
GPT-SoVITSのデモビデオは下記に公開されています。
GPT-SoVITSのモデル構成
GPT-SoVITSは近代的なトークンベースの音声合成モデルで、acoustic tokenをseq2seqで生成後、acoustic tokenを波形に戻すことで音声合成した結果の波形を取得します。
GPT-SoVITSは下記のモデルで構成されます。
- cnhubert :入力波形の特徴ベクトルへの変換
- t2s_encoder:入力テキスト、参照テキスト、特徴ベクトルからacoustic tokenの生成
- t2s_decoder:acoustic tokenから音声合成したacoustic tokenの生成
- vits : acoustic tokenからの波形への変換
GPT-SoVITSの入力は下記となります。
- text_seq : 音声合成するテキスト
- ref_seq : リファレンス音声ファイルのテキスト
- ref_audio : リファレンス音声ファイルの波形
text_seqとref_seqは、g2pを使用して音素に変換後、symbols.pyでトークン列に変換します。日本語の場合、アクセント符号を含まない形でg2pを行います。中国語の場合、さらに、ref_bertとtext_bertとして、BERTのEmbeddingを併用しますが、日本語と英語の場合は0埋めされます。
ref_audioは、0.3秒の無音を末尾に追加した後、cnhubertを使用してssl_contentという特徴ベクトルに変換します。
ref_seq、text_seq、ssl_contentを入力して、t2s_encoderでacoustic tokenを生成します。
t2s_decoderにacoustic tokenを入力し、seq2seqで続きのacoustic tokenを出力します。この出力が音声合成テキストに対応するacoustic tokenになります。tokenは1025種類で、1024がEOSに対応します。1トークンずつ出力し、top_k、top_pサンプリングを行い、EOSが来たら終了します。
最後に、vitsにacoustic tokenを入れることで、音声波形を得ます。
GPT-SoVITSの音素変換
GPT-SoVITSでは、日本語はpyopenjtalkのg2p、英語はg2p_enのg2pを使用して、テキストを音素に変換します。
日本語で「ax株式会社ではAIの実用化のための技術を開発しています。」を入力すると、「e i e cl k U s u k a b u sh I k i g a i sh a d e w a e e a i n o j i ts u y o o k a n o t a m e n o g i j u ts u o k a i h a ts u sh I t e i m a s U .」が音素となります。通常のg2pとは異なり、句読点も含まれます。
英語で「Hello world. We are testing speech synthesis.」を入力すると、「HH AH0 L OW1 W ER1 L D . W IY1 AA1 R T EH1 S T IH0 NG S P IY1 CH S IH1 N TH AH0 S AH0 S .」が音素となります。g2p_enでは、cmudictの辞書を使用して単語を音素に変換するとともに、辞書にない単語については、ニューラルネットワークで音素に変換します。
GPT-SoVITSのインストール
Windows環境にAnacondaをインストールします。
リポジトリをCloneします。
git clone git@github.com:RVC-Boss/GPT-SoVITS.git
学習済みモデルをダウンロードして、`GPT_SoVITS/pretrained_models`フォルダに配置します。
依存ライブラリをインストールします。
conda create -n GPTSoVits python=3.9
conda activate GPTSoVits
pip install -r requirements.txt
PytorchのGPU版をインストールします。
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
起動します。
python webui.py
GPT-SoVITSの推論(0ショット)
0ショットで推論するには、WebUIの1-GPT-SoVITS-TTSを選択します。TTS推論WebUIを開くのチェックボックスを入れると、しばらくして、新規ウィンドウが開きます。
参照情報(音声ファイル)と、参照オーディオのテキスト、推論テキストを入力し、推論を開始を押します。推論結果が出力されます。0ショットでの推論では、入力音声の声色を使用して、推論テキストの音声が合成されます。
GPT-SoVITSの学習
特徴のはっきりした声であれば、0ショットでもそれなりの音声を取得可能です。より高精度な声を取得したい場合は、Fine Tuningを行う必要があります。
まず、データセットを作成します。0-データセット取得ツールの事前処理の「0n-音声分割ツール」で音声ファイルのパスを指定し、音声を分割します。
次に、ASRツールで音声認識を行い、リファレンスとなるテキストを生成します。Faster Whisperを選択することで、音声認識言語にjaを指定可能になります。
出力されるlistファイルのフォーマットは下記となります。
The TTS annotation .list file format:
```
vocal_path|speaker_name|language|text
```
Language dictionary:
- 'zh': Chinese
- 'ja': Japanese
- 'en': English
Example:
```
D:\GPT-SoVITS\xxx/xxx.wav|xxx|en|I like playing Genshin.
```
データセットの生成が完了後、トレーニングデータのフォーマットを行います。テキスト注釈ファイルと、トレーニングデータのオーディオファイルディレクトリを指定して、ワンクリック三連を開始を押します。
テキスト注釈ファイル
C:\Users\kyakuno\Desktop\GPT-SoVITS\output\asr_opt\slicer_opt.list
トレーニングデータのオーディオファイルディレクトリ
C:\Users\kyakuno\Desktop\GPT-SoVITS\output\slicer_opt
SoVITSと、GPTの両方の学習を行います。
RTX3080で1分程度の音声を学習すると、SoVITSの8EPOCHで78秒程度、GPTの15EPOCHで60秒程度かかります。学習済みモデルのサイズは、GPTが151,453KB、SoVITSが82,942KBでした。
学習後、推論のWebUIを開き、学習したモデルを選択して音声合成を行います。デフォルトのTemperatureは1.0ですが、0.5程度まで下げた方が安定する気がします。
ONNXへの変換
ONNXへのエクスポートコードは公式リポジトリに含まれています。ただし、このコードには、cnhubertへのエクスポートと、推論コードは含まれていないため、これらの処理の実装が必要です。
また、ONNX版はtorch版よりも出力音声の精度が低く、調査したところ、ONNX版とtorch版は下記の差分があったため、これらの実装が必要です。
- sampleのmultinomial_sample_one_no_syncへのexpの導入
- SinePositionalEmbeddingのpeの修正
- vq_decodeのnoise_scaleの導入
- first_stage_decodeのEOSの除去
また、topKやtopPがモデルに埋め込まれていて、外から制御できないため、inputに追加すると便利です。
これらの対応を行なったリポジトリは下記に公開しています。
また、本家のリポジトリにPRを発行しています。
日本語のイントネーション
現在、日本語ではアクセント記号を含まないg2pを使用しており、日本語のイントネーションに違和感が出ることがあります。下記のIssueで、アクセント記号の導入が検討されているようですので、将来的には改善する可能性があります。
ailia SDKでの実行
GPT-SoVITSはailia SDK 1.4.0以降で実行可能です。下記のコマンドでは、reference_audio_captured_by_ax.wavを元に音声合成を行います。
python3 gpt-sovits.py -i "音声合成のテストを行なっています。" --ref_audio reference_audio_captured_by_ax.wav --ref_text "水をマレーシアから買わなくてはならない。"
Google Colabでも実行可能です。
まとめ
GPT-SoVITSを使用することで、VALLE-Xよりも高品質な日本語の音声合成を行えることを確認しました。想像よりもファインチューニングの時間が短い印象で、実用性がありそうです。また、推論時間も短く、CPU推論も可能であるため、今後、幅広く使用されるようになりそうです。
トラブルシューティング
セマンティックトークンの取得で、”SystemError: initialization of _internal failed without raising an exception”というエラーが発生した場合は、numbaをアップデートしてください。
pip install -U numba
ax株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。ax株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。