コンテンツにスキップ

Fish Audio S2 Pro

Fish Audio S2 Proは、高忠実度の音声クローンと表現力豊かな発話に特化した多言語4BのTTSモデルです。TomoriBotはservers/tts/fishs2/にあるローカルラッパーを通じてこれを使用します。

TomoriBotの標準セットアップでは、合成品質を最大化し量子化による非互換を避けるため、公式のBF16重み(fishaudio/s2-pro)を使用します。メモリに制約のあるコンシューマーGPUを使うユーザー向けには、環境変数のオーバーライドでオプションのINT8重みのみ量子化版(Imagilux/fishaudio-s2-pro)にも対応しています。

Fish S2 Proは[whisper][excited][angry]のような角括弧表現タグに対応しています。TomoriBotが生成する音声スクリプト内でこれらの制御を保持できるよう、エンドポイントをブラケットタグマークアップで設定してください。

Fish Speechのコードおよびs2-Proのモデル重みは、Fish Audio Research Licenseの下で配布されています。研究目的と非商用利用はその条件の下で許可されていますが、商用利用には別途Fish Audioのライセンスが必要です。

TomoriBotはモデルの重みを再配布しません。セルフホストする各ユーザーは、Hugging Faceから直接Fish S2 Proをダウンロードし、Fish Audio Research Licenseを順守する責任を負います。必要なクレジット表記はBuilt with Fish Audioです。

ハードウェアとオペレーティングシステム

Section titled “ハードウェアとオペレーティングシステム”

[!IMPORTANT] Fish SpeechにはLinuxまたはWSL2を使用してください。 Fish AudioはLinuxおよびWSL2を公式にターゲットとしています。Fish S2 Proはデュアル自己回帰(Dual-AR)アーキテクチャ(低速トランスフォーマー36層+高速コードブックパス10回=1トークンあたり76層評価)を使用します。Linuxでは、OpenAI Tritonがこの入れ子ループを融合GPUカーネル(torch.compile(backend="inductor"))にコンパイルでき、上流のベンチマークによればLinuxサーバーGPUでリアルタイム合成が可能になります。ラッパーは既定でコンパイルを無効にしているため、使用するにはFISH_S2_COMPILE=1を設定してください。

ネイティブのWindowsではTritonがサポートされていないため、PyTorchは未コンパイルのeagerモードとなり、Windowsの WDDMドライバーを通じて12万回を超える逐次CUDAカーネルディスパッチが発生します。これにより深刻なディスパッチストールが起こり、まったく同じクリップの生成が約8〜10分(音声1秒あたり約65秒の計算時間)にまで遅くなります。実用的な推論のためには、Fish S2 ProをLinuxまたはWSL2内で実行してください

推奨ハードウェア:

  • Linux または WSL2(強く推奨)
  • 16 GB〜24 GBのVRAMを搭載したNVIDIA GPU(BF16はKVキャッシュとオフロードを使えば約16〜18 GBのVRAMに無理なく収まります)
  • Python 3.12を推奨
  • Fish Speechが必要とするgitffmpeg、標準的な音声ライブラリ

TomoriBotリポジトリのルートから実行します。

Terminal window
bash servers/tts/fishs2/install-fishs2.sh
servers/tts/fishs2/.venv/bin/python servers/tts/fishs2/server.py

インストーラーは次の作業を行います。

  1. Imagilux/fish-speechservers/tts/fishs2/fish-speech/にクローンし、固定されたランタイムコミットをチェックアウトする。
  2. 独立した.venvを作成する。
  3. Fish SpeechとTomoriBotラッパーの依存関係をインストールする。
  4. 公式BF16のfishaudio/s2-proチェックポイントをfish-speech/checkpoints/fish-speech-s2-pro/にダウンロードする。

通常の再インストールでは、移動し続けるブランチではなく、固定されたランタイムコミット 2225e924e7d35cc0a1d24dbc67cd1819e6cf429fにとどまります。モデルのリビジョンは既定でmain ですが、デプロイの再現性が必要な場合はFISH_S2_MODEL_REVISIONを不変のHugging Faceリビジョンに 固定してください。インストーラーの設定項目はインストーラー変数にまとめて あります。

Hugging Faceのこのモデルはゲート付きです。事前にHugging Face上でライセンスに同意してください。ダウンロード時に認証を求められた場合は、次を実行します。

Terminal window
servers/tts/fishs2/.venv/bin/hf auth login

その後、インストーラーを再実行してください。

Windows PowerShell(ベストエフォートのみ)

Section titled “Windows PowerShell(ベストエフォートのみ)”

ネイティブのWindowsは評価目的でのみ提供されています。未コンパイルのeagerモードによるドライバーのディスパッチ遅延のため、生成は非常に遅くなります(1クリップあたり約8〜10分)。

Terminal window
.\servers\tts\fishs2\install-fishs2.ps1
.\servers\tts\fishs2\.venv\Scripts\python.exe servers\tts\fishs2\server.py

このPowerShellインストーラーは、既定でCUDA GPUアクセラレーション(cu124)をターゲットにします。NVIDIA GPUを搭載しないCPUのみのマシンにインストールするには、-Cpuを渡してください。

Terminal window
.\servers\tts\fishs2\install-fishs2.ps1 -Cpu

Windows上でPyTorchをCUDA対応で手動インストールまたは更新する必要が生じた場合は、次を実行します。

Terminal window
.\servers\tts\fishs2\.venv\Scripts\pip.exe install --force-reinstall torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

TomoriBotはTTS_SYNTHESIZE_TIMEOUT_MS(既定240000ミリ秒)を過ぎると音声メッセージの待機を打ち切り ますが、これはネイティブWindowsでのクリップ生成にかかる時間よりも短い値です。Windowsで評価する間は、 TomoriBotの.envでこの値を引き上げてください(例: TTS_SYNTHESIZE_TIMEOUT_MS=900000)。

[!WARNING] 音声クローンには参照テキスト(ref_text)が必須です。 Fish S2 Proのクロスアテンション機構は、音素トークンを音響コードと整合させるために参照音声の文字起こしを必要とします。

対応する参照文字起こしを与えずに音声サンプルをアップロードすると、Fish Speechは参照音声トークンを黙って破棄し、無条件のランダムな音声にフォールバックします。TomoriBotのFishラッパーは、参照テキストを欠いた合成リクエストを検証し、意図しない無条件生成を防ぐために400 Bad Requestで拒否します。

/configモデル > TTSパラメーターと音声でペルソナの音声を追加する際は、必ず参照書き起こし欄に参照音声クリップで実際に話されている一言一句を入力してください。

/providers新しいカスタムエンドポイントを追加を選び、次のように設定します。

  • 機能: 音声
  • API互換性: tts-clone
  • エンドポイントURL: http://127.0.0.1:8015
  • 音声ソースモード: 音声クローン
  • スクリプトマークアップ形式: ブラケットタグ
  • APIキー: 既定のループバック構成では空欄のままにします。ベアラー認証を有効にしている場合は、FISH_S2_API_KEYの値を正確に入力してください。

続いてエンドポイントのモデルエントリを追加し、/configのモデル > モデルの切り替えから有効化します。

  1. 背景ノイズがほとんどまたはまったくない、話者1人による10〜20秒のクリアな参照クリップを準備します。
  2. /configでモデル > TTSパラメーターと音声を開き、音声サンプルをアップロードします。
  3. 参照クリップで実際に話されている文字起こしを正確に参照テキスト欄へ入力します。
  4. /configでペルソナ > 音声を開き、そのサンプルをペルソナに割り当てます。
  5. /generate voice-messageで音声メッセージを生成するか、TomoriBotのvoice-messageツールに生成させます。

Fish S2 Proは、角括弧タグを使って1つの発話の中でも発話の調子を変えられます。例:

[whisper] 声を抑えて。 [excited] え、本当に見つけたの?

このエンドポイントはBracket Tagsマークアップを使用するため、TomoriBotは合成前にこれらのタグを取り除かず保持します。

変数既定値用途
FISH_SPEECH_DIRservers/tts/fishs2/fish-speechFish Speechランタイムのディレクトリ
FISH_S2_MODEL_DIRfish-speech/checkpoints/fish-speech-s2-proS2 Proチェックポイントのディレクトリ
FISH_S2_MODEL_IDfishaudio/s2-pro設定済みチェックポイントのモデルリポジトリおよびヘルスメタデータのラベル
TOMORI_TTS_HOST127.0.0.1TomoriBotラッパーのバインドアドレス
FISH_S2_PORT8015Fishラッパーのポート。未設定時はTOMORI_TTS_PORTにフォールバック
TOMORI_TTS_PORT未設定後方互換の共有ポートオーバーライド
FISH_S2_API_KEY未設定任意のベアラートークン。認証付きリモートバインドにも必要
TOMORI_TTS_API_KEY未設定FISH_S2_API_KEYが未設定の場合の共有ベアラートークンのフォールバック
FISH_S2_ALLOW_INSECURE_REMOTE0ベアラートークンなしのループバック以外のバインドを明示的に許可
FISH_S2_MAX_REF_AUDIO_BYTES10485760デコード後の参照WAVの最大サイズ
TOMORI_TTS_MAX_REF_AUDIO_BYTES未設定共有のデコード済み参照音声上限のフォールバック
FISH_S2_UPSTREAM_HOST127.0.0.1内部Fish APIのバインドアドレス
FISH_S2_UPSTREAM_PORT8025内部Fish APIのポート
FISH_S2_COMPILE0Fish Speechのtorch.compileを有効化(Linux/WSL2とTritonが必要)
FISH_S2_HALF0FP16ランタイムモードを要求
FISH_S2_CHUNK_LENGTH200Fishの反復プロンプトのチャンク長
FISH_S2_TOP_P0.8サンプリングのtop-p
FISH_S2_TEMPERATURE0.8サンプリング温度
FISH_S2_REPETITION_PENALTY1.1繰り返しペナルティ
FISH_S2_MAX_NEW_TOKENS10241リクエストあたりに生成される意味トークンの最大数
FISH_S2_USE_MEMORY_CACHEonFishランタイム内でエンコード済み参照音声をキャッシュ
TOMORI_TTS_MAX_TEXT_CHARS2000ラッパーが受け付けるスクリプトの最大文字数
FISH_S2_STARTUP_TIMEOUT_SECONDS180内部のFish APIの起動を待つ最大時間
FISH_S2_SYNTHESIS_TIMEOUT_SECONDS18001回の上流合成リクエストを待つ最大時間
FISH_S2_LAUNCH_TIMEOUT_MS240000bun run launch --fishs2がラッパーのヘルスチェックを待つ時間

install-fishs2.shinstall-fishs2.ps1が読み込みます。デプロイを再現できるよう、オーバーライドした値は記録しておいてください。

変数既定値用途
FISH_S2_RUNTIME_REPOSITORYhttps://github.com/Imagilux/fish-speech.gitFish Speechランタイムのリポジトリ。例えばレビュー済みのミラーなど
FISH_S2_RUNTIME_REF2225e924e7d35cc0a1d24dbc67cd1819e6cf429fインストール時にチェックアウトされるランタイムコミット
FISH_S2_MODEL_IDfishaudio/s2-proダウンロードするHugging Faceのリポジトリ
FISH_S2_MODEL_REVISIONmainダウンロードするHugging Faceのリビジョン
FISH_S2_UPDATE0ランタイムを意図的に更新しモデルを再ダウンロードするには1を設定
FISH_S2_UPDATE_REF未設定更新時のランタイムref。未設定の場合、明示的なFISH_S2_RUNTIME_REFがあればそれを維持し、なければ更新はmainを使用
FISH_S2_UPDATE_MODEL_REVISION未設定更新時のモデルリビジョン。優先順位はFISH_S2_UPDATE_REFと同じ

参照音声は、空でない非圧縮のPCM RIFF/WAVEファイルである必要があります。デコード後のサイズ上限は、 過大なbase64リクエストが無制限にメモリを消費するのを防ぐため、推論前にチェックされます。

低VRAM向けオプション(INT8量子化)

Section titled “低VRAM向けオプション(INT8量子化)”

VRAMに制約のあるGPU(例えば8〜12 GB)で動かしており、公式BF16チェックポイントが収まらないユーザーは、INT8量子化モデル(Imagilux/fishaudio-s2-pro)を選択できます。

INT8チェックポイントをインストールして実行するには:

Terminal window
# Linux / WSL2の場合:
export FISH_S2_MODEL_ID="Imagilux/fishaudio-s2-pro"
export FISH_S2_MODEL_DIR="servers/tts/fishs2/fish-speech/checkpoints/fish-speech-s2-pro-int8"
export FISH_S2_MODEL_REVISION="9706ff036580881d87cc09465dd10014527bc481"
bash servers/tts/fishs2/install-fishs2.sh
Terminal window
# Windows PowerShellの場合:
$env:FISH_S2_MODEL_ID = "Imagilux/fishaudio-s2-pro"
$env:FISH_S2_MODEL_DIR = "servers/tts/fishs2/fish-speech/checkpoints/fish-speech-s2-pro-int8"
$env:FISH_S2_MODEL_REVISION = "9706ff036580881d87cc09465dd10014527bc481"
.\servers\tts\fishs2\install-fishs2.ps1

ラッパーがBF16の既定ディレクトリではなくINT8ディレクトリを読み込むように、同じシェルからserver.pyを起動するか、起動前に同じ3つの変数を設定してください。

INT8チェックポイントは、音声埋め込みとコーデック層をBF16のまま保ちつつ、トランスフォーマー重みを約10.3 GBから約5.1 GBに削減し、合計約10 GBのVRAM内に収まります。