Zura · Select Audio Words
Get the reference and the timings right
- speaker_reference
- reference_transcript
- edit
What this node is for
Cloning a voice to say a new line is easy in a demo and fiddly in practice, because a clone needs two things a random clip doesn't give you: one clean speaker, and the exact transcript of what that speaker said. Then the editor needs a third thing - which words in the original you're planning to remove.
Zura · Select Audio Words collects all of it in one place. It's stage one of the Audio - Replace Speech (LongCat) template, and it hands you three outputs: a speaker reference ready for LongCat, the transcript that goes with it, and a ZURA_AUDIO_EDIT wire that follows the job through every later node.
Skip it, and nothing downstream knows which samples it's allowed to touch - which is why the edit output is the boring critical one.
How it builds the reference
Point source at your original recording. The picker fills it in for you; the file has to sit inside ComfyUI's input, output or temp folders, and the node decodes it with ffmpeg under strict limits: 1–8 channels, 8–192 kHz, under 30 minutes. It also refuses a file with no audio stream.
Then it assembles the reference from up to two parts:
- The source itself, optionally trimmed with
reference_start/reference_end(leavereference_endat 0 to take the whole file). - An optional
extra_referenceplus itsextra_transcript, enabled byreference_mode. Source and extra reference appends the extra clip; Extra reference only ignores the source audio and uses just the cleaner recording.
Each part is downmixed to mono at 24 kHz - which is what LongCat actually consumes - and the parts are joined with 150 ms of silence between them. Combined length is capped at 25 seconds so the model still has room to synthesise inside its window. Over that and you get a straight error telling you to trim the range or supply a shorter clip.
Here's the detail people miss: if you trim the source reference, you must fill in source_reference_transcript - the exact words inside the trimmed range. source_transcript stays the transcript of the whole clip, because the word-matching later works against the full thing. Two transcripts, two jobs. The node raises a specific error for each if you leave it blank.
Inputs and outputs
| Set this | Because |
| --- | --- |
| source, source_transcript | the clip you're editing and its full text - the edit stages diff against this |
| word_start / word_end | which original words get replaced; later nodes can still override |
| reference_start / reference_end | trim the clone reference to 8–20 seconds of clean speech |
The optional one is source_reference_transcript, only needed when the reference is trimmed. extra_reference, extra_transcript and reference_mode matter only if you're adding a second recording.
Outputs: speaker_reference (AUDIO, 24 kHz mono) → the LongCat voice node; reference_transcript (STRING) → that node's transcript input; edit (ZURA_AUDIO_EDIT) → the take/select chain. The edit payload carries the source path, a size+mtime hash of the file, sample rate, channel count, sample count, your selected word range, and the reference length. That hash is why later stages can tell you the source changed instead of silently splicing into the wrong file.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/ZURAVFX/ComfyUI_zura_nodes
cd ComfyUI_zura_nodes && pip install -r requirements.txt
Or search Zura Nodes in ComfyUI Manager and install the entry published by ZURAVFX, then restart. ffmpeg and ffprobe must be on PATH - the node shells out to both for probing and decode. soundfile and av come from requirements.txt. The LongCat weights are a separate one-time setup (Setup_LongCat_Windows.cmd, or python setup_longcat.py --install), and Parakeet is optional and only needed for word buttons and auto selection.
Where people get burned
A guessed transcript gives you a cloned voice with the wrong accent on the wrong words. The reference transcript has to be what was actually said - filler words included. This is manual transcription; the pack does not auto-fill it.
Very short references are accepted and quietly mediocre. Three seconds works; twenty seconds of clean, unaccompanied speech from one person gives you a stronger match. That's a quality dial, not an error.
Editing the source after this node ran. Nudge the source trim and the node re-runs, but the downstream edit hash no longer matches - you'll be told to load the waveform again. Re-run the whole chain top to bottom rather than trying to patch mid-graph.
No reference at all. Extra reference only with an empty extra_reference gets you "Choose a speaker reference." Mode and field have to agree.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| source | STRING | — | |
| source_transcript | STRING | — | |
| word_start | FLOAT | 0.000 | — |
| word_end | FLOAT | 0.500 | — |
| reference_start | FLOAT | 0.000 | — |
| reference_end | FLOAT | 0.000 | — |
| extra_reference | STRING | — | |
| extra_transcript | STRING | — | |
| reference_mode | COMBO | 2 options: Source and extra reference, Extra reference only | |
| source_reference_transcriptopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| speaker_reference | AUDIO | — |
| reference_transcript | STRING | — |
| edit | ZURA_AUDIO_EDIT | — |