ComfyUI Node

Fish S2 TTS

The 4B open TTS that makes ElevenLabs feel optional

By Saganaki22·Created 6 months ago·Updated 4 months ago· 287
Fish S2 TTS
    • audio
    model_path
    textHello! [excited] This is Fish Audio S2.
    languageauto
    deviceauto
    precisionauto
    attentionauto
    max_new_tokens0
    chunk_length200
    temperature0.80
    top_p0.80
    repetition_penalty1.10
    seed0
    keep_model_loadedtrue
    offload_to_cpufalse
    compile_modelfalse

    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) and s2-pro-bnb-nf4 (~16GB). Each also appears with an "(auto download)" suffix, which fetches the weights from HuggingFace into ComfyUI/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 default Hello! [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.

    CategoryFishAudioS2

    Inputs (15)

    NameTypeDefaultDescription
    model_pathCOMBOS2-Pro checkpoint folder name. Place model folders in ComfyUI/models/fishaudioS2/
    textSTRINGHello! [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.
    languageCOMBOautoLanguage hint. 'auto' lets the model detect it.
    deviceCOMBOautoCompute device. 'auto' picks CUDA > MPS > CPU.
    precisionCOMBOautoModel precision. 'auto' picks bfloat16 for full model, float16 for quantized model. bfloat16 recommended for CUDA.
    attentionCOMBOautoAttention 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_tokensINT00–4096Maximum acoustic tokens to generate. 0 = auto (no limit, model decides).
    chunk_lengthINT200100–400Chunk length for iterative synthesis (100-400). Lower = faster first audio, slightly lower quality. Higher = better prosody across long sentences.
    temperatureFLOAT0.800.1–1Sampling temperature. Lower = more deterministic output.
    top_pFLOAT0.800.1–1Top-p nucleus sampling cutoff.
    repetition_penaltyFLOAT1.100.9–2Penalises repeated tokens. Higher = less repetition.
    seedINT00–2147483647Random seed.
    keep_model_loadedBOOLEANtrueON = model stays in VRAM between runs (faster). OFF = model unloaded after each run (frees VRAM).
    offload_to_cpuBOOLEANfalseAfter 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_modelBOOLEANfalseEnable 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)

    NameTypeDescription
    audioAUDIO