自分の分身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"
また、日本語処理で使用するpyopenjtalkやopenccのビルドでも一度停止しました。必要なビルド環境とパッケージを整えてインストールスクリプトを再実行し、最終的に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
最終的に使用した主なバージョンは次のとおりです。
| パッケージ | バージョン |
|---|---|
| Python | 3.10.20 |
| PyTorch | 2.7.1+cu128 |
| TorchAudio | 2.7.1+cu128 |
| pyopenjtalk | 0.4.1 |
| OpenCC | 1.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でファインチューニングしてから自分の声を再現しました。実際に行った流れは次のとおりです。
- 静かな部屋で、自分の声を約2分間M4A形式で録音する
- 録音時に読んだ文章を、一字一句そのままテキストで保存する
- GPT-SoVITSで音声の分割、文字起こし、テキストの校正を行う
- 学習用データを一括処理し、SoVITSモデルとGPTモデルをファインチューニングする
- 学習済みモデルと参照音声を使い、自分の声を再現した音声を生成する
録音した音声をそのまま学習へ使用するのではなく、発話単位に分割し、音声と文字が正確に対応しているか校正してから学習します。以下では、実際のWebUI画面に沿って各工程を紹介します。
ファインチューニングする
1. 音声を分割する
GPT-SoVITS WebUIを開き、0b-音声分割ツールのパネルを展開します。
音声自動分割の入力パスへ録音した音声ファイルのパス、分割後のサブオーディオの出力ルートディレクトリへ分割した音声の保存先を入力します。今回は、約2分間録音したmy_voice_2min.m4aを入力音声として使用し、分割後の音声をtraining/slicedへ保存しました。
設定を確認して、有効化音声分割をクリックします。音声分割プロセスの出力情報へ「音声分割完了しました」と表示されたら完了です。

2. 音声認識で文字起こしする
0c-音声認識ツールのパネルを展開し、分割した音声を文字起こしします。
入力フォルダのパスへ前の手順で分割した音声の保存先training/sliced、出力フォルダのパスへ文字起こし結果の保存先training/asrを指定します。今回は、音声認識の設定に次の値を使用しました。
| 設定 | 値 |
|---|---|
| ASRモデル | Faster Whisper(多言語) |
| ASRモデルサイズ | large-v3-turbo |
| ASR言語設定 | ja |
| データ型の精度 | float16 |
設定を確認して、有効化音声認識をクリックします。処理が完了すると、分割した音声ごとの文字起こし結果が出力先へ保存されます。

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

音声アノテーション用WebUIがブラウザで開いたら、分割された音声を一つずつ再生し、音声と文字起こし結果が一致しているか確認します。誤字、脱字、句読点などに誤りがある場合は、対応するテキスト欄を実際の発話どおりに修正します。
テキストを修正したらSubmit Textで変更を反映します。すべての音声を確認したあとにSave Fileをクリックし、校正したラベルを保存します。音声とテキストの対応がずれていると学習品質へ影響するため、この工程では一字一句を丁寧に確認します。

4. 学習用データを一括処理する
1-GPT-SoVITS-TTSタブを開き、ファインチューニングに使用するモデル情報を設定します。今回は、次の設定で1A-トレーニングデータフォーマットツールの一括処理を実行しました。
| 設定 | 値 |
|---|---|
| 実験・モデル名 | my_voice_v2pro |
| GPUカード番号 | 0(NVIDIA GeForce RTX 5080) |
| 学習済みモデルのバージョン | v2Pro |
| テキスト注釈ファイル | 校正後のsliced.list |
| 音声ファイルディレクトリ | training/sliced |
事前学習済みのBERT、SSL、SoVITS-Gモデルのパスを確認し、画面下部にある一括処理を実行します。この処理では、テキスト分割と特徴抽出、音声の自己教師あり特徴抽出、セマンティックトークン抽出が順番に行われます。

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つの学習を同時に実行せず、一つずつ完了させます。

6. 学習済みモデルで推論する
ファインチューニングが完了したら、1C-推論タブを開きます。GPTモデルリストとSoVITSモデルリストから、前の手順で生成された学習済みモデルを選択します。
今回は、GPTモデルにmy_voice_v2pro-e10.ckpt、SoVITSモデルにmy_voice_v2pro_e4_s92.pthを使用し、GPU番号へ0を指定しました。モデルが一覧へ表示されない場合は、モデルのパスを更新をクリックして一覧を更新します。
モデルを選択したら、有効化TTS推論WebUIをクリックします。

TTS推論WebUIが開いたら、画面上部で使用するGPTモデルとSoVITSモデルが選択されていることを確認します。続いて、3〜10秒程度の参照音声をアップロードし、参照オーディオの言語へ日本語を指定します。
推論テキストへ自分の声で読み上げたい文章を入力し、推論の言語に日本語、文章の分割方法に4つの文で区切るを指定しました。画面下部の音声合成ボタンを実行し、学習した自分の声に近い音声が生成されることを確認します。

次回予告
次回の記事では、Vercelで公開するWebアプリから自宅PCで動作する文字起こしAPIへ接続するため、Cloudflare Tunnelを構築します。文字起こしAPIをインターネットへ直接公開せず、Cloudflare Accessで保護しながら接続する方法を紹介します。
「自分の分身AIと音声会話できるアプリ」全6回
- 開発のきっかけ・全体構成
- Whisperの環境構築
- LM Studioの導入
- GPT-SoVITSで自分の声を再現(この記事)
- Cloudflare Tunnelの設定
- persona.mdで性格・話し方を設定