Fish S2 TTS
The 4B open TTS that makes ElevenLabs feel optional
- audio
If you've been making do with Chatterbox or F5-TTS and still hearing the seams, this is the node that closes most of them. Fish S2 TTS is a ComfyUI wrapper around Fish Audio's S2 Pro, a 4-billion-parameter text-to-speech model trained on 10M+ hours across 83 languages - and it's the first open TTS in a while that makes the "local vs ElevenLabs" question actually awkward. The pack's README calls it "best TTS among open and closed source," which is marketing, but the model genuinely clears the old open bar on prosody and emotion control.
What makes it different from the Kokoro/Chatterbox crowd is inline control. You don't tune a global "emotion" slider; you drop free-form tags straight into your text - [whisper], [laugh], [excited], [sarcastic tone], even [professional broadcast tone] - and the model acts on them in place. The S2 family uses a dual-autoregressive architecture: it rolls out acoustic tokens, then converts them to audio through a bundled descript-audio-codec, so a tag mid-sentence actually changes the delivery, not just the mood of the whole clip. For narration or character lines, that one feature is worth the install by itself.
The inputs that matter
Most of the panel you can leave alone. The ones a beginner actually touches:
- model_path - pick from eight entries:
s2-pro(full, ~24GB VRAM),s2-pro-fp8(~20GB, wants an Ada/Blackwell card), and the two bitsandbytes on-the-fly quants,s2-pro-bnb-int8(~18GB) ands2-pro-bnb-nf4(~16GB). Each also appears with an "(auto download)" suffix, which fetches the weights from HuggingFace intoComfyUI/models/fishaudioS2/on first run. If you have a 16GB card, the NF4 option is why this node is usable at all. - text - your script, with
[tag]markers anywhere you want emphasis. The defaultHello! [excited] This is Fish Audio S2.shows the pattern. - language - leave on
auto; it detects. Only set it if the model keeps guessing wrong. - temperature / top_p - both default to 0.8. Drop temperature toward 0.4 if you want dead-stable repeats of the same line.
Two settings to be careful with: attention (changing it unloads and reloads the model - pick sage_attention only if you've actually installed the package, else keep auto) and compile_model (~10x speedup after warmup, but Linux-only, and pin max_new_tokens to a fixed value or every longer sentence triggers a recompile).
The single output is audio (AUDIO) at 44.1kHz - wire it into a SaveAudio node to get a file, or straight into a lip-sync stage if you're building a talking head.
Installing it
ComfyUI Manager, search "FishAudioS2", install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Saganaki22/ComfyUI-FishAudioS2.git
Then restart ComfyUI once - the pack auto-installs its dependencies at startup, including descript-audio-codec and descript-audiotools with --no-deps so their protobuf<5 constraint doesn't wreck shared environments. One hard rule from the README: never run pip install git+https://github.com/fishaudio/fish-speech. fish-speech is bundled inside the pack; that command downgrades PyTorch and can break your whole ComfyUI.
Where people get burned
This is a heavy model. At ~24GB for full precision it's not a casual download, and the community is already asking whether 8GB cards can run it at all (realistically: only via NF4, and it'll be slow). If you hit out-of-memory, the fixes in order are: pick s2-pro-bnb-nf4, set keep_model_loaded off, and lower chunk_length. Two classic startup failures are worth knowing: a MockDecoder() takes no arguments error means your torchaudio is 2.9+ and the pack is out of date (git pull - fixed in v0.3.6), and if another custom node bundles its own fish_speech folder (mixlab-nodes does), they can collide via sys.path.
One more honest note: Fish Audio Research license - research and non-commercial use only. Commercial use requires a separate license from Fish Audio, same as the model weights. This is the same non-commercial trap the KB flags for Flux Dev and F5-TTS: fine for personal pipelines, a legal wall if you wanted to ship something. For everything that's not a product, it's the best TTS you can run inside ComfyUI right now.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| model_path | COMBO | S2-Pro checkpoint folder name. Place model folders in ComfyUI/models/fishaudioS2/ | |
| text | STRING | Hello! [excited] This is Fish Audio S2. | Text to synthesise. Supports inline emotion tags like [laugh], [whisper], [pause], [excited], [sad], [angry], [volume up], [pitch up], etc. |
| language | COMBO | auto | Language hint. 'auto' lets the model detect it. |
| device | COMBO | auto | Compute device. 'auto' picks CUDA > MPS > CPU. |
| precision | COMBO | auto | Model precision. 'auto' picks bfloat16 for full model, float16 for quantized model. bfloat16 recommended for CUDA. |
| attention | COMBO | auto | Attention kernel. 'auto' uses the model default (sdpa/flash). 'sdpa' forces PyTorch SDPA. 'flash_attention' forces FlashAttention via SDPBackend. 'sage_attention' monkey-patches with SageAttention (requires sageattention). BNB models (s2-pro-bnb-int8/nf4) always use sdpa regardless of this setting. Changing this unloads and reloads the model. |
| max_new_tokens | INT | 00–4096 | Maximum acoustic tokens to generate. 0 = auto (no limit, model decides). |
| chunk_length | INT | 200100–400 | Chunk length for iterative synthesis (100-400). Lower = faster first audio, slightly lower quality. Higher = better prosody across long sentences. |
| temperature | FLOAT | 0.800.1–1 | Sampling temperature. Lower = more deterministic output. |
| top_p | FLOAT | 0.800.1–1 | Top-p nucleus sampling cutoff. |
| repetition_penalty | FLOAT | 1.100.9–2 | Penalises repeated tokens. Higher = less repetition. |
| seed | INT | 00–2147483647 | Random seed. |
| keep_model_loaded | BOOLEAN | true | ON = model stays in VRAM between runs (faster). OFF = model unloaded after each run (frees VRAM). |
| offload_to_cpu | BOOLEAN | false | After generation, move the model to CPU instead of keeping it in VRAM. Frees VRAM while avoiding the full reload penalty. Slower than keep_model_loaded but faster than a cold load. Ignored if keep_model_loaded is OFF. |
| compile_model | BOOLEAN | false | Enable torch.compile (~10x speedup after warmup). First run is slow while compiling. Not supported on Windows. For best results pin max_new_tokens to a fixed value — each new larger length triggers a recompile. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |