Nodes/Kandinsky T8/Kandinsky 6 Audio VAE Decode
ComfyUI Node

Kandinsky 6 Audio VAE Decode

Yes, the Video Model Scored Itself — Here's How You Hear It

By T8mars·Created 22 days ago·Updated 21 days ago· 6
Kandinsky 6 Audio VAE Decode
  • audio_vae
  • joint_latent
  • AUDIO

Kandinsky 6 samples video and audio as two streams inside one latent. Everything in the graph downstream of the sampler is a sorting problem: which stream goes to which decoder. The video stream goes to a normal VAEDecode node. The audio stream goes here.

Worth saying plainly, because it's the thing people stall on: there is no separate audio model, no second pass, no MMAudio render stage to schedule afterwards. The DiT predicted the sound while it predicted the frames. This node is the listener.

How it works

Kandinsky6AudioVAEDecode takes the joint latent, un-nests it, and grabs the last stream in the pair - the 3D [B, T, 40] audio tensor rather than the 5D video one. It hands that to the TOD-VAE you loaded in Kandinsky 6 Audio VAE Loader, which decodes to a mel spectrogram and vocodes it up to a 44.1 kHz waveform.

Two details in there are worth knowing because they're the source of most "why is my audio like that" posts.

First, the decoder divides the latent by the scaling factor before decoding, then clamps the waveform to [-1, 1]. That clamp is the canonical pipeline's behaviour, not an accident - so a latent that decoded hot comes out flat-topped and crunchy rather than asymmetric and gross. Correct levels come from the audio VAE loader's model_variant, not from a limiter you bolt on later.

Second, it trims to fit the video. The node computes how many samples the generated frame count and fps imply - round(44100 × frames / fps) - and cuts the waveform to exactly that. So a 121-frame, 24 fps clip gets 5.04 seconds of audio, no more. No dialog anywhere asking whether you want to preserve the tail. If the decoder hands back fewer samples than the video needs, the node raises rather than shipping a clip that goes silent at the end.

Then it sanity-checks for NaN/Inf and refuses to return a garbage waveform. Silent failure is worse than a red error, so this is the right call.

Inputs and output

audio_vae - the VAE object from Kandinsky 6 Audio VAE Loader. Not the Hunyuan video VAE. Feeding the video VAE in here is the number one mistake with this node, and it fails with a channel-shape complaint rather than anything that mentions audio.

joint_latent - the nested LATENT after sampling. In an image-to-video workflow, that's the output of Kandinsky 6 Remove I2VA Reference (or the sampler's latent, if you removed the reference elsewhere), and it must still be the two-stream nested latent, not a plain video latent.

One output: AUDIO, in ComfyUI's standard dict form (waveform + sample_rate). Wire it straight into SaveAudio for a WAV, or into CreateVideo's audio input alongside your decoded frames and the fps from Kandinsky 6 Empty Latent to get the muxed MP4 the pack's example workflows produce.

Install

Part of the same pack as every other Kandinsky 6 node here, so there's nothing extra to do if you already have one of them:

cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/Comfyui-Kandinsky-T8.git
cd Comfyui-Kandinsky-T8
python -m pip install -r requirements.txt

Restart ComfyUI afterwards with its own Python environment. Requirements are lightweight for a video pack - the heavy lifting is comfy-kitchen (for INT8 ConvRot) plus the usual safetensors/einops crowd. You still need the two files the audio VAE loader wants: audio_vae/v1-44.pth and the audio_vae/bigvgan_vocoder/ folder.

Where it goes wrong

Wrong VAE. Discussed above; it throws on shape, not on "you plugged in the wrong thing."

"Audio decoder produced non-finite samples." That's the NaN guard firing. In practice it means something upstream went numerically sideways - most often a distilled checkpoint sampled with CFG above 1 or denoise below 1, which PiFlow doesn't tolerate. Fix the sampler settings, not this node.

"Audio decoder returned N samples, expected at least M." The decode came back short for the frame count. Usually a mangled joint latent - a mismatched latent length, or a hand-rebuilt nested tensor. Rebuild from Kandinsky 6 Empty Latent rather than patching latents by hand.

The honest caveat about this whole branch: local lip-sync is still the weak seam in the ecosystem, and this pack's own validation says it checked levels, RMS, clipping and duration - not whether the mouths match the words. Judge that yourself on your own clips before you build a pipeline around it.

CategoryKandinsky 6

Inputs (2)

NameTypeDefaultDescription
audio_vaeVAE—
joint_latentLATENT—

Outputs (1)

NameTypeDescription
AUDIOAUDIO—