Nodes/ComfyUI LC Audio_Video Nodes/LC H3 Audio Sync (BETA) 🎀
ComfyUI Node

LC H3 Audio Sync (BETA) 🎀

Make MiniMax H3 perform your track instead of inventing one

By lonecatone23Β·Created about a month agoΒ·Updated 2 days agoΒ· 5
LC H3 Audio Sync (BETA) 🎀
  • latent
  • audio_vae
  • audio
  • positive
  • latent
  • audio
  • info
  • positive
β—„start_seconds0.0β–Ί
β—„when_shortsilenceβ–Ί

H3's headline feature is also its most annoying one. It generates picture and sound together in one pass - dialogue, room tone, the lot - which is genuinely the thing that made it interesting next to silent video models. It's also why, left alone, it invents a soundtrack for you: you ask for a woman talking on a pier and get her talking to a song that doesn't exist, mouth flapping along to it.

LC H3 Audio Sync (BETA) makes the video perform your recording instead. A line of dialogue you recorded, a song, a piece of TTS output - the model stops guessing the sound and spends all its effort on the picture that fits it, mouth included. It's the local answer to what lip-sync avatar models do, except you're not bolting a separate avatar model onto Wan and hoping the head doesn't detach.

The mechanism, which is the interesting part

The H3 latent is a nested tensor with two streams: video and audio. The node reads the clip's length off the video stream (inverting H3's frame rule, 24 fps), converts that to an audio-latent length at H3's 40 audio-latent-frames-per-second, and cuts your waveform from start_seconds to exactly that many samples - resampling to the audio VAE's rate first if your track doesn't match. Then it encodes with H3's audio VAE and rebuilds the nested latent with your sound in the audio half.

Then comes the lock. It attaches a per-stream noise mask: ones over the video, zeros over the audio. ComfyUI's sampler blends a nested mask stream by stream, so the audio half is never denoised. Your encoded track survives the sampler untouched, and only the picture gets sampled.

One detail that separates this from a naive "just mash my audio in" node: the lock alone isn't enough. The sampler re-noises everything to each step's level, so during the early steps - exactly where motion and mouth shape get decided - H3 is hearing mostly noise. That's why the optional positive input exists. Wire your H3 conditioning through the node and it hands the same audio latent over as a guide keyframe at frame 0, so the clean words are there from step one. It's the same trick core's MiniMax H3 Add Guide uses.

Inputs and outputs

Five required inputs is the whole cost of entry: latent (from any H3 node - Empty MiniMax H3 AV Latent, Image to Video, Reference to Video), audio_vae (H3's audio VAE, the same one the H3 nodes use - not your video VAE), audio (the recording), start_seconds (where in the track this clip starts; the clip's own length decides how much is used), and when_short - silence or loop for when the track runs out before the clip does.

positive is optional but you should wire it. It's the difference between "mouth roughly follows the words" and "mouth follows the words".

Outputs: latent goes to the sampler. audio is your track cut to exactly the clip's length - wire it to the save node so picture and sound end together instead of the video ending a beat early. info reports clip length, track length, and whether it had to fill. And positive comes back out for the sampler.

The thing nobody tells you: H3 moves the mouth when the prompt says the words are spoken, not when it hears them. Your prompt needs timed lines - At 0 seconds she says, "Hello there." Without the time, she talks over the silence. LC H3 Dialogue Check's prompt_line output writes those lines for you from your recording, which is the sane way to do it.

Install

Manager β†’ search "ComfyUI LC Audio_Video Nodes", or:

cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_AV_nodes

Restart, confirm [LC AV] total … nodes in the console. Keep __init__.py directly in the pack folder - a nested ComfyUI_LC_AV_nodes/ComfyUI_LC_AV_nodes/ silently loads nothing. Nothing extra to install for this node: it uses comfy.audio and comfy.nested_tensor, so it just needs a ComfyUI build that already has H3 nodes in it.

Where it bites

Feed it a non-H3 latent and it fails loudly with a sensible message, which is better than most beta nodes manage. H3 was trained to about 15 seconds, and the node warns you in info when your clip runs long - believe it.

And the honest blocker, which isn't the node's fault: H3's community licence excludes the US, EU, UK and Korea from its applicable territory. If you're in one of those regions you're not licensed to run the local weights at all, and no node pack changes that. The hosted Hailuo API is separate and stays global.

CategoryLC AV/H3 Long Video

Inputs (6)

NameTypeDefaultDescription
latentLATENTThe picture-and-sound latent from an H3 node (Empty MiniMax H3 AV Latent, Image to Video, Reference to Video...).
audio_vaeVAEH3's audio VAE, the same one the H3 nodes use.
audioAUDIOThe recording the video should perform: a song, a line of dialogue, anything.
start_secondsFLOAT0.00–3600Where in the track the clip starts. The clip's own length decides how much is used.
when_shortCOMBOsilenceThe track is shorter than the clip: fill the rest with silence, or loop the track.
positiveoptCONDITIONINGThe H3 positive conditioning. Wire it through here: the track is also handed to H3 as a clean guide, so the mouth follows the words from the first step (the lock alone is too noisy early on).

Outputs (4)

NameTypeDescription
latentLATENTThe latent with your track locked into its sound half. Wire it into the sampler.
audioAUDIOYour track cut to exactly the clip's length, for the save node, so picture and sound end together.
infoSTRINGClip and track lengths, and whether the track was filled.
positiveCONDITIONINGβ€”