Nodes/ZONOS2 TTS (Emotion)/ZONOS2 Voice Generation (Emotion)
ComfyUI Node

ZONOS2 Voice Generation (Emotion)

Clean TTS Without a Reference Voice

By shiwano·Created about a month ago·Updated 27 days ago· 0
ZONOS2 Voice Generation (Emotion)
  • zonos2_model
  • audio
textHello! This is ZONOS2 running natively inside ComfyUI.
max_new_tokens1024
temperature1.15
top_k106
top_p0.00
min_p0.18
repetition_window50
repetition_penalty1.20
repetition_codebooks8
speaking_ratedefault
loudness_lufsdefault
estimated_snrdefault
maximum_pausedefault
estimated_bandlimit_hzdefault
leading_silencedefault
trailing_silence3: 0.25-0.5
seed0

Sometimes you don't want to clone anyone. You just need a clean, natural voice to narrate a video or read some text aloud, and you want it to not sound like a GPS. That's the job of ZONOS2 Voice Generation (Emotion) - the simplest node in this pack and, because of that, the one worth trying first.

Here's the thing about this fork: the emotion controls only live on the Voice Clone node. Voice Generation has no reference audio, so there's no speaker vector to shift - no emotion dropdown, no emotion_cfg_scale. That's a deliberate design choice, not a missing feature. What you do get is ZONOS2's byte-level UTF-8 text handling (no transcript needed) across its roughly 40 supported languages, plus the full conditioning and sampling surface.

What it does

The node takes zonos2_model from the Model Loader and text (multiline), and returns mono audio as native ComfyUI AUDIO at 44.1 kHz. Wire the output into a Save Audio node, or feed it forward into an audio-driven avatar like MultiTalk or InfiniteTalk if you're building a talking head - that's the classic local pipeline in the audio ecosystem.

The controls that matter

For a first run, ignore almost everything. max_new_tokens (1024) caps how much speech you get - raise it if the model stops early, since it can emit an end-of-audio token before the cap. temperature 1.15, top_k 106, and min_p 0.18 are ZONOS2's official defaults and they're genuinely good; drop the temperature toward 0.8–1.0 if you want more stability across runs. top_p defaults to 0 (disabled) because this model uses Min-P, not Top-P - don't feel obligated to switch it on. seed is the one you'll touch daily: any positive value makes a run repeatable for identical inputs, while 0 means "surprise me."

Then there are the seven conditioning dropdowns: speaking_rate, loudness_lufs, estimated_snr, maximum_pause, estimated_bandlimit_hz, leading_silence, and trailing_silence. Each is a set of buckets the model was trained on, and "default" leaves that axis unconditioned. Trailing silence already defaults to the 0.25–0.5 s bucket, which is the official recommendation. Most people never touch the rest, but speaking_rate is the sleeper: pick a lower bucket and ZONOS2 reads slower, the closest thing this node has to a pace control.

Installing

Install and gotchas are identical to the loader: same pack, so ComfyUI Manager → search "ZONOS2 TTS (Emotion)", or clone plus the install.py helper, then restart:

cd ComfyUI/custom_nodes
git clone https://github.com/shiwano/zonos2-tts-comfyui-emotion.git
../venv/bin/python zonos2-tts-comfyui-emotion/install.py

Same Transformers 5.0–5.12 requirement (the #1 install killer for this pack - 4.x environments won't run it), same first-run multi-gigabyte model download, same 44.1 kHz mono output. And yes, the node name sets up a small letdown: "Generation" makes people expect emotion, but this is the plain-vanilla branch. If that disappoints you, the Voice Clone node is where this pack's actual party trick lives.

Reach for this node when you want a voice that just works - clean, expressive, multilingual - without hunting for a reference clip. It's the boring half of the pack, and boring is a feature.

CategoryZONOS2 TTS (Emotion)

Inputs (18)

NameTypeDefaultDescription
zonos2_modelZONOS2_MODELConnect the zonos2_model output from ZONOS2 Model Loader.
textSTRINGHello! This is ZONOS2 running natively inside ComfyUI.UTF-8 text to synthesize.
max_new_tokensINT102432–6000Maximum DAC-code frames the model may generate. More frames allow longer speech but increase generation time and KV-cache memory. Generation can stop earlier when ZONOS2 emits end-of-audio.
temperatureFLOAT1.150–2Sampling randomness. Lower values are steadier; higher values add variation but can reduce clarity. 0 uses greedy sampling. The official ZONOS2 default is 1.15.
top_kINT1060–1026Keep only the K most likely tokens in each audio codebook before sampling. 0 disables Top-K filtering. The official default is 106.
top_pFLOAT0.000–1Keep the smallest token set whose combined probability reaches this value. 0 disables Top-P filtering. ZONOS2 normally uses Min-P instead.
min_pFLOAT0.180–1Remove tokens whose probability is below this fraction of the most likely token. 0 disables Min-P. The official default is 0.18.
repetition_windowINT500–512Number of recent generated frames checked for repeated audio tokens. 0 disables repetition tracking.
repetition_penaltyFLOAT1.201–2Reduces the probability of recently generated tokens to discourage loops. 1.0 disables the penalty. The official default is 1.2.
repetition_codebooksINT8-1–9Apply repetition penalty to this many codebooks starting from codebook 0. -1 applies it to all 9; 0 disables it for every codebook. The official default is 8.
speaking_rateCOMBOdefaultOptional ZONOS2 speaking-rate conditioning in cleaned UTF-8 bytes per second. Lower ranges generally produce slower speech. Default leaves speaking rate unconditioned.
loudness_lufsCOMBOdefaultOptional target integrated loudness in LUFS. More-negative ranges are quieter; less-negative ranges are louder. Default leaves loudness unconditioned.
estimated_snrCOMBOdefaultOptional estimated signal-to-noise ratio in dB. Higher ranges bias toward cleaner audio; lower ranges can reproduce noisier recording characteristics. Default leaves SNR unconditioned.
maximum_pauseCOMBOdefaultOptional maximum internal pause duration in seconds. Lower ranges favor tighter delivery; higher ranges permit longer pauses. Default leaves maximum pause unconditioned.
estimated_bandlimit_hzCOMBOdefaultOptional estimated recording bandlimit in Hz. Higher ranges bias toward wider-band, brighter audio; lower ranges can sound more bandwidth-limited. Default leaves bandlimit unconditioned.
leading_silenceCOMBOdefaultOptional amount of silence before speech begins. Default leaves leading silence unconditioned.
trailing_silenceCOMBO3: 0.25-0.5Requested silence after speech ends. Bucket 3 (0.25-0.5 seconds) is the official ZONOS2 default. Select default to leave it unconditioned.
seedINT00–9223372036854776000Sampling seed. A positive value makes generation repeatable for identical inputs and settings. 0 uses the current random state.

Outputs (1)

NameTypeDescription
audioAUDIOGenerated mono speech as native ComfyUI AUDIO at 44.1 kHz.