Nodes/ComfyUI_zura_nodes/Zura · LongCat Retained Take
ComfyUI Node

Zura · LongCat Retained Take

Same LongCat voice, except it stops re-synthesising every time you nudge a handle

By ZURAVFX·Created about a month ago·Updated a day ago· 2
Zura · LongCat Retained Take
  • reference_audio
  • audio
  • run_report
◄reference_transcript—►
◄mode▾►
◄script►
◄pace1.00►
◄seed8923►
◄projectClient_Project_EN►

A caching wrapper, and that's the whole pitch

LongCat-AudioDiT 3.5B is, by the community's own reckoning, one of the best open voice-cloning models going - "the best open model I've tried yet" in the words of the r/StableDiffusion post that put it on people's radar back in April 2026, with reference similarity that beats most of the open field. It's also a diffusion model: every take is a real sampling run, and in this pack that run happens in a separate Python process, with ComfyUI unloading its own models first.

Which is fine when you generate a take. It's miserable when you're auditioning word selections across a waveform and re-run the graph forty times.

Zura · LongCat Retained Take is the same voice node with a cache in front of it. Inputs, outputs and model are identical to Zura LongCat Voice; the difference is that it hashes the job - mode, script, transcript, pace, seed, project, runtime config, and the actual reference waveform bytes - and if that hash has been seen, it reloads the saved WAV instead of running the model.

The practical effect: on a dialogue edit, changing your IN/OUT handles is free. Changing the seed is a new performance and costs a full run. That split is the entire design, and the node description says so in one line.

What you set

reference_audio wants one clean speaker - the tooltip suggests 8–20 seconds, and it's right. reference_transcript is a required input rather than a widget on this variant: it comes off the reference_transcript output of ZuraAudioDialogueSource, which means the exact words (including fillers) travel with the audio automatically instead of being hand-pasted and drifting out of sync. In Text to speech mode that branch isn't evaluated at all.

script is the full revised line, not a fragment - long scripts get split at natural boundaries rather than truncated, and each chunk uses consecutive seeds. pace (0.5–2.0, default 1.0) changes how long the synthesis is, not its pitch; 1.0 matches the tested duration estimate. seed stays fixed for repeatable takes, which is exactly what the cache is keyed on.

project is a folder label, not a path - the node rejects slashes and colons. Each uncached run gets its own output/zura_voice/<label>_<date>_<id>/ folder holding voice.wav, master_float32.wav, per-chunk WAVs, script.txt, job.json, report.json and worker.log.

Outputs are audio and run_report (JSON). Wire the report into ZuraAudioDialogueTake so the select stage can diff your new script against the original transcript - that's how auto word selection works.

Install

Install the pack (Manager → search Zura Nodes → the ZURAVFX entry, or clone into custom_nodes/ComfyUI_zura_nodes and pip install -r requirements.txt), then do the LongCat setup once:

python setup_longcat.py --install
python setup_longcat.py --check

That builds a separate Python 3.11 environment and downloads the pinned model and tokenizer - the helper never installs packages itself; if it prints uv pip install commands, run those and try again. Weights land in %USERPROFILE%\ZuraLongCat by default (--root D:\AI\ZuraLongCat to move them), and the paths are recorded in an untracked longcat.local.json. The Registry package does not ship the weights, and importing the node doesn't download anything. Tested on a 16 GB 4080, Windows; CUDA with BF16 is required and other platforms are unvalidated.

Where people get burned

"LongCat is not set up on this machine." No longcat.local.json, or the paths in it moved. Run --check; it validates without downloading anything.

A take fails and the error is vague. It points at the run folder, and worker.log in there is the real stack trace. The node also kills the child process on interrupt, so partial outputs survive.

A loud reference gives you static. LongCat is unusually sensitive to input level - community reports describing exactly that, with the fix being normalisation down to roughly -20 to -25 LUFS before cloning. Trim to a clean 8–20 seconds, no music, no overlap, one speaker.

You hit a wall around a minute. The model's combined reference-plus-generation window is about 60 seconds, so a long reference eats the room available for speech. The node splits long scripts to stay inside it, but a 50-second reference is still a bad idea.

You wanted a new performance and got the old one. The cache is keyed on the seed. Change it. Conversely, if you keep getting fresh takes you didn't want, check whether pace or script is subtly differing - a trailing space is a different hash.

Text-to-speech mode doesn't hold a voice. Unconditioned TTS has no speaker to anchor to. Generate a short sample you like, then clone that with its real transcript. And no, LongCat won't take "a warm middle-aged narrator" as a speaker description - the script field is spoken text, not instructions.

CategoryZura/audio

Inputs (7)

NameTypeDefaultDescription
reference_audioAUDIOOne clean speaker. Start with a prepared 8–20 second excerpt. TTS mode does not evaluate this branch.
reference_transcriptSTRING—
modeCOMBO2 options: Clone a voice, Text to speech
scriptSTRINGThe words to generate. Long scripts are split at natural boundaries, never cut to fit the model window.
paceFLOAT1.000.5–21.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.
seedINT89230–4294967295Keep fixed for repeatable takes. Randomise for a new performance. The following chunks use consecutive seeds.
projectSTRINGClient_Project_ENOutput label. Each run gets a new folder so existing audio is never overwritten.

Outputs (2)

NameTypeDescription
audioAUDIO—
run_reportSTRING—