ZONOS2 Voice Generation (Emotion)
Clean TTS Without a Reference Voice
- zonos2_model
- audio
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.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| zonos2_model | ZONOS2_MODEL | Connect the zonos2_model output from ZONOS2 Model Loader. | |
| text | STRING | Hello! This is ZONOS2 running natively inside ComfyUI. | UTF-8 text to synthesize. |
| max_new_tokens | INT | 102432–6000 | Maximum 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. |
| temperature | FLOAT | 1.150–2 | Sampling 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_k | INT | 1060–1026 | Keep only the K most likely tokens in each audio codebook before sampling. 0 disables Top-K filtering. The official default is 106. |
| top_p | FLOAT | 0.000–1 | Keep the smallest token set whose combined probability reaches this value. 0 disables Top-P filtering. ZONOS2 normally uses Min-P instead. |
| min_p | FLOAT | 0.180–1 | Remove tokens whose probability is below this fraction of the most likely token. 0 disables Min-P. The official default is 0.18. |
| repetition_window | INT | 500–512 | Number of recent generated frames checked for repeated audio tokens. 0 disables repetition tracking. |
| repetition_penalty | FLOAT | 1.201–2 | Reduces the probability of recently generated tokens to discourage loops. 1.0 disables the penalty. The official default is 1.2. |
| repetition_codebooks | INT | 8-1–9 | Apply 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_rate | COMBO | default | Optional ZONOS2 speaking-rate conditioning in cleaned UTF-8 bytes per second. Lower ranges generally produce slower speech. Default leaves speaking rate unconditioned. |
| loudness_lufs | COMBO | default | Optional target integrated loudness in LUFS. More-negative ranges are quieter; less-negative ranges are louder. Default leaves loudness unconditioned. |
| estimated_snr | COMBO | default | Optional 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_pause | COMBO | default | Optional maximum internal pause duration in seconds. Lower ranges favor tighter delivery; higher ranges permit longer pauses. Default leaves maximum pause unconditioned. |
| estimated_bandlimit_hz | COMBO | default | Optional 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_silence | COMBO | default | Optional amount of silence before speech begins. Default leaves leading silence unconditioned. |
| trailing_silence | COMBO | 3: 0.25-0.5 | Requested silence after speech ends. Bucket 3 (0.25-0.5 seconds) is the official ZONOS2 default. Select default to leave it unconditioned. |
| seed | INT | 00–9223372036854776000 | Sampling seed. A positive value makes generation repeatable for identical inputs and settings. 0 uses the current random state. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | Generated mono speech as native ComfyUI AUDIO at 44.1 kHz. |