WindowsでGPT-SoVITSのローカルサーバーを立てる

初めに

いまさらですが、GPT-SoVITSのローカル推論を試していきます。今回はサーバー化したいため、fastAPIのサーバーを立てます

github.com

以下でuv 環境で記事の通りに以下の対応を行ったリポジトリを公開しています

  • シンプルなクライアントコードを作成
  • サーバーコードの修正
  • uv環境の構築

github.com

開発環境

準備

環境作成とライブラリのインストール

WindowsPowerShellの場合は、以下でUTF-8 エンコーディングが上手くできるように設定をします

$env:PYTHONIOENCODING = "utf-8"

次にuvの環境を作成します

uv init python=3.9
uv

必要なライブラリをインストールします

uv add -r requirements.txt
uv add ffmpeg-python 
uv add pyopenjtalk

この際にインストールされるtorchがcpuになっているので、そのまま動かす場合は GPT-SoVITS\GPT_SoVITS\configs\tts_infer.yaml の customのdeviceを以下のように cpu に変更します。またcpuでの実行の場合は、is_half をfalseにします

custom:
  bert_base_path: GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large
  cnhuhbert_base_path: GPT_SoVITS/pretrained_models/chinese-hubert-base
  device: cpu
  is_half: false
  t2s_weights_path: GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt
  version: v2
  vits_weights_path: GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth

GPU(CUDA)で処理をしたい場合は、以下でcuda版をインストールします

uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 --force-reinstall

またこの際に tts_infer.yaml の customの設定をいかに変更します

  device: cuda
  is_half: true

各モデルの配置

huggingface.co

公式のモデルをcloneもしくはダウンロードしてきて、以下の画像のようにモデルを配置します

GPT_SoVITS/
├── pretrained_models/
    ├── chinese-hubert-base/
    │   ├── config.json
    │   ├── preprocessor_config.json
    │   └── pytorch_model.bin
    ├── chinese-roberta-wwm-ext-large/
    │   ├── config.json
    │   ├── tokenizer.json
    │   └── pytorch_model.bin
    ├── gsv-v2final-pretrained/
    │   ├── s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt
    │   └── s2G2333k.pth
    └── .gitignore

サーバーコードの修正

api_v2.py に以下を追加します

import ffmpeg

ローカルサーバーの起動

以下のコマンドでローカルサーバーを立てることができます

uv run api_v2.py -a 127.0.0.1 -p 9880 -c GPT_SoVITS/configs/tts_infer.yaml

http://127.0.0.1:9880/docs にアクセスすると Swagger UIが表示されます

クライアントからサーバーを実行

今回はシンプルなクライアントコードを書いて実行をします

import requests

def tts_get():
    # GETリクエストのパラメータを設定
    params = {
        'text': 'こんにちは',
        'text_lang': 'ja',
        'ref_audio_path': 'ref_audio.wav',
        'prompt_text': 'また、東寺のように、五大明王と呼ばれる、主要な明王の中央に配されることも多い。',
        'prompt_lang': 'ja',
        'media_type': 'wav',
        'streaming_mode': 'false'
    }

    # GETリクエストを送信
    response = requests.get('http://127.0.0.1:9880/tts', params=params)

    # レスポンスの処理
    if response.status_code == 200:
        # 音声データをファイルに保存
        with open('output_get.wav', 'wb') as f:
            f.write(response.content)
        print('音声ファイルをoutput_get.wavに保存しました。')
    else:
        print(f"エラー {response.status_code}: {response.text}")

if __name__ == '__main__':
    tts_get()

実行することで以下の結果および音声ファイルが生成されます

uv run .\client.py
音声ファイルをoutput_get.wavに保存しました。

エラー対応

pyopenjtalkのインストールがうまくいかない場合

以下のライブラリを代用することでインストールが上手くいくことがあります。

github.com

以下でインストールすることができます

pip install pyopenjtalk-plus

torch関連が上手くいかない

個別に以下でインストールを行ってからほかのライブラリをインストールします。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

特定のversionをインストールする場合は、以下のようにします

pip install torch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 --index-url https://download.pytorch.org/whl/cu121

pytorch.org

CMakeがないと言われた場合

以下からダウンロードしてインストールを行います

cmake.org