Nodes/comfyui-tts-pack/FishSpeech TTS
ComfyUI Node

FishSpeech TTS

LLM-Generated Speech With a Reference Voice and a Seed

By Dlight160·Created 3 months ago·Updated 22 days ago· 0
FishSpeech TTS
  • model
  • reference_audio
  • audio
text你好,欢迎使用 Fish Speech。
chunk_length200
max_new_tokens1024
top_p0.80
repetition_penalty1.10
temperature0.80
seed-1
is_japanese
reference_text

This is the second half of the FishSpeech chain: take the TTS_MODEL from FishSpeechModelLoader, type some text, get audio. Add a reference clip and its transcript and it turns into a zero-shot voice cloner - same mechanism, one optional input. Under the hood it builds the exact same ServeTTSRequest that fish-speech's standalone server uses, streams the result in chunks, and hands ComfyUI back an AUDIO dict at the codec's 44.1 kHz rate.

Like the CosyVoice inference node, it never caches (IS_CHANGED returns a timestamp), so every run re-synthesizes. That's fine - FishSpeech on a GPU is quick.

The inputs that matter

  • text - multiline, what to say. Default is a Chinese greeting; you'll replace it.
  • chunk_length - INT 100–300, default 200. This is the iterative-prompting knob: long text is fed in rolling chunks so the model keeps coherence past its context window. Smaller chunks eat less memory on very long text; larger chunks hold long-range delivery better.
  • max_new_tokens - 0–8192, default 1024. Cap per chunk; raise it for long sentences.
  • top_p (default 0.8), temperature (default 0.8), repetition_penalty (default 1.1) - the LLM sampling knobs. Lower temperature/top_p gives a flatter, steadier read; higher is livelier but starts to artifact. The 1.1 repetition penalty is fish-speech's own anti-stutter default - leave it alone until you hear a problem.
  • seed - default -1 (random), or set it for reproducible takes.
  • reference_audio + reference_text - the zero-shot cloning pair. Both or neither: if you attach audio but leave reference_text empty, the node raises a ValueError rather than silently producing garbage. That's the #1 fresh-user stumble with this node.
  • audio - the output, into SaveAudioAdvanced (the sample writes Opus/MP3/FLAC) or any audio sink.

The is_japanese trap, inverted

Every pack gets one, and this pack's is on a different node than you'd expect. In the CosyVoice node, checking is_japanese returns silence. Here it's the opposite: the shipped code returns a silent clip when is_japanese is off - the Python default is true, and the bundled example workflow sets the toggle to false anyway, which per the shipped code is the silent path. Practical rule: keep this toggle on (and keep CosyVoice's off). If your FishSpeech branch ever renders an empty clip, that toggle is the first thing to check, not the model.

When to reach for it

If you only keep one engine from this pack, this is the one for long-form or Japanese/Chinese text - that's FishSpeech's home turf, and the int8 LLaMA runs on far less VRAM than you'd expect. If the priority is tighter voice similarity to a reference, CosyVoice edges it. The pack's example workflow wires both into ConditionalBranchAudio precisely so you can stop arguing about that and just listen.

CategoryTTS/FishSpeech

Inputs (11)

NameTypeDefaultDescription
modelTTS_MODEL
textSTRING你好,欢迎使用 Fish Speech。
chunk_lengthINT200100–300
max_new_tokensINT10240–8192
top_pFLOAT0.800.1–1
repetition_penaltyFLOAT1.100.9–2
temperatureFLOAT0.800.1–1
seedINT-1-1–2147483647
is_japaneseoptBOOLEAN
reference_audiooptAUDIO
reference_textoptSTRING

Outputs (1)

NameTypeDescription
audioAUDIO