Lisa Zonos Text to Speech
Zonos TTS from 30 seconds of audio
- audio_path
You've built the talking-head workflow, MMAudio is humming along, and now you need a voice for it. That's where this node comes in: ZonosTextToSpeech (shown in ComfyUI as "Lisa Zonos Text to Speech") drops Zyphra's open-weight Zonos TTS model into your graph, so you can synthesize speech and clone a voice from a reference clip without touching a cloud API or signing up for anything. The name is a lie in the best way - it calls no API, needs no key, and runs entirely on your machine.
What's actually happening under the hood
Zonos is Zyphra's open-weight text-to-speech model, released early 2025 and trained on roughly 200k hours of speech. It turns your text into speech tokens (via a DAC audio codec) and decodes them back to 44kHz WAV audio. The interesting part is the voice cloning: instead of a separate fine-tune, Zonos builds a speaker embedding from a few seconds of reference audio and feeds it in as conditioning. This node wires all of that up in one class - generate_speech handles model loading, conditioning, generation, and saving in a single pass.
The node ships with a vendored copy of the Zonos library, and its caching logic is genuinely nice: the first run downloads the model from Hugging Face and saves it as config.json + model.safetensors into ComfyUI/models/TTS/Zonos/, so every run after that loads from disk instead of re-downloading. If the cache is ever incomplete or corrupt, the code falls back to a direct download rather than exploding.
The inputs that actually matter
You get five, and you'll touch three of them regularly:
- text - what to synthesize. Obvious, but worth saying: this is the whole point.
- model_name - your pick of
Zyphra/Zonos-v0.1-transformer(default) orZyphra/Zonos-v0.1-hybrid. The README bills the transformer as faster and lighter and the hybrid as higher quality, but Zyphra's own launch post points the other way: the hybrid's transformer-plus-Mamba backbone is what makes it fast. Treat the transformer as the safe default and the hybrid as the "give me the good stuff, I have VRAM" option. - audio_file - a filesystem path to a reference WAV for voice cloning. This is a STRING, not a file-upload widget - paste the path (something like
C:/voices/me.wav). Leave it empty and you get generic zero-shot TTS instead. Clean speech, WAV, under 30 seconds, as the README says. - language -
en-usorja-jp. That's all this node exposes. Zonos itself also speaks Chinese, French, and German; this wrapper doesn't let you reach them, which is a minor bummer if you need them. - cfg_scale - 1.0–10.0, default 2.0. Lower is more conservative and stable; crank it up for more expressive (and riskier) delivery. The default is a fine place to live.
The one output
audio_path, a plain string pointing at the freshly written file in ComfyUI/output/, named zonos_YYYYMMDD-HHMMSS_UUID.wav. ComfyUI has no built-in "play this wav" node, so most people wire that path into a preview/save audio node from a pack like VideoHelperSuite, or just open the file themselves.
Installing it
ComfyUI Manager should find it by searching "ComfyUI Zonos TTS Node." If you'd rather go manual:
cd ComfyUI/custom_nodes/
git clone https://github.com/BahaC/ComfyUI-ZonosTTS.git
cd ComfyUI-ZonosTTS
pip install -r requirements.txt
Then restart ComfyUI. The requirements pull torch, torchaudio, safetensors, huggingface_hub, and the zonos package itself (which drags in the usual HF stack, including the DAC autoencoder from descript/dac_44khz). One bright spot: the vendored Zonos gracefully falls back to a pure-PyTorch backbone if mamba_ssm isn't installed, so you don't get stuck compiling a C++ kernel just to run the transformer model. You do need a GPU with a few GB of VRAM to use this comfortably.
Where people get burned
First run is slow - the model download is over 3 GB (each of the two variants is roughly 3.2–3.3 GB, so testing both means ~6.5 GB of downloads) and the first generation does a lot of setup. That's expected, not a hang; every subsequent run is fast thanks to the caching. The classic failures: the reference audio has background noise or music (the embedding gets muddier), the path string is wrong or points to an mp3 (it needs WAV), and - the eternal ComfyUI one - CUDA OOM, which the README's own troubleshooting tells you to fix by dropping to the transformer model and freeing GPU memory. If a workflow that uses another Zonos pack says ZonosEmotion/ZonosGenerate are missing, that's a different pack entirely; this node is only the one class.
Give it 30 seconds of clean speech, a prompt, and you've got a cloned voice sitting in your graph next to your video. Not bad for zero accounts.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Hello, world! | — |
| language | COMBO | en-us | 2 options: en-us, ja-jp |
| model_name | COMBO | Zyphra/Zonos-v0.1-transformer | 2 options: Zyphra/Zonos-v0.1-transformer, Zyphra/Zonos-v0.1-hybrid |
| audio_file | STRING | — | |
| cfg_scale | FLOAT | 2.01–10 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio_path | STRING | — |