Nodes/comfyui-tts-pack/FishSpeech Model Loader
ComfyUI Node

FishSpeech Model Loader

An LLM That Reads Aloud, int8 by Default

By Dlight160·Created 3 months ago·Updated 22 days ago· 0
FishSpeech Model Loader
    • model
    llama_checkpoint_pathfs-int8-20260427_182050
    deviceauto
    decoder_devicesame_as_model
    precisionbfloat16
    compiletrue

    FishSpeech (fishaudio) is the other engine in this pack, and it works differently from CosyVoice. Instead of an acoustic model bolted onto a vocoder, it's an LLM pipeline: a text2semantic LLaMA converts text into semantic tokens, then a DAC audio codec decodes those tokens into a waveform. That "small language model learns to speak" design is why it's good at reference-audio voice cloning from very little data, and why it's one of the few open TTS that does Chinese and Japanese well. It barely surfaces in the English image/video threads - this pack is largely how it reaches ComfyUI at all.

    This loader pulls both halves into one TTS_MODEL: it starts a thread-safe generation queue for the LLaMA checkpoint and loads the DAC decoder (expects a codec.pth, config modded_dac_vq) from the same folder. Then FishSpeechTTS does the generating.

    Inputs

    • llama_checkpoint_path - STRING, default fs-int8-20260427_182050. Same resolution as the CosyVoice loader: relative to models/tts/, or an absolute path.
    • device - auto / cuda / mps / cpu, default auto. Auto picks CUDA, then MPS, then CPU - so this is one of the few packs that explicitly acknowledges Macs.
    • decoder_device - same_as_model or cpu. Running the codec on CPU is a real option when VRAM is tight; the decode is the lighter half.
    • precision - bfloat16 (default) or float16.
    • compile - BOOLEAN, default true. That default is why your first run looks frozen: it triggers torch.compile on load. Later runs are faster; flip it off if you'd rather trade speed for a clean startup.
    • model - TTS_MODEL, into FishSpeechTTS.

    The checkpoint situation

    The default fs-int8-20260427_182050 is an int8-quantized LLaMA snapshot the pack author pinned - a deliberate memory play, since the LLM is the big half of FishSpeech and int8 keeps it on a consumer card. You need a folder of that name (or an absolute path to any fish-speech checkpoint) inside models/tts/, containing the LLaMA weights and a codec.pth next to them. Missing codec.pth is the classic failure: the loader part-succeeds and then TTS spits decoder errors, because the codec path is derived from the checkpoint path rather than asked for separately.

    Under the hood (the good part)

    The loader is doing real work to keep you sane: engines are cached by (checkpoint, device, precision, compile), and loading a new config unloads the previous engine and frees its VRAM, so switching models mid-session doesn't leak memory. It also patches FishSpeech's request path to respect your compile/device choices, and wraps codec decoding with device synchronization plus a fallback that drops the decoder to CPU when it hits the infamous CUDNN_STATUS_NOT_INITIALIZED crash on GPU. That last one is the pack quietly fixing a failure you'd otherwise be googling.

    Install is the shared pack story: clone Dlight160/comfyui-tts-pack with --recursive (fish-speech ships as a submodule), Python 3.12 env, and the pack's requirements add lightning, descript-audio-codec, tiktoken, opencc and friends on top of ComfyUI's stack. The loader's own defaults are sensible; the only thing you'll realistically change is llama_checkpoint_path if your checkpoint lives elsewhere.

    CategoryTTS/FishSpeech

    Inputs (5)

    NameTypeDefaultDescription
    llama_checkpoint_pathoptSTRINGfs-int8-20260427_182050relative path to models/tts, or absolute path
    deviceoptCOMBOauto4 options: auto, cuda, mps, cpu
    decoder_deviceoptCOMBOsame_as_model2 options: same_as_model, cpu
    precisionoptCOMBObfloat162 options: bfloat16, float16
    compileoptBOOLEANtrue

    Outputs (1)

    NameTypeDescription
    modelTTS_MODEL