wan-multitalk

$npx mdskill add artokun/comfyui-mcp/wan-multitalk

Generate lip-synced talking avatar videos from a portrait and audio track.

  • Solves creating realistic talking-head videos from a single portrait and audio.
  • Depends on WAN 2.1 I2V, Wav2Vec, and ComfyUI-WanVideoWrapper nodes.
  • Uses Wav2Vec speech embeddings to condition the WAN sampler for lip-sync.
  • Outputs a short lip-synced video clip with head motion matching the audio.

SKILL.md

.github/skills/wan-multitalkView on GitHub ↗
---
name: wan-multitalk
description: Build WAN MultiTalk audio-driven talking-avatar / lip-sync video workflows — MeiGen-AI MultiTalk on WAN 2.1 14B I2V via kijai WanVideoWrapper (portrait + audio → lip-synced video)
globs:
  - "**/*.json"
---

# WAN MultiTalk — Audio-Driven Talking Avatar

## Overview

MultiTalk (MeiGen-AI) drives a **still portrait's lip-sync and head motion from an
audio track**. It runs on WAN 2.1 14B Image-to-Video via kijai's
**ComfyUI-WanVideoWrapper**: Wav2Vec speech embeddings condition the WAN sampler so
the mouth/expression follow the speech, while the lightx2v step-distill LoRA keeps
it to a few sampling steps.

Use it for talking heads, dubbing, and single-speaker avatar clips (~10s at 480p).
It is **distinct from `wan-animate`** (pose/motion-driven character animation) — this
is *audio → lip-sync*, not reference-video motion transfer.

Pack: `wan-multitalk` (480p, ~10s). Higher-res/longer variants exist in the source
bundle (720p, long-context) as VRAM/duration knobs on the same graph.

## Pipeline (node graph)

```
LoadImage (portrait) ─┐
LoadAudio ─ AudioSeparation ─ AudioCrop ─ DownloadAndLoadWav2VecModel ─ MultiTalkWav2VecEmbeds ─┐
                                                                                                 ▼
WanVideoModelLoader (WAN 2.1 14B I2V GGUF) ─ MultiTalkModelLoader ─ WanVideoLoraSelect (lightx2v)
   + LoadWanVideoT5TextEncoder (umt5) + WanVideoTextEncode + WanVideoClipVisionEncode (clip_vision_h)
   + WanVideoVAELoader ──────────────────────────────────────────────────────────────────────────┘
                                                     ▼
                       WanVideoImageToVideoMultiTalk ─ WanVideoSampler ─ WanVideoDecode ─ VHS_VideoCombine
```

Key nodes (all kijai WanVideoWrapper unless noted):
- **DownloadAndLoadWav2VecModel** — auto-downloads the Wav2Vec speech model on first
  run (no manifest entry needed).
- **MultiTalkWav2VecEmbeds** — turns the (separated, cropped) speech into the
  embeddings that steer the mouth/expression.
- **MultiTalkModelLoader** + **WanVideoImageToVideoMultiTalk** — the MultiTalk head
  on top of the WAN I2V model.
- **AudioSeparation** — isolate the voice from music/noise before embedding (cleaner
  lip-sync). **AudioCrop** — trim to the segment you want to animate.
- **ImageResizeKJv2** (KJNodes), **VHS_VideoCombine** (VideoHelperSuite) — resize +
  mux to mp4.

## Models

| File | Loader | Folder |
|------|--------|--------|
| `Wan2.1_14b_Image_to_Video_480p_GGUF_Q8.gguf` | WanVideoModelLoader | `diffusion_models/` |
| `WanVideo_2_1_Multitalk_14B_fp32.safetensors` | MultiTalkModelLoader | `diffusion_models/` |
| `umt5_xxl_fp8_e4m3fn_scaled.safetensors` | LoadWanVideoT5TextEncoder | `text_encoders/` |
| `Wan2_1_VAE_bf16.safetensors` | WanVideoVAELoader | `vae/` |
| `clip_vision_h.safetensors` | CLIPVisionLoader | `clip_vision/` |
| `Wan21_I2V_14B_lightx2v_cfg_step_distill_lora_rank64_fixed.safetensors` | WanVideoLoraSelect | `loras/` |

Sources: kijai `Kijai/WanVideo_comfy`, MeiGen-AI `MeiGen-AI/MeiGen-MultiTalk`, GGUF
`city96/Wan2.1-I2V-14B-480P-gguf`. See `packs/wan-multitalk/manifest.yaml` (some URLs
are best-effort — verify per mirror). Wav2Vec auto-downloads.

## Inputs & key parameters

- **Portrait** (LoadImage): front-facing, clear face, neutral-ish expression works
  best. Resized by ImageResizeKJv2 to the target (480p).
- **Audio** (LoadAudio): the speech track. AudioSeparation isolates the voice;
  AudioCrop selects the segment (drives clip length).
- **Steps**: low (the lightx2v distill LoRA is why — typically ~4–8). Raising steps
  rarely helps and costs time.
- **BlockSwap** (WanVideoBlockSwap): trade VRAM for speed — increase blocks swapped
  to CPU on lower-VRAM cards.

## VRAM tiers (from the source bundle's variants)

| Target | Approx VRAM | Lever |
|--------|-------------|-------|
| 480p 10s | ~8–12 GB | base |
| 480p low-VRAM | ~6–8.4 GB | more BlockSwap, GGUF quant, lower quality |
| 720p 10s | ~11–16 GB | higher res |

Pair with the VRAM launch-flags guidance (see `troubleshooting`): `--use-sage-attention`
+ appropriate `--*vram` mode; MultiTalk benefits from `--reserve-vram` headroom for
the Wav2Vec + VAE round-trips.

## Gotchas

- **Audio must be voice-isolated** for good lip-sync — skipping AudioSeparation on a
  music-heavy track makes the mouth chase the wrong signal.
- **One speaker.** This graph is single-speaker; multi-speaker MultiTalk needs the
  multi-embed variant (not in this pack).
- **Wav2Vec first run** downloads a model — the first render is slower.
- If lips look under-driven, check the MultiTalk embeds are actually wired into
  `WanVideoImageToVideoMultiTalk` (not bypassed), and that the audio isn't silent
  after AudioCrop.

More from artokun/comfyui-mcp

SkillDescription
ai-toolkit-trainerTrain custom LoRAs with ostris AI-Toolkit — covers WAN 2.2/2.1 (people, styles, video motion) and Z-Image (Turbo & Base, low-VRAM image LoRAs). Use when the user wants to train a WAN or Z-Image LoRA; covers local + RunPod setup, dataset prep, key params, and using the result in a ComfyUI workflow.
anima-baseAnime/illustration text-to-image (ANIMA 1.0, ~2B Cosmos DiT) — use for anime, manga, illustrated characters; accepts Danbooru tags + natural language; runs/trains on <6GB VRAM; includes anime inpainting via Anima-LLLite ControlNet
anima-lora-trainerTrain a custom anime LoRA on the ANIMA base model — Citron's local Gradio trainer (kohya sd-scripts), <6GB VRAM, character/style LoRAs; covers setup, dataset prep, training params, and using the result in the anima-base workflow
civitaiDiscover Civitai models with the BUILT-IN search_civitai_models tool and install/generate them locally — find a checkpoint/LoRA/embedding on Civitai, download it into ComfyUI, and use its trigger words. Optionally pair the official Civitai MCP for community features (images browsing, posting, collections).
color-correctionDiagnose and fix video/image color OBJECTIVELY with the analyze_color tool (scopes/stats — black/white points, contrast, saturation, clipping, cast) instead of eyeballing a contact sheet. Covers the "washed out" signature, why reference color-match (mkl/ColorMatch/ColorMatchAdobe) CAN'T add contrast a flat source lacks, the levels/contrast-stretch fix (core AdjustContrast / CurveEditor), the measure→fix→re-measure loop, the side-by-side sandbox pattern, and where to place the fix in a render graph (after decode, before save). Use when a render looks washed out / flat / dull / over-saturated / color-cast, or when deciding between a color-match and a contrast/levels fix.
comfyui-coreCore ComfyUI knowledge — workflow format, node types, pipeline patterns, and MCP tool usage
comfyui-frontend-extensionsAuthoring ComfyUI v2 frontend extensions with @comfyorg/extension-api — defineNode/defineExtension/defineWidget, shell UI (sidebar tabs, commands, hotkeys), typed events, and handles. Use when writing or editing ComfyUI web-UI extension code (custom node JS, sidebar panels, widgets).
comfyui-launch-flagsPick the right ComfyUI startup flags for VRAM, attention, caching, and speed — the full decision matrix for OOM (--novram / --cache-none / --disable-smart-memory), shared-VRAM creep on Windows (--reserve-vram N), model-switching with big text encoders (--cache-none), high-VRAM throughput (--gpu-only / --highvram), and attention-backend selection (--use-sage-attention for speed, --use-pytorch-cross-attention as the highest-quality / Z-Image-safe fallback). Also the acceleration-stack + Blackwell/RTX 5000 (sm_120) notes. Use when a graph OOMs (especially long video like LTX 2 / WAN), when the GPU spills into shared VRAM and slows to a crawl, when switching between models eats all RAM, when Z-Image produces black/garbled output under Sage, or when deciding which attention backend to launch with. Flag names verified against upstream comfy/cli_args.py — see Sources.
comfyui-node-registryAuthoring & publishing ComfyUI custom nodes to the Comfy Registry — node structure, pyproject.toml spec, comfy-cli publishing, and CI
debug-renderDebug a WRONG or imperfect render (not a hard error) by inspecting inputs and intermediate steps with run-to-node — render one branch up to an output, preview-tap latents/masks/preprocessor maps, localize the first bad stage, then fix. Use when a final image/video comes out wrong — artifacts, wrong subject/pose/composition/color, blur, a ControlNet/IPAdapter/mask/LoRA not taking, a two-stage refiner or upscale degrading the result — rather than the run failing with an error (for errors/OOM/missing nodes use the troubleshooting skill).