# 推論
Fish Audio は 2 つのモデルを提供しています:**S2-Pro** と **Drama 3**。両者は同じコマンドラインと API サーバーを共有し、モデル種別は重みディレクトリの `config.json` から自動判定されるため、以下の各節は「タスク → 各モデルのコマンド」の順で構成しています。
まず[インストール](install.md)を完了し、[モデルの重み](install.md#重みのダウンロード)をダウンロードしてください。
!!! warning "Drama 3 の実行制限"
Drama 3 は NVIDIA GPU でのみ動作します。CPU、Apple MPS、AMD ROCm には非対応で、`--compile` も使用できません。GPU メモリは[必要条件](install.md#必要条件)を参照してください。
!!! note
V100 など SM80 より前の GPU には bfloat16 がないため、Drama 3 は float16 に切り替わります(残差ストリームは fp32 のまま)。この経路は実機では未検証です。無音・ノイズ・"non-finite logits" エラーが出た場合は issue を報告してください。
## コマンドライン推論
### S2-Pro
S2-Pro は「VQ トークン → Semantic トークン → 音声」の 3 ステップです。
!!! note
モデルに音色をランダムに選ばせる場合は、ステップ 1 をスキップできます。
**1. リファレンスオーディオから VQ トークンを取得する**
```bash
python fish_speech/models/dac/inference.py \
-i "test.wav" \
--checkpoint-path "checkpoints/s2-pro/codec.pth"
```
`fake.npy` と `fake.wav` が得られます。
**2. テキストから Semantic トークンを生成する**
```bash
python fish_speech/models/text2semantic/inference.py \
--text "変換したいテキスト" \
--prompt-text "リファレンステキスト" \
--prompt-tokens "fake.npy" \
# --compile
```
作業ディレクトリに `codes_N` ファイルが作成されます(N は 0 から始まる整数)。
!!! note
`--compile` で CUDA カーネルを融合し、推論を高速化できます。ただし弊社の sglang による推論高速化の利用を推奨します。
高速化を使わない場合は、`--compile` パラメータをコメントアウトしてください。
!!! info
bf16 非対応の GPU では `--half` パラメータが必要な場合があります。
**3. セマンティックトークンから音声を生成する**
```bash
python fish_speech/models/dac/inference.py \
-i "codes_0.npy" \
```
`fake.wav` ファイルが得られます。
### Drama 3
Drama 3 は 1 コマンドで完結し、`--output` がデコード済みの音声を直接書き出します:
```bash
python fish_speech/models/text2semantic/inference.py \
--checkpoint-path checkpoints/drama-3 \
--text "変換したいテキスト" \
--prompt-audio "reference.wav" \
--prompt-text "リファレンステキスト" \
--output "output.wav" \
--device cuda:0
```
古い GPU では `--device cuda:0,cuda:1,cuda:2,cuda:3` のように複数枚を指定できます。最後の 1 枚が音声デコーダと codec を担当します。`--device cuda` のみの場合は、可視な GPU のうち最大 4 枚を使用します。
## API サーバー
### S2-Pro の起動
```bash
python tools/api_server.py \
--listen 0.0.0.0:8080 \
--llama-checkpoint-path checkpoints/s2-pro \
--decoder-checkpoint-path checkpoints/s2-pro/codec.pth \
--decoder-config-name modded_dac_vq
```
### Drama 3 の起動
```bash
python tools/api_server.py \
--listen 0.0.0.0:8080 \
--llama-checkpoint-path checkpoints/drama-3 \
--device cuda:0
```
!!! note
Drama 3 は `--compile` に非対応です。古い GPU では `--device` に複数枚を列挙してください。最後の 1 枚が音声デコーダと codec を担当します。
両モデルで共通の起動オプション:
- `--compile`:`torch.compile` による最適化を有効化(S2-Pro のみ)
- `--half`:fp16 モードを使用
- `--api-key`:bearer トークン認証を要求
- `--workers`:ワーカープロセス数を設定
- `--max-text-length`:1 リクエストのテキスト長を制限(0 は無制限)
ヘルスチェック:
```bash
curl -X GET http://127.0.0.1:8080/v1/health
```
`{"status":"ok"}` が返れば正常です。
### API エンドポイント
| メソッド | パス | 説明 |
| --- | --- | --- |
| `POST` | `/v1/tts` | テキスト音声変換(リクエストボディは msgpack) |
| `GET` | `/v1/tts/defaults` | 読み込まれたモデルのサンプリング既定値 |
| `GET` | `/v1/health` | ヘルスチェック |
| `POST` | `/v1/vqgan/encode` | リファレンス音声 → VQ トークン |
| `POST` | `/v1/vqgan/decode` | VQ トークン → 音声 |
| `POST` | `/v1/references/add` | リファレンス音声を保存(フォーム項目 `id`、`audio`(ファイル)、`text`) |
| `GET` | `/v1/references/list` | 保存済み音声の一覧 |
| `POST` | `/v1/references/update` | リネーム(フォーム項目 `old_reference_id`、`new_reference_id`) |
| `DELETE` | `/v1/references/delete` | 削除(フォーム項目 `reference_id`) |
| `GET` | `/ui` | WebUI(Docker イメージには組み込み済み。ソース実行では要先ビルド) |
保存した音声は `--reference_id` で参照できます(音声フィールドには MIME タイプが必要です。指定しないとサーバーが認識できません):
```bash
curl -X POST http://127.0.0.1:8080/v1/references/add \
-F id=my-speaker \
-F "audio=@reference.wav;type=audio/wav" \
-F text="リファレンス音声の書き起こし"
python tools/api_client.py --url http://127.0.0.1:8080/v1/tts \
--text "Hello" --reference_id my-speaker --output demo
```
### リクエストの送信
どのモデルが使われるかはサーバー起動時に読み込んだ重みで決まり、リクエスト側にモデル指定フィールドはありません。
```bash
python tools/api_client.py \
--url http://127.0.0.1:8080/v1/tts \
--text "Hello from Fish Speech" \
--output demo
```
主なパラメータ:
| パラメータ | 説明 |
| --- | --- |
| `--reference_audio` / `--reference_text` | リファレンス音声とその書き起こし。両者の数は一致させる必要があります |
| `--reference_speaker` | 各リファレンス音声の話者 ID(0–15)。<|speaker:N|> プレフィックスとして付与(Drama 3 の主な使い方) |
| `--reference_id` | 保存済みのリファレンス音声を使用(例:`my-speaker`) |
| `--format` | 出力形式:`wav`、`pcm`、`mp3`、`opus`(既定値 `wav`) |
| `--streaming` | 音声をストリームで返す |
| `--single_chunk` | 分割せず全体を一度に生成(Drama 3 のみ) |
| `--chunk_length` | チャンク長、既定値 200(S2-Pro のみ) |
| `--max_new_tokens` | チャンクあたりの最大フレーム数。未指定はサーバー既定の 1024、0 はモデルの上限 |
| `--temperature` / `--top_p` | サンプリング。未指定はモデルの既定値(0.7 / 0.7) |
| `--seed` | 乱数シードを固定(音色の固定には使えません) |
| `--api_key` | サーバーが `--api-key` を有効にしている場合は必須 |
| `--no-play` | 生成後に音声を再生しない(既定は再生。オーディオ機器のない環境では指定) |
!!! note
`repetition_penalty` は互換性のために残されていますが、S2-Pro と Drama 3 はどちらも使用せず、内蔵の繰り返し認識サンプリングを使います。
!!! tip
Docker でサーバーを起動する場合は [Dockerセットアップ](install.md#dockerセットアップ)を参照してください(server イメージには WebUI が組み込み済みで、起動後 `http://localhost:8080/ui` を開けます)。
## モデルの違い
| 項目 | S2-Pro | Drama 3 |
| --- | --- | --- |
| ハードウェア | GPU / CPU | NVIDIA GPU のみ、`--compile` 非対応 |
| 長文 | `chunk_length` で分割 | 約 300 バイト(UTF-8)・最大 3 話者のチャンクに自動分割し、可能な限り文末で切断。最初と最新のチャンクをコンテキストとして再入力 |
| 1 回あたりの長さ上限 | デフォルトはバッチごとに 1024 フレーム。`max_new_tokens=0` でコンテキスト長まで生成 | デフォルトはチャンクごとに 1024 フレーム(約 47 秒)で、`single_chunk` 時はテキスト全体で 1024 フレーム。`max_new_tokens=0` ではチャンクごとに 600 フレーム、`single_chunk` 時は 2048 フレーム(約 95 秒)。いずれも「10,240 フレーム − プロンプト長」が上限 |
| 話者 | リファレンスの順序が役割を決める | <|speaker:0|>–<|speaker:15|> タグが役割を決め、リファレンスの順序は無関係 |
| `chunk_length` | 有効 | 無効 |
| サンプリング既定値 | temperature 0.7、top-p 0.7、top-k 30 | 同じ |
| `repetition_penalty` | 無視 | 無視 |
Drama 3 には環境変数が 2 つあります:`FISH_DRAMA3_FP8_EXPERTS=0` または `1` で逆量子化 / FP8 の専門家を強制、`FISH_DRAMA3_CUDA_GRAPH=0` で CUDA graph デコードを無効化します。
## WebUI 推論
### Awesome WebUI
Awesome WebUI は TypeScript で構築されたモダンな Web インターフェースで、より豊富な機能と優れた操作性を提供します。
server Docker イメージにはビルド済みの WebUI が組み込まれており、コンテナ起動後に `http://localhost:8080/ui` を開くだけで利用できます。以下の手順はソースから実行する場合のものです。
**WebUI のビルド:**
ローカルまたはサーバーに Node.js と npm がインストールされている必要があります。
1. `awesome_webui` ディレクトリに移動します:
```bash
cd awesome_webui
```
2. 依存関係をインストールします:
```bash
npm install
```
3. WebUI をビルドします:
```bash
npm run build
```
**バックエンドサーバーの起動:**
ビルド後、プロジェクトルートに戻って API サーバーを起動します(`--compile` は S2-Pro のみ。Drama 3 を読み込む場合は外してください):
```bash
python tools/api_server.py --listen 0.0.0.0:8888 --compile
```
**アクセス:**
サーバー起動後、ブラウザで以下のアドレスにアクセスしてください:
`http://localhost:8888/ui`