Zura LongCat Voice
Local voice cloning that runs in its own little Python bunker
- reference_audio
- audio
- run_report
Local voice cloning in ComfyUI usually means fighting a dependency tree until one of your other nodes breaks. This one sidesteps that entirely: LongCat-AudioDiT 3.5B runs in a separate Python 3.11 environment that the pack's setup script builds for you, and ComfyUI's own environment gains nothing but SoundFile.
The trade is real but fair - an install step you have to run deliberately, in exchange for a voice model that doesn't take your working ComfyUI down with it.
What it does
Two modes, one node:
- Clone a voice - you supply one clean recording of a speaker plus its exact transcript, and it says something new in that voice.
- Text to speech - no reference at all; it just speaks your script.
The accuracy of the clone depends almost entirely on that transcript being right. The tooltip is blunt: "Exact words in the reference audio, including any fillers." Include the "um"s. A transcript that doesn't match the audio is the number one cause of a clone that sounds like a stranger doing an impression.
How it works
When you hit Run, the node writes a job folder and launches longcat_runtime/worker.py in the isolated interpreter as a subprocess. Before it does, it unloads ComfyUI's own models and empties the cache - that's the GPU hand-off, and it's why a LongCat run looks like ComfyUI briefly doing nothing. It then polls the child process, honours Stop/interrupt, and cleans up the process on exit.
Everything the run produces is saved, and nothing is overwritten. Each run gets a new folder under output/zura_voice/<project>_<timestamp>_<id>/:
voice.wav- 24-bit PCM, 24 kHz mono, the listening copy.master_float32.wav- the unprocessed float samples, also what the node returns.chunk_001.wav,chunk_002.wav, … for long scripts.script.txt,job.json,report.json,worker.log, plus the retained reference recording in clone mode.
Long scripts are split at natural sentence boundaries, never truncated to fit a window; each chunk reuses the same reference with 150 ms inserted between parts. That prevents silent text loss, but it doesn't guarantee prosody across a join - check every seam.
Inputs and outputs
mode- Clone a voice or Text to speech.script- the words to generate.reference_transcript- exact words in the reference clip. Ignored in TTS mode.pace- default 1.0, range 0.5–2.0. Faster or slower synthesis, not pitch. Not a duration guarantee.seed- default 8923. Fixed for repeatable takes; subsequent chunks use consecutive seeds.project- an output label. "not a path" - the node rejects anything with a slash, colon or backslash in it.reference_audio(optional, lazy) - one clean speaker, 8–20 seconds to start. In TTS mode the branch isn't even evaluated.audio-AUDIO, into Preview Audio or a video model's guide input.run_report-STRING, the per-run summary text.
Install
Install the pack first, then run the setup helper once:
cd ComfyUI/custom_nodes/ComfyUI_zura_nodes
python setup_longcat.py --install
python setup_longcat.py --check
The helper creates an isolated Python 3.11 environment, then downloads the pinned LongCat model and tokenizer (default %USERPROFILE%\ZuraLongCat; --root moves it). It never installs packages itself - if dependencies are missing it prints the exact uv pip install commands, then you rerun it. Importing the node downloads nothing, and the Registry package bundles no weights.
Two warnings: CUDA with BF16 support is required, and this was tested on Windows with an RTX 4080 16 GB - smaller GPUs and other OSes are unvalidated. The full-precision checkpoint loads on CPU, so budget RAM and disk.
Generation is local and offline - Hugging Face offline flags are set for the worker. And the licence is MIT, which says nothing about the person on the recording: get permission for the speaker, the recording and the intended use before you ship anything.
Common issues
"LongCat is not set up on this machine. Run setup_longcat.py once." Expected until you run the helper. It's not an automatic download, deliberately.
"Connect a reference recording, or choose Text to speech." Clone mode with nothing wired. Note reference_audio is lazy specifically so TTS runs don't make you feed a dummy clip.
"Paste the exact words spoken in the reference clip into reference_transcript." Also clone mode. This one's non-negotiable.
The transcript matches but the voice still drifts. Check reference length. LongCat's combined reference-plus-generation window is 60 seconds - a reference that eats most of it leaves no room to speak. Start at 8–20 seconds of clean single-speaker audio, no music, no overlap.
Memory failures. Close other GPU apps and shorten the reference.
"Use a project label, not a path." The field becomes a folder name under output/zura_voice, so slashes are rejected.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | 2 options: Clone a voice, Text to speech | |
| script | STRING | The words to generate. Long scripts are split at natural boundaries, never cut to fit the model window. | |
| reference_transcript | STRING | Exact words in the reference audio, including any fillers. Not used in Text to speech mode. | |
| pace | FLOAT | 1.000.5–2 | 1.0 matches the tested duration estimate. Above 1 is faster; below 1 is slower. Changes synthesis duration, not playback pitch; not an exact duration guarantee. |
| seed | INT | 89230–4294967295 | Keep fixed for repeatable takes. Randomise for a new performance. The following chunks use consecutive seeds. |
| project | STRING | Client_Project_EN | Output label. Each run gets a new folder so existing audio is never overwritten. |
| reference_audioopt | AUDIO | One clean speaker. Start with a prepared 8–20 second excerpt. TTS mode does not evaluate this branch. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| run_report | STRING | — |