{
  "hf_id": "fishaudio/s2-pro",
  "meta": {
    "title": "Fish Speech S2 Pro",
    "slug": "fish-speech-s2-pro",
    "provider": "Fish Audio",
    "description": "Fish Audio's dual-AR text-to-speech model served via vLLM-Omni, producing 44.1 kHz mono audio with optional voice cloning, through the OpenAI /v1/audio/speech API.",
    "date_added": "2026-06-17",
    "date_updated": "2026-06-15",
    "tasks": [
      "omni"
    ],
    "related_recipes": [
      "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
      "openbmb/VoxCPM2",
      "bosonai/higgs-audio-v3-tts-4b"
    ]
  },
  "model": {
    "model_id": "fishaudio/s2-pro",
    "min_vllm_version": "0.19.0",
    "architecture": "dense",
    "parameter_count": "4.6B",
    "active_parameters": "4.6B",
    "context_length": 0,
    "base_args": [
      "--omni"
    ],
    "base_env": {},
    "install": {
      "pip": {
        "command": "uv venv\nsource .venv/bin/activate\nuv pip install -U vllm --torch-backend auto"
      },
      "docker": {
        "command": "docker pull vllm/vllm-openai:latest"
      },
      "extras": [
        {
          "note": "vLLM-Omni provides the TTS serving backend and the `--omni` serve path. See the installation guide for pre-built wheels or building from source.",
          "command": "uv pip install git+https://github.com/vllm-project/vllm-omni.git"
        },
        {
          "note": "fish-speech supplies the DAC codec used by S2 Pro (pulls pyaudio, which needs PortAudio system libs: apt-get install -y libportaudio2 portaudio19-dev)",
          "command": "uv pip install fish-speech"
        }
      ]
    }
  },
  "omni": {
    "tasks": [
      {
        "id": "t2a",
        "label": "Text → Speech",
        "endpoint": "/v1/audio/speech",
        "description": "Fish Speech S2 Pro TTS via /v1/audio/speech (44.1 kHz mono)",
        "curl": "curl -X POST http://localhost:8000/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"model\": \"fishaudio/s2-pro\",\n    \"input\": \"Hello, how are you?\",\n    \"voice\": \"default\",\n    \"response_format\": \"wav\"\n  }' --output output.wav\n"
      }
    ]
  },
  "features": {},
  "opt_in_features": [],
  "variants": {
    "default": {
      "precision": "bf16",
      "vram_minimum_gb": 48,
      "description": "BF16 weights — single GPU (model loads ~48.3 GiB; reference run on 1x A800 80 GB)"
    }
  },
  "hardware_overrides": {},
  "guide": "## Overview\n\n[Fish Speech S2 Pro](https://huggingface.co/fishaudio/s2-pro) is Fish Audio's\ndual-AR text-to-speech model, served through **vLLM-Omni** with the\nOpenAI-compatible `/v1/audio/speech` API. It produces **44.1 kHz mono** audio\nand supports zero-shot voice cloning from a reference clip + its transcript.\n\n## Prerequisites\n\n- **Hardware**: a single CUDA GPU. Reference run: 1x A800 80 GB — the model\n  loads at ~48.3 GiB and peaks ~48.9 GiB during inference. A two-GPU profile\n  (`fish_qwen3_omni_2gpu.yaml`) is available for higher concurrency.\n- **vLLM-Omni** targeting vLLM >= 0.19.\n- **`fish-speech`** for the DAC codec. It depends on `pyaudio`, which needs\n  PortAudio system libraries:\n\n  ```bash\n  # Ubuntu/Debian\n  sudo apt-get update && sudo apt-get install -y libportaudio2 portaudio19-dev\n  ```\n\n## Installation\n\n```bash\nuv venv && source .venv/bin/activate\nuv pip install git+https://github.com/vllm-project/vllm-omni.git\nuv pip install fish-speech\n```\n\n### Kvcache attention fast path\n\nS2 Pro uses a Triton decode-only kvcache-attention fast path by default on\nCUDA builds. Toggle it with `VLLM_OMNI_FISH_KVCACHE_ATTN`:\n\n```bash\n# Verify availability\npython -c \"from vllm_omni.attention import fish_kvcache_attn; print(fish_kvcache_attn.is_available()); print(fish_kvcache_attn.load_error())\"\n\nexport VLLM_OMNI_FISH_KVCACHE_ATTN=0          # disable the fast path\n# VLLM_OMNI_FISH_KVCACHE_ATTN=required        # fail fast if it can't load\n```\n\n## Launch the server\n\nThe deploy config (`vllm_omni/deploy/fish_qwen3_omni.yaml`) is auto-discovered\nfrom `model_type=fish_qwen3_omni`:\n\n```bash\n# Single GPU\nvllm serve fishaudio/s2-pro --omni --port 8000\n```\n\n```bash\n# Two GPUs (Stage0 Slow/Fast AR on GPU 0, Stage1 DAC decoder on GPU 1)\nCUDA_VISIBLE_DEVICES=0,1 vllm serve fishaudio/s2-pro --omni --port 8000 \\\n  --deploy-config vllm_omni/deploy/fish_qwen3_omni_2gpu.yaml\n```\n\n## Client usage\n\n### Basic TTS\n\n```bash\ncurl -X POST http://localhost:8000/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\": \"fishaudio/s2-pro\", \"input\": \"Hello, how are you?\", \"voice\": \"default\", \"response_format\": \"wav\"}' \\\n  --output output.wav\n```\n\n### Voice cloning (reference audio + transcript)\n\n```bash\ncurl -X POST http://localhost:8000/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"model\": \"fishaudio/s2-pro\",\n    \"input\": \"Hello, this is a cloned voice.\",\n    \"voice\": \"default\",\n    \"ref_audio\": \"https://example.com/reference.wav\",\n    \"ref_text\": \"Transcript of the reference audio.\"\n  }' --output cloned.wav\n```\n\n## Known limitations\n\n- Output is **44.1 kHz mono** WAV.\n- Voice cloning requires **both** `ref_audio` and `ref_text`.\n\n## References\n\n- [Model card](https://huggingface.co/fishaudio/s2-pro)\n- [vLLM-Omni Fish Speech example](https://github.com/vllm-project/vllm-omni/tree/main/examples/online_serving/text_to_speech/fish_speech)\n- Benchmarks: vllm-project/vllm-omni [#2515](https://github.com/vllm-project/vllm-omni/pull/2515) (H100x2), [#3323](https://github.com/vllm-project/vllm-omni/pull/3323) (H20x2)\n",
  "source": {
    "source": "vllm-omni",
    "repo": "vllm-project/vllm-omni",
    "ref": "main",
    "sha": "beeedd99df33b432b7cf74caa8b28e1893124827",
    "path": "recipes/models/fishaudio/s2-pro.yaml",
    "edit_url": "https://github.com/vllm-project/vllm-omni/edit/main/recipes/models/fishaudio/s2-pro.yaml",
    "overlays": []
  }
}