Zonos Emotion
Dial In a Mood for Your TTS
- EMOTION
Text-to-speech that sounds human is only half the job. Half the time you want that voice annoyed, or cheerful, or resolutely deadpan - and that's what this node is for. ZonosEmotion takes eight sliders and turns them into an EMOTION vector that feeds ZonosGenerate's emotion input, steering the emotional color of the generated speech. On its own it does nothing. Wired up, it's the difference between a narrator and a performance.
How it works
The node normalizes your eight slider values so they sum to 1.0, then builds a tensor in exactly the order Zyphra's conditioning code expects: happy, sad, disgust, fear, surprise, anger, other, neutral. Because of that normalization, the sliders are relative, not absolute - bumping happy to 1 while the others sit at 0.05 is "mostly happy," not "happy squared." The single output is an EMOTION tensor, and it only means anything once it's plugged into a ZonosGenerate node.
The inputs that matter
Eight FLOAT sliders, 0 to 1, in 0.05 steps. Defaults lean happy. In practice you touch two of them:
- The emotion you actually want - crank it up. Don't be shy.
- neutral - lower it. It's the boring baseline that drags everything else toward flat.
The rest (sad, disgust, fear, surprise, anger, other) can stay at their tiny defaults unless you're chasing something specific.
Here's the honest part: Zonos v0.1's emotion control is subtle, and people have griped that it barely moves the needle even in Zyphra's own demo space. Think of it as a gentle nudge toward a mood rather than acting direction. If you wire it up and hear no difference, push your chosen emotion toward 0.8+, drop neutral near 0, and re-queue. If you still hear nothing, double-check that the EMOTION wire actually lands in ZonosGenerate - with nothing connected, that node just uses a neutral vector and your sliders are decorative.
One genuinely nice property: changing any slider marks the node as changed (it hashes its inputs), so it re-runs the generation. That makes A/B-ing moods on the same script trivial - just click a slider and watch the takes stack up.
Installing it
You can't install this node alone - it ships inside the BuffMcBigHuge/ComfyUI-Zonos pack alongside ZonosGenerate, and it drags in all the same heavy machinery: the Zyphra/Zonos clone, transformers, librosa, phonemizer, and an eSpeak NG install (Windows MSI plus a PHONEMIZER_ESPEAK_LIBRARY environment variable). The easy path is ComfyUI Manager - search "ComfyUI-Zonos" - or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/BuffMcBigHuge/ComfyUI-Zonos
cd ComfyUI-Zonos
git submodule update --init --recursive
pip install -r requirements.txt
git clone https://github.com/Zyphra/Zonos.git
Restart ComfyUI and hit R to refresh the node list. If you see "Missing Node Types: ZonosEmotion" after all that, the pack's import step failed somewhere - make sure the Zonos folder exists inside the pack, re-run the pip install and watch for errors, then restart again. That's the same known gotcha as its sibling node, and the fix is the same.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| happy | FLOAT | 1.000–1 | Happiness intensity |
| sad | FLOAT | 0.050–1 | Sadness intensity |
| disgust | FLOAT | 0.050–1 | Disgust intensity |
| fear | FLOAT | 0.050–1 | Fear intensity |
| surprise | FLOAT | 0.050–1 | Surprise intensity |
| anger | FLOAT | 0.050–1 | Anger intensity |
| other | FLOAT | 0.100–1 | Other emotion intensity |
| neutral | FLOAT | 0.200–1 | Neutral intensity |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| EMOTION | EMOTION | — |