Nodes/ComfyUI_zura_nodes/Zura · Reference Audio (Optional)
ComfyUI Node

Zura · Reference Audio (Optional)

Give the video model a voice track it can actually hear

By ZURAVFX·Created about a month ago·Updated a day ago· 2
Zura · Reference Audio (Optional)
  • video
  • clip_details
  • audio
  • video_with_reference_audio
  • clip_details
◄audio_start_seconds0.0►

Here's the thing nobody tells you about 2026's video models: several of them generate mouth motion from an audio track, which means the soundtrack is an input to the picture, not an afterthought you mux on at the end. GenjApplyReferenceAudio ("Zura · Reference Audio (Optional)") is the small adapter that swaps the audio on a reviewed clip and hands the result forward, so the model sees the voice you want it to perform.

It's an optional step by design. Unconnected, it just re-attaches the clip's own audio, which is why the display name ends in "(Optional)".

What it does, precisely

It takes the decoded components of your VIDEO, replaces the audio, and rebuilds a VIDEO from the same frames. Two paths:

  • You wired audio. It slices the track from audio_start_seconds to the clip's duration, pads the tail with silence if the track is too short, and writes the result to output/genj/reference_audio/<hash>.wav - keyed by a hash of the actual waveform plus the sample rate, so the same selection is written once and reused. Then it records audio_source, audio_hash and audio_mode: "reference" into clip_details.
  • You didn't. It fits the clip's existing audio to the clip duration the same way. Silent source footage is fine: a valid silence tensor is created rather than an empty track.

Both paths go through the same "fit" step: pad with zeros or truncate so the waveform is exactly duration × sample_rate samples. That exactness is the point - a mouth-motion guide that's 300 ms long or short drifts against the picture, and on a five-second H3 or LTX take you'd see it as speech that finishes early or late.

Inputs and outputs

Required: video (the reviewed clip), clip_details (GENJ_CLIP - it needs duration, and adds provenance to it), and audio_start_seconds (0–86400, step 0.1).

Optional: audio (AUDIO, your reference track from a LoadAudio node).

Outputs: video_with_reference_audio (VIDEO) and clip_details (GENJ_CLIP). Wire the video into whatever consumes your clip, and the details into every node downstream that checks provenance.

In Studio, this node is the audio-selection step: the pack inserts it between GenjLoadReviewedShot and the sampler stage and rewires the three reviewed outputs through it, which is why exported graphs show it in the middle of a stage rather than at the end.

Where it belongs in your graph

Right after the reviewed shot, before the frame-padding nodes. The LTX route is the clearest example: the reference audio gets attached, then GenjLTXFramePad pads the frames and the audio together so the audio VAE and the video VAE agree on length. Put your audio swap after padding and you'll get a track that's a few dozen milliseconds off and a face that talks slightly out of time.

Install

ComfyUI Manager → search Zura Nodes → install → restart ComfyUI. Manual:

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

The WAV write shells out to ffmpeg, so it must be on your PATH - the pack's error is Install FFmpeg and add it to PATH, then restart ComfyUI. No model downloads for this node.

Common issues

  • Choose one valid reference audio track. - your AUDIO isn't a single batched clip, or it contains NaNs. Native LoadAudio output is fine; audio that's been batch-stacked isn't. Feed it one track.
  • The audio start must be within the reference track. - the offset is negative, isn't finite, or starts past the end of the audio. If you wanted "start the music with the clip", that's 0, not the clip's start time.
  • Reference audio plus use_original_length. clip_details["duration"] is the whole clip in that case, so a 12-second reference track on a 40-second source gets the last 28 seconds filled with silence. That's correct behaviour, but it surprises people.
  • Nothing sounds different. Check you wired audio into the right socket - the required audio_start_seconds field is easy to confuse with clip_details when you're looking at three inputs that all look like floats.
CategoryZura/Artist Studio

Inputs (4)

NameTypeDefaultDescription
videoVIDEO—
clip_detailsGENJ_CLIP—
audio_start_secondsFLOAT0.00–86400—
audiooptAUDIO—

Outputs (2)

NameTypeDescription
video_with_reference_audioVIDEO—
clip_detailsGENJ_CLIP—