GPT-SoVITS : ファインチューニングできる0ショットの音声合成モデル

Kazuki Kyakuno
axinc
Published in
19 min readFeb 26, 2024

ファインチューニングできる0ショットの音声合成モデルであるGPT-SoVITSの紹介です。GPT-SoVITSを使用することで、高品質な日本語音声合成が可能です。

GPT-SoVITSの概要

GPT-SoVITSは2024年2月18日に公開された音声合成モデルです。リファレンス音声を使用した0ショットによる音声合成と、ファインチューニングに対応しています。

GPT-SoVITS : https://github.com/RVC-Boss/GPT-SoVITS

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モデルを導入し、話者の特徴を取り除く正規化フローと敵対的なトレーニングプロセスを取り入れることで、音声合成の性能を改善します。

出典:https://arxiv.org/abs/2106.06103

VITS2は2023年7月に公開されたEnd2Endの音声合成モデルです。VITSの開発者のJungil Kongさんがセカンドオーサーに入っています。VITSにおけるFlowをTransformer Flowに置き換えています。従来のEnd2Endの音声合成モデルは、不自然さ、計算効率、音素変換への依存という問題がありました。VITS2はVITSから改善された構造とトレーニングメカニズムを提案し、音素変換への強い依存性を抑制します。

Bert-VITS2は2023年9月に公開されたEnd2Endの音声合成モデルで、VITS2のTextEncoderをMultilingual Bertに置き換えました。

出典:https://github.com/fishaudio/Bert-VITS2

SoVits(SoftVC VITS)は2023年7月に公開されたモデルで、VITSのText Encoderを音声からSoftVCのContent Encoderに置き換えることで、Text2Speechではなく、RVCのようなSpeech2Speechを実現しています。

出典:https://github.com/svc-develop-team/so-vits-svc

GPT-SoVITSはこれらの研究を元にしており、VITSの高品質な音声合成と、SoVITSの0ショットの音色適用を融合しています。

出典:https://www.bilibili.com/video/BV12g4y1m7Uw/

GPT-SoVITSのデモビデオは下記に公開されています。

GPT-SoVITSのモデル構成

GPT-SoVITSは近代的なトークンベースの音声合成モデルで、acoustic tokenをseq2seqで生成後、acoustic tokenを波形に戻すことで音声合成した結果の波形を取得します。

GPT-SoVITSは下記のモデルで構成されます。

  1. cnhubert :入力波形の特徴ベクトルへの変換
  2. t2s_encoder:入力テキスト、参照テキスト、特徴ベクトルからacoustic tokenの生成
  3. t2s_decoder:acoustic tokenから音声合成したacoustic tokenの生成
  4. vits : acoustic tokenからの波形への変換

GPT-SoVITSの入力は下記となります。

  1. text_seq : 音声合成するテキスト
  2. ref_seq : リファレンス音声ファイルのテキスト
  3. 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を開くのチェックボックスを入れると、しばらくして、新規ウィンドウが開きます。

推論のWebUIを開く

参照情報(音声ファイル)と、参照オーディオのテキスト、推論テキストを入力し、推論を開始を押します。推論結果が出力されます。0ショットでの推論では、入力音声の声色を使用して、推論テキストの音声が合成されます。

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版は下記の差分があったため、これらの実装が必要です。

  1. sampleのmultinomial_sample_one_no_syncへのexpの導入
  2. SinePositionalEmbeddingのpeの修正
  3. vq_decodeのnoise_scaleの導入
  4. 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に関するトータルソリューションを提供していますのでお気軽にお問い合わせください。

--

--

Kazuki Kyakuno
axinc
Editor for

CTO — ax Inc. , Managing Director — AXELL