FL FishSpeech TTS
The actual text-to-speech, with mood tags you'll actually use
- fs_model
- fs_reference
- audio
This is the node you came for. Text in, 44.1kHz speech out - and if you've wired up a reference, it speaks in that reference's voice. Everything else in the pack (loader, reference, transcribe) exists to feed this one. The headline feature isn't just that it sounds good; it's that you can put mood tags straight in the text. Hello! [laugh] That's so funny. [whispers] But don't tell anyone. actually delivers a laugh, then a whisper. That's the kind of control that makes a TTS node feel like a toy you want to play with, not a pipeline you fight.
How it works
The DualAR transformer generates speech token-by-token, autoregressively, and the per-token progress bar lets you watch it chew through the sentence. Long text is chunked (chunk_length, default 512 bytes per chunk) and generated iteratively so it doesn't run out of context. Each chunk's output tokens are concatenated, then handed to the DAC codec, which reconstructs the final 44.1kHz mono waveform. If you passed an fs_reference, those prompt tokens plus its transcript condition the whole generation - that's your voice clone.
Inputs that matter
- fs_model (required) - the
FS_MODELoutput from the Model Loader. - text (required, multiline) - the lines to speak, with inline tags. The tooltip also mentions
<|speaker:X|>for multi-speaker work. Emotion tags:[laugh],[whispers],[angry],[sad],[excited]. - fs_reference (optional) - the
FS_REFERENCEfrom Reference Audio. Skip it for plain TTS, wire it for cloning. - seed - 0 means random; set a positive value for a repeatable take. Here's the catch: the community's experience with Fish Speech in ComfyUI is that a locked seed doesn't give you the same reproducibility guarantee image samplers do. Treat seed as a "try again, but biased the same way" knob, and queue a couple of takes when you need a good one.
- temperature / top_p / top_k / repetition_penalty - the sampling controls, defaults 1.0 / 0.9 / 30 / 1.1. Lower temperature for steadier delivery, bump
repetition_penaltytoward 1.2 if the model starts looping words. - chunk_length / max_new_tokens - leave them alone until something's wrong. Shrink
chunk_lengthif long paragraphs degrade, andmax_new_tokens(0 = auto) caps output per chunk if you need to bound generation time.
Output
One output, audio (AUDIO), in standard ComfyUI format. Wire it to Preview Audio to listen in the UI, or Save Audio / Save AudioMP3 to write a file. The example workflow saves MP3s straight from here.
Common issues
- Output varies between runs - the reproducibility complaint again. Fish Speech generation is noisy even with a fixed seed; this is normal, not a bug in your graph.
- "No audio codes generated" - the node throws this when the text comes through empty or mangled. Check the input isn't blank and the reference transcript isn't feeding garbage in.
- First run is slow - that's the model load and, if you enabled compile on the loader, torch.compile doing its one-time warm-up. It's a cost you pay once.
Installing
Same pack routine: ComfyUI Manager β search "FL FishSpeech" β install β restart, or clone into custom_nodes/ and pip install -r requirements.txt. Remember the two once-per-install gotchas: the fish-speech repo clone at ComfyUI/fish-speech/ and huggingface-cli login with access accepted on the gated fishaudio/openaudio-s1-mini page - that ~8GB model download happens on your first Model Loader run.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| fs_model | FS_MODEL | β | |
| text | STRING | Hello, this is a test of the FishSpeech text to speech system. | Text to speak. Use <|speaker:X|> for multi-speaker, [laugh], [whispers] for emotion control. |
| fs_referenceopt | FS_REFERENCE | Optional reference audio encoding for voice cloning. | |
| seedopt | INT | 00β2147483647 | Random seed. 0 = random. |
| temperatureopt | FLOAT | 1.000.1β2 | Sampling temperature. Higher = more varied. v2.0 default is 1.0. |
| top_popt | FLOAT | 0.900.1β1 | Top-p nucleus sampling threshold. v2.0 default is 0.9. |
| top_kopt | INT | 301β100 | Top-k sampling. Limits to top K most likely tokens. |
| repetition_penaltyopt | FLOAT | 1.101β2 | Repetition penalty. Higher = less repetition. |
| chunk_lengthopt | INT | 51250β1000 | Max bytes per text chunk for iterative generation. |
| max_new_tokensopt | INT | 00β4096 | Maximum new tokens to generate per chunk. 0 = auto. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | β |