Nodes/ZONOS2 TTS (Emotion)/ZONOS2 Model Loader (Emotion)
ComfyUI Node

ZONOS2 Model Loader (Emotion)

BF16, FP8, and Fitting a TTS Giant in VRAM

By shiwano·Created about a month ago·Updated 26 days ago· 0
ZONOS2 Model Loader (Emotion)
    • zonos2_model
    model
    dtypeauto
    attentionauto
    download_if_missingtrue

    Every good ComfyUI audio pipeline starts with someone hauling a multi-gigabyte model into VRAM, and this is that someone for Zyphra's ZONOS2. The model itself is a heavyweight open-weight TTS - trained on over 6 million hours of multilingual speech, Apache-2.0 weights, and genuinely in the same quality conversation as the paid ElevenLabs tier. The "Emotion" fork you're looking at (shiwano's take on Saganaki22's ComfyUI integration) is where that model meets ComfyUI, and this loader is where every workflow in the pack begins.

    The node does three jobs. It pulls the ZONOS2 language model into memory, bundles in the DAC decoder that turns model tokens into actual audio, and registers everything with ComfyUI's model management so the DynamicVRAM/AIMDO path can page it when your card is small. The single zonos2_model output is a ZONOS2_MODEL bundle - wire it into ZONOS2 Voice Generation (Emotion) or ZONOS2 Voice Clone (Emotion), and that's it. Nothing else in the pack works without this node in front of it.

    The inputs that matter

    Only four inputs, and really only two matter. model picks the checkpoint: the ZONOS2 BF16 preset (about 14.3 GiB) or the ZONOS2 FP8 Mixed preset (about 9.78 GiB). If you have 24 GB or more, BF16 is the honest default. On a 12 or 16 GB card, grab FP8 - it's a memory play, not a speed one, and the README is refreshingly upfront that FP8 isn't guaranteed to generate faster. dtype is auto by default and you can basically leave it; the one rule to remember is the mixed FP8 checkpoint will refuse fp16. attention auto-selects FlashAttention when it's installed and compatible, falling back to PyTorch SDPA otherwise - leave it alone unless you have a specific reason. And download_if_missing (default on) handles first-run setup: it pulls the selected checkpoint and the shared DAC folder from Hugging Face into ComfyUI/models/zonos2/, reusing anything already there. The speaker encoder shows up lazily the first time you actually clone. Locally dropped .safetensors files in that folder also appear in the dropdown.

    Installing the pack

    Installing the pack is the same for all three nodes here: ComfyUI Manager → search "ZONOS2 TTS (Emotion)", or manual clone:

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

    Then restart ComfyUI. The installer only adds lightweight bits (numpy, safetensors, huggingface-hub, accelerate, tqdm) and deliberately leaves torch, torchaudio, and transformers alone. Which brings us to the gotcha that bites more people than anything else: this pack needs Transformers 5.0–5.12 (the README calls 5.3.0 its tested baseline), and plenty of ComfyUI installs are still on 4.x. The loader will fail at load time, and install.py will warn you but won't upgrade you - that's on you to sort out.

    Troubleshooting

    Other failure modes worth knowing. A 404 on first download usually means the HF repo hasn't finished uploading its full asset set - check that dac_44khz/ and speaker_encoder/ sit next to the root checkpoint. An "unsupported FP8 format" error means your node is stale; update and fully restart so Python reloads the current format. And OOM is real: BF16 plus DAC wants roughly 14.7 GiB before you even start generating, so on a squeezed card the FP8 preset and AIMDO paging are your friends. One thing that looks like a bug but isn't: changing model, dtype, or attention deliberately hard-unloads the previous bundle before loading the replacement, to keep stale tensors from lingering.

    Think of this node as the tollbooth. Everything downstream is cheap; getting the model in the door is the whole game.

    CategoryZONOS2 TTS (Emotion)

    Inputs (4)

    NameTypeDefaultDescription
    modelCOMBOCheckpoint in ComfyUI/models/zonos2. The BF16 and mixed FP8 presets download from their own Hugging Face repositories. Mixed FP8 is detected from metadata and uses FP8 only for MoE expert gate/up weights.
    dtypeCOMBOautoRuntime weight dtype. Auto preserves a standard checkpoint's dtype and uses BF16 compute for mixed FP8. Mixed FP8 accepts auto or bf16, not fp16. Changing this setting hard-unloads the previous bundle.
    attentionCOMBOautoAttention backend. Auto selects FlashAttention on compatible CUDA BF16/FP16 systems and otherwise uses PyTorch SDPA. Changing this setting hard-unloads the previous bundle.
    download_if_missingBOOLEANtrueWhen enabled, independently download only missing assets from the selected preset's Hugging Face repository. An existing DAC or speaker encoder is reused, while a missing selected checkpoint is still downloaded. When disabled, every required asset must already exist under ComfyUI/models/zonos2.

    Outputs (1)

    NameTypeDescription
    zonos2_modelZONOS2_MODELLoaded ZONOS2 model bundle containing the native language model and DAC decoder, managed by ComfyUI/AIMDO.