KSTECHBLOG

自分の分身AIと音声会話できるアプリ④

GPT-SoVITSを使い、約2分の自分の音声でモデルをファインチューニングし、自声を再現した音声を生成するまでの流れを紹介します。

はじめに

前回の記事では、LM Studioを使って自宅PC上で会話の返答を生成できるところまで確認しました。今回は、その返答を自分の声で読み上げるために、GPT-SoVITSで自声クローンを試します。

GPT-SoVITSは日本語に対応した音声合成ツールです。公式では、短い参照音声を使ったゼロショット生成や、約1分の音声データを使った少量学習が案内されています。今回は約2分録音した自分の音声を分割・文字起こし・校正し、そのデータでモデルをファインチューニングして自分の声を再現します。現在開発している音声AIからAPIで呼び出しやすいことも、GPT-SoVITSを採用した理由です。

GPT-SoVITSをインストールする

今回は、GPT-SoVITSのソースコードとPython環境をvoice-aiプロジェクト内で管理できるようにしました。配置場所は次のとおりです。

voice-ai/
├── .venv/                 # Voice AI・Whisper用
├── .conda/gpt-sovits/     # GPT-SoVITS専用Python環境
└── .tools/GPT-SoVITS/     # GPT-SoVITS本体

ソースコードを取得する

PowerShellでvoice-aiプロジェクトへ移動し、公式リポジトリを.tools/GPT-SoVITSへcloneします。

Set-Location C:\path\to\voice-ai
New-Item -ItemType Directory -Path .\.tools -Force
git clone https://github.com/RVC-Boss/GPT-SoVITS.git .\.tools\GPT-SoVITS

C:\path\to\voice-aiは、実際にvoice-aiプロジェクトを配置したパスへ置き換えてください。

Python環境を作成する

Voice AI側では、Whisperによる文字起こしなどにPython 3.13の仮想環境.venvを使用していました。一方、今回取得したGPT-SoVITSの公式READMEでは、セットアップ用のPythonとして3.10が指定されています。PyTorchやpyopenjtalkなど、GPT-SoVITSが使用するパッケージとの互換性を優先し、公式手順に合わせてPython 3.10を選びました。

既存の.venvへGPT-SoVITSの依存パッケージを追加すると、Voice AI側で使用しているパッケージとのバージョン競合や、更新による動作への影響が発生する可能性があります。そのため、GPT-SoVITS専用のConda環境を作成し、Voice AI側のPython環境から分離しました。

conda create -n GPTSoVits python=3.10
conda activate GPTSoVits

依存関係と学習済みモデルをインストールする

GPT-SoVITSのフォルダへ移動し、公式のインストールスクリプトを実行します。今回使用したPCにはRTX 5080を搭載しているため、デバイスにはCUDA 12.8を指定しました。モデルの取得元にはHugging Faceを使用しています。

Set-Location .\.tools\GPT-SoVITS
pwsh -F .\install.ps1 --Device CU128 --Source HF

このスクリプトによって、FFmpeg、CMake、CUDA 12.8版PyTorch、requirements.txtに記載されたPythonパッケージ、GPT-SoVITSの学習済みモデルなどがインストールされます。

今回取得したバージョンでは、CUDA 12.8版のtorchcodecを取得できずインストールが停止しました。そのため、install.ps1のCUDA 12.8用パッケージをtorchcodecからtorchaudioへ変更して再実行しました。

Invoke-Pip torch torchaudio --index-url "https://download.pytorch.org/whl/cu128"

また、日本語処理で使用するpyopenjtalkopenccのビルドでも一度停止しました。必要なビルド環境とパッケージを整えてインストールスクリプトを再実行し、最終的にInstallation Completedと表示されるところまで確認しました。

インストール後は、RTX 5080で動作を確認できたバージョンへPyTorchとTorchAudioを固定しました。GPT-SoVITSのConda環境を有効にした状態で、次のコマンドを実行します。

python -m pip install `
  torch==2.7.1 torchaudio==2.7.1 `
  --index-url https://download.pytorch.org/whl/cu128

最終的に使用した主なバージョンは次のとおりです。

パッケージバージョン
Python3.10.20
PyTorch2.7.1+cu128
TorchAudio2.7.1+cu128
pyopenjtalk0.4.1
OpenCC1.4.1

Conda環境をプロジェクト内へ複製する

インストール後、作成した環境をvoice-aiプロジェクト内の.conda/gpt-sovitsへ複製しました。プロジェクトのルートへ戻って、次のコマンドを実行します。

Set-Location C:\path\to\voice-ai
conda create --yes --prefix .\.conda\gpt-sovits --clone GPTSoVits

これで、ほかのPython環境と分離した状態でGPT-SoVITSを起動できます。

WebUIを起動する

プロジェクト内へ複製したPython環境からwebui.pyを実行しました。voice-aiプロジェクトのルートから次のコマンドを実行します。

Set-Location .\.tools\GPT-SoVITS
..\..\.conda\gpt-sovits\python.exe webui.py ja_JP

ja_JPは、WebUIの表示言語を日本語にするための指定です。コマンドを実行すると、ファインチューニングや音声生成に使用するWebUIが起動します。

自分の声を使った音声生成の流れ

今回は約2分の音声を学習用データとして用意し、GPT-SoVITSでファインチューニングしてから自分の声を再現しました。実際に行った流れは次のとおりです。

  1. 静かな部屋で、自分の声を約2分間M4A形式で録音する
  2. 録音時に読んだ文章を、一字一句そのままテキストで保存する
  3. GPT-SoVITSで音声の分割、文字起こし、テキストの校正を行う
  4. 学習用データを一括処理し、SoVITSモデルとGPTモデルをファインチューニングする
  5. 学習済みモデルと参照音声を使い、自分の声を再現した音声を生成する

録音した音声をそのまま学習へ使用するのではなく、発話単位に分割し、音声と文字が正確に対応しているか校正してから学習します。以下では、実際のWebUI画面に沿って各工程を紹介します。

ファインチューニングする

1. 音声を分割する

GPT-SoVITS WebUIを開き、0b-音声分割ツールのパネルを展開します。

音声自動分割の入力パスへ録音した音声ファイルのパス、分割後のサブオーディオの出力ルートディレクトリへ分割した音声の保存先を入力します。今回は、約2分間録音したmy_voice_2min.m4aを入力音声として使用し、分割後の音声をtraining/slicedへ保存しました。

設定を確認して、有効化音声分割をクリックします。音声分割プロセスの出力情報へ「音声分割完了しました」と表示されたら完了です。

GPT-SoVITS WebUIの音声分割ツール。入力音声と出力先を指定し、有効化音声分割を実行した画面

2. 音声認識で文字起こしする

0c-音声認識ツールのパネルを展開し、分割した音声を文字起こしします。

入力フォルダのパスへ前の手順で分割した音声の保存先training/sliced出力フォルダのパスへ文字起こし結果の保存先training/asrを指定します。今回は、音声認識の設定に次の値を使用しました。

設定
ASRモデルFaster Whisper(多言語)
ASRモデルサイズlarge-v3-turbo
ASR言語設定ja
データ型の精度float16

設定を確認して、有効化音声認識をクリックします。処理が完了すると、分割した音声ごとの文字起こし結果が出力先へ保存されます。

GPT-SoVITS WebUIの音声認識ツール。入力・出力フォルダと日本語音声認識の設定を指定した画面

3. 音声テキストを校正・ラベル付けする

0d-音声テキスト校正・ラベル付けツールのパネルを展開します。ラベル付けファイルのパスへ、前の手順で生成された拡張子.listのファイルを指定し、有効化音声アノテーション用WebUIをクリックします。

GPT-SoVITS WebUIの音声テキスト校正・ラベル付けツール。ラベル付けファイルを指定して音声アノテーション用WebUIを起動する画面

音声アノテーション用WebUIがブラウザで開いたら、分割された音声を一つずつ再生し、音声と文字起こし結果が一致しているか確認します。誤字、脱字、句読点などに誤りがある場合は、対応するテキスト欄を実際の発話どおりに修正します。

テキストを修正したらSubmit Textで変更を反映します。すべての音声を確認したあとにSave Fileをクリックし、校正したラベルを保存します。音声とテキストの対応がずれていると学習品質へ影響するため、この工程では一字一句を丁寧に確認します。

音声アノテーション用WebUI。分割音声の波形を再生しながら文字起こし結果を校正する画面

4. 学習用データを一括処理する

1-GPT-SoVITS-TTSタブを開き、ファインチューニングに使用するモデル情報を設定します。今回は、次の設定で1A-トレーニングデータフォーマットツールの一括処理を実行しました。

設定
実験・モデル名my_voice_v2pro
GPUカード番号0(NVIDIA GeForce RTX 5080)
学習済みモデルのバージョンv2Pro
テキスト注釈ファイル校正後のsliced.list
音声ファイルディレクトリtraining/sliced

事前学習済みのBERT、SSL、SoVITS-Gモデルのパスを確認し、画面下部にある一括処理を実行します。この処理では、テキスト分割と特徴抽出、音声の自己教師あり特徴抽出、セマンティックトークン抽出が順番に行われます。

GPT-SoVITS WebUIの1-GPT-SoVITS-TTSタブ。v2Proモデルと学習データを設定して一括処理する画面

5. モデルをファインチューニングする

学習用データの一括処理が完了したら、1B-ファインチューニングタブを開きます。GPT-SoVITSでは、SoVITSモデルとGPTモデルをそれぞれ学習します。

SoVITSモデルには、次の設定を使用しました。

設定
各GPUのバッチサイズ4
総トレーニングエポック数8
テキストモジュールの学習率の重み0.4
保存頻度4エポックごと
GPUカード番号0

続いて、GPTモデルには次の設定を使用しました。

設定
各GPUのバッチサイズ8
総トレーニングエポック数15
保存頻度5エポックごと
DPOトレーニング無効
GPUカード番号0

どちらも、最新の重みファイルだけを保存する設定と、各保存時点で最終的な小さいモデルをweightsフォルダへ保存する設定を有効にしました。

最初に有効化SoVITSトレーニングをクリックし、出力情報を確認して学習の完了を待ちます。その後、有効化GPTトレーニングをクリックしてGPTモデルを学習します。学習中はGPUのメモリを使用するため、2つの学習を同時に実行せず、一つずつ完了させます。

GPT-SoVITS WebUIの1B-ファインチューニングタブ。SoVITSモデルとGPTモデルの学習条件を設定した画面

6. 学習済みモデルで推論する

ファインチューニングが完了したら、1C-推論タブを開きます。GPTモデルリストとSoVITSモデルリストから、前の手順で生成された学習済みモデルを選択します。

今回は、GPTモデルにmy_voice_v2pro-e10.ckpt、SoVITSモデルにmy_voice_v2pro_e4_s92.pthを使用し、GPU番号へ0を指定しました。モデルが一覧へ表示されない場合は、モデルのパスを更新をクリックして一覧を更新します。

モデルを選択したら、有効化TTS推論WebUIをクリックします。

GPT-SoVITS WebUIの1C-推論タブ。学習済みのGPTモデルとSoVITSモデルを選択してTTS推論WebUIを起動する画面

TTS推論WebUIが開いたら、画面上部で使用するGPTモデルとSoVITSモデルが選択されていることを確認します。続いて、3〜10秒程度の参照音声をアップロードし、参照オーディオの言語へ日本語を指定します。

推論テキストへ自分の声で読み上げたい文章を入力し、推論の言語に日本語、文章の分割方法に4つの文で区切るを指定しました。画面下部の音声合成ボタンを実行し、学習した自分の声に近い音声が生成されることを確認します。

GPT-SoVITSのTTS推論WebUI。参照音声と日本語の推論テキストを指定した画面

次回予告

次回の記事では、Vercelで公開するWebアプリから自宅PCで動作する文字起こしAPIへ接続するため、Cloudflare Tunnelを構築します。文字起こしAPIをインターネットへ直接公開せず、Cloudflare Accessで保護しながら接続する方法を紹介します。

「自分の分身AIと音声会話できるアプリ」全6回

  1. 開発のきっかけ・全体構成
  2. Whisperの環境構築
  3. LM Studioの導入
  4. GPT-SoVITSで自分の声を再現(この記事)
  5. Cloudflare Tunnelの設定
  6. persona.mdで性格・話し方を設定
トップページへ戻る