Nodes/ComfyUI-Zonos/Zonos Emotion
ComfyUI Node

Zonos Emotion

Dial In a Mood for Your TTS

By BuffMcBigHuge·Created 2 years ago·Updated about a year ago· 72
Zonos Emotion
    • EMOTION
    happy1.00
    sad0.05
    disgust0.05
    fear0.05
    surprise0.05
    anger0.05
    other0.10
    neutral0.20

    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.

    Categoryaudio

    Inputs (8)

    NameTypeDefaultDescription
    happyFLOAT1.000–1Happiness intensity
    sadFLOAT0.050–1Sadness intensity
    disgustFLOAT0.050–1Disgust intensity
    fearFLOAT0.050–1Fear intensity
    surpriseFLOAT0.050–1Surprise intensity
    angerFLOAT0.050–1Anger intensity
    otherFLOAT0.100–1Other emotion intensity
    neutralFLOAT0.200–1Neutral intensity

    Outputs (1)

    NameTypeDescription
    EMOTIONEMOTION