FishSpeech Model Loader
An LLM That Reads Aloud, int8 by Default
- model
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, defaultfs-int8-20260427_182050. Same resolution as the CosyVoice loader: relative tomodels/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_modelorcpu. Running the codec on CPU is a real option when VRAM is tight; the decode is the lighter half.precision-bfloat16(default) orfloat16.compile- BOOLEAN, default true. That default is why your first run looks frozen: it triggerstorch.compileon load. Later runs are faster; flip it off if you'd rather trade speed for a clean startup.model- TTS_MODEL, intoFishSpeechTTS.
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.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| llama_checkpoint_pathopt | STRING | fs-int8-20260427_182050 | relative path to models/tts, or absolute path |
| deviceopt | COMBO | auto | 4 options: auto, cuda, mps, cpu |
| decoder_deviceopt | COMBO | same_as_model | 2 options: same_as_model, cpu |
| precisionopt | COMBO | bfloat16 | 2 options: bfloat16, float16 |
| compileopt | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | TTS_MODEL | — |