Nodes/Kandinsky T8/Kandinsky 6 Text Encode (video+audio)
ComfyUI Node

Kandinsky 6 Text Encode (video+audio)

What Kandinsky 6 Text Encode Is Really Doing

By T8mars·Created 22 days ago·Updated 21 days ago· 6
Kandinsky 6 Text Encode (video+audio)
  • clip
  • CONDITIONING
◄video_caption►
◄audio_caption►

Kandinsky 6 has two branches - a video transformer and an audio one - and they don't each get their own text encoder. There is one caption, encoded once with Qwen2.5-VL-7B, and both branches read it. That's the whole idea behind Kandinsky6TextEncode, and it's why you can't just drop a stock CLIP Text Encode in and hope.

How it works

Give it a video_caption and an audio_caption and it builds the canonical Kandinsky 6 prompt: your video caption, then a space, then <AUDCAP> your audio caption <ENDAUDCAP>. That single string goes through the CLIP at clip, and the resulting conditioning is duplicated internally under both the video and the audio key sets so the two CFG branches can be batched together. One encode, two consumers, no desync - the audio and video can't disagree about what the scene is, because there's nothing to disagree about.

Two implementation details worth knowing, because they explain behaviour you'd otherwise find mysterious.

ComfyUI's Qwen text encoders have a clip_layer setting, and Kandinsky 5 defaults to taking the pre-final-RMSNorm hidden state. Kandinsky 6 consumes the final normalized state instead. The node handles that itself rather than changing ComfyUI's shared config, which is also why you should use this node rather than a stock encode node wired to the kandinsky5 CLIP type.

The other one is a hard ceiling: the canonical K6 template admits at most 1024 caption tokens after its own 129-token system prefix. The Qwen tokenizer in ComfyUI is unbounded, so the node truncates to 1153 tokens total. Long captions don't error, they just quietly stop being read. Keep the important stuff early.

What to put in the two boxes

video_caption - the shot. Scene, subjects, action, camera. Per the tooltip, spoken lines go here too, wrapped in <S>...</S> at the moment they're said. So a talking shot looks like: A cinematic close-up of a young adult woman in soft daylight. She looks into the camera and clearly says <S>Look there!<E>, her lips moving naturally... Static camera, continuous shot.

audio_caption - what the shot sounds like. Voices, ambience, music. Explicitly not where dialogue goes; the words themselves belong in the video caption because the model has to time them to the mouths. Leave this box empty and you've asked for a silent shot.

clip - from DualCLIPLoader with type kandinsky5, loading qwen_2.5_vl_7b.safetensors and clip_l.safetensors. This is the DiT's conditioning path, not an optional enhancer; don't confuse it with the Qwen3.5-9B that Kandinsky 6 Beautify Prompt uses to write words for you.

One output: CONDITIONING. Wire it into the sampler's positive.

You need two of them

The shipped workflows use two Text Encode nodes - one real prompt, one negative reading Static, cartoon, worst quality, low quality, deformed. That's a habit from the CFG 5 era, and on the base Lite model at CFG 5 it earns its keep.

On the distilled models at CFG 1, the negative is inert: with classifier-free guidance at 1 there is no uncond pass for it to steer. Wiring it in costs you nothing but it also does nothing. If you're running Lite at CFG 5, the negative matters; if you're on a distill model, spend your attention on the positive caption instead.

Install

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 with its own Python environment afterwards. ComfyUI 0.39.0+ is the floor, plus comfy-kitchen 0.2.37+ from requirements.txt and an NVIDIA GPU with INT8 tensor cores. If you also have the official Kandinsky 6 extension, disable it - the node names collide, and a graph with two nodes called "Kandinsky 6 Text Encode" is a bad afternoon.

Models, if you haven't got them yet: the DiT goes in ComfyUI/models/diffusion_models, the two text encoders in text_encoders/, and the workflow's Download models button will fetch the shared components with size and SHA-256 verification rather than leaving you to trust a random mirror.

Where it goes wrong

A caption that's great for 300 words and ignored after that. Truncation, not the model being difficult. Front-load the shot.

Dialogue that comes out as mumbling or ambient noise. Usually the lines are in audio_caption instead of <S>...<E> in the video caption. The audio branch has no timing, so it can't lip-sync anything.

<S> without <E>. Unbalanced tags are a known failure shape with these caption formats - the pack's beautifier node validates for exactly this and retries three times before giving up, which tells you how often it happens. Check your own tags if you write them by hand.

Long negatives on a distilled model. They cost tokens, not much else, but they're the tell that you're running a 2023 habit on a 2026 architecture - the same mistake as CFG 7 on a guidance-distilled checkpoint, just quieter.

CategoryKandinsky 6

Inputs (3)

NameTypeDefaultDescription
clipCLIP—
video_captionSTRINGWhat happens in the shot: scene, subjects, action, camera. Spoken lines go here too, wrapped in <S>...<E> at the moment they are said.
audio_captionSTRINGWhat the shot sounds like. Appended to the video caption as <AUDCAP>...<ENDAUDCAP>; leave empty to describe no sound. Not for spoken lines.

Outputs (1)

NameTypeDescription
CONDITIONINGCONDITIONING—