Nodes/ComfyUI_zura_nodes/Zura · Select Replacement Words
ComfyUI Node

Zura · Select Replacement Words

Zura's replacement-words editor

By ZURAVFX·Created about a month ago·Updated a day ago· 2
Zura · Select Replacement Words
  • generated_audio
  • edit
  • replacement_take
  • selected_edit
◄selection_mode▾►
◄generated_start0.000►
◄generated_end0.500►
◄original_start-1.000►
◄original_end-1.000►

Two waveforms, one decision

Zura · Select Replacement Words is stage three of the Audio - Replace Speech (LongCat) template, and it's the only node in the chain you'll actually enjoy using. You get two waveforms: the original clip above, the cloned take below. You mark which source words go away, and which words in the take replace them. Drag the handles, click a word, shift-click to extend.

Everything expensive has already happened by the time you reach it. That's the design: the voice take is cached upstream, so this node is where you iterate freely.

The mechanism, because it explains the failure messages

This node does four concrete things when you press Run:

  1. It re-hashes your source file and refuses to continue if it changed since ZuraAudioDialogueSource read it - "The source changed. Load its waveform again."
  2. It writes the incoming take to output/zura_voice/dialogue_takes/<sha256>/replacement_take.wav, keyed by the audio content itself. Same take, no rewrite; new take, new folder. That's how the retained-take caching actually works on disk.
  3. If Parakeet is configured, it transcribes both the source and the take, then runs a difflib.SequenceMatcher over the normalised words (punctuation stripped, digits spelled out) to work out which span of the take corresponds to your edit.
  4. It resolves your two ranges into sample indices and emits a finished ZURA_AUDIO_EDIT.

Step 3 is where Auto changed words lives, and it's deliberately strict. It demands exactly one continuous changed block - no deletions, no second revision later in the sentence - and exactly one unambiguous match of those words in the recognised take. If either check fails you don't get a wrong selection, you get a notice, and the downstream Final Audio node will refuse to export. That's the right trade: silence beats a misplaced word.

Manual IN/OUT skips all of it. generated_start/generated_end are your handles on the take; original_start/original_end default to -1, which means "use the word_start/word_end carried by the edit wire from the source node." Leave them at -1 unless you're overriding that first selection.

Inputs and outputs

Required: generated_audio (from the take), edit (from source), selection_mode, and the four float handles. No optional inputs.

Out comes replacement_take - the same AUDIO you put in, so you can preview it directly - and selected_edit, the ZURA_AUDIO_EDIT that now contains generated_selection (plus selection_error if auto mode failed). Wire selected_edit to ZuraAudioDialogueOutput. That pairing is the whole contract: select here, blend there.

Install

Manager → search Zura Nodes → install the ZURAVFX entry and restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/ZURAVFX/ComfyUI_zura_nodes
cd ComfyUI_zura_nodes && pip install -r requirements.txt

You need ffmpeg/ffprobe on PATH for decoding. For the word buttons and auto selection, Parakeet is a separate optional install: onnx-asr[cpu,hub]==0.12.0 in its own Python environment, the Parakeet v3 INT8 and Silero VAD assets staged, and a parakeet.local.json next to the pack pointing at your Python and model directory. Without it, the two waveforms and Manual IN/OUT still work - you just click handles instead of words.

{"python":"/absolute/path/to/python", "models":"/absolute/path/to/models"}

Where people get burned

"Auto selection needs one continuous replacement phrase." You deleted a word, or fixed two things in one sentence. LongCat generated the whole revised line, so the diff has more than one opcode and the auto matcher bails. Use Manual IN/OUT.

"The changed words were not recognised unambiguously." Usually the take's transcription differs from your script - a name, a number, a homophone. Listen to the take; if the words are right, select them by hand.

The node looks empty after an update. These nodes draw their waveforms from a custom frontend extension with server routes. Refresh the browser tab hard after updating the pack; a stale frontend shows you a node with no editor.

Selection changes keep the take - that's the feature. The docs are clear that selection changes reuse the retained take, including after a ComfyUI restart. If you actually wanted a different performance, change the seed on the voice node, not the handles here.

CategoryZura/audio editing

Inputs (7)

NameTypeDefaultDescription
generated_audioAUDIO—
editZURA_AUDIO_EDIT—
selection_modeCOMBO2 options: Auto changed words, Manual IN/OUT
generated_startFLOAT0.000—
generated_endFLOAT0.500—
original_startFLOAT-1.000—
original_endFLOAT-1.000—

Outputs (2)

NameTypeDescription
replacement_takeAUDIO—
selected_editZURA_AUDIO_EDIT—