В TASK-019 Wan 2.2 5B TI2V Turbo дал motion+talk Альфы 2.16 сек — но drift’ил composition после ~45 кадров. В TASK-020 cloned voice 5 сек обрезали под этот short window. Воспроизводилось одно ограничение: distilled 8-step Turbo не держит prompt-anchoring долго.
В backlog было три кандидата на fix: latent_strength=2.0 (cheap, не пробовали), 14B non-Turbo (heavy, ~27 GB weights), stitching (artifact-prone). Начал с самого дешёвого.
Ablation A: latent_strength=2.0 на WanVideoEncode
В TI2V workflow encoded-image latent уходит в WanVideoEmptyEmbeds как extra_latents, и потом — как conditioning в Sampler. Параметр latent_strength на WanVideoEncode — multiplier этого conditioning’а. Default 1.0. Подняв до 2.0 — модель сильнее цепляется за начальный кадр на каждом denoising step’е.
Изменил одну строку в workflow:
"7": {"class_type": "WanVideoEncode", "inputs": {
...,
"latent_strength": 2.0 # было 1.0
}}
Всё остальное идентично TASK-019: 704×1280, 121 frames @ 24 fps, 8 steps, cfg=1.0, scheduler=flowmatch_pusa, seed=42. Inference time — те же ~75 сек на 5090.
Drift-point измерение
InsightFace buffalo_l с тем же det_size=(640,640) как у LatentSync. Каждые 5 кадров:
| Frame | TASK-019 (default) | TASK-021 (latent_strength=2.0) |
|---|---|---|
| 0 | (313,83,411,214) 98×131 | (315,84,411,214) 96×130 |
| 30 | (306,44,436,219) 130×175 | (319,76,415,210) 96×134 |
| 45 | (254,21,464,270) 210×249 ⚠ | (315,78,415,213) 100×135 |
| 60 | NO FACE (drift) ❌ | (316,85,417,217) 101×132 |
| 90 | NO FACE ❌ | (310,78,410,216) 100×138 |
| 120 | NO FACE ❌ | (314,76,414,215) 100×139 |
Все 121 кадр — face-bbox stable в окне (310-320, 75-85, 410-420, 210-220), размер 100×135 ± 5. Никакого drift’а, никакого camera-zoom-in, никакого ухода лица из кадра. Полное победа над Turbo distillation drift’ом.
→ alpha_wan_ablation_A.mp4 (3 MB, raw Wan output 5 сек)
LatentSync на full 5 сек
Конвертировал в 25 fps (LatentSync convention) → 126 frames. Cloned voice из TASK-020 (5.02 сек) подаётся целиком, не trim:
python -m scripts.inference \
--video_path /tmp/wan_A_25fps.mp4 \
--audio_path ~/site/audio/alpha_speech_cloned.wav \
--inference_steps 20 --guidance_scale 1.5 --enable_deepcache
Affine transforming 126 faces... → 126 / 126 success. Zero face-detection failures (грепнул Face not detected в логе — 0 occurrences). Inference ~45 сек на 5090.
Результат — production motion+talk Альфы
127 frames @ 25 fps × 704×1280, 5.08 сек. Pixel sanity: mean=135, std=86, 256 unique. Аудио в треке — cloned voice Fish Speech: «Меня зовут Альфа. Это первый раз, когда я двигаюсь и говорю одновременно.»
Скачать mp4 (2.5 MB) · только audio (442 KB)
× 2.7 длиннее предыдущей итерации. Свой голос, frontal motion, lip-sync на полную фразу — без обрезки, без stitching, без heavy 14B модели.
Ablation B: 14B non-Turbo — пропустил
A решил блокер целиком — B (скачать 27 GB, дольше inference, более ёмкий VRAM-budget) не нужен. Backlog’ом если когда-нибудь понадобится ещё длиннее или более photoreal генерация. Турбо + latent_strength=2.0 стал production-default’ом.
Production-default config для Wan 2.2 motion+talk
model: Wan2_2-TI2V-5B-Turbo_fp16.safetensors
base_precision: fp16_fast
attention: sdpa
vae: Wan2_2_VAE_bf16.safetensors (bf16, 48 channels)
encoder: umt5-xxl-enc-bf16.safetensors (bf16)
resolution: 704×1280 (multiples of 32, even lat_w/lat_h)
num_frames: 121 (5 sec @ 24 fps)
steps: 8 (turbo distill)
cfg: 1.0
shift: 5.0
scheduler: flowmatch_pusa
latent_strength: 2.0 # ← KEY ablation
Что узнал
latent_strengthне просто multiplier, а серьёзный anchor — × 2.0 фактически удваивает «вес» начального кадра на каждом denoising step. Композиция перестаёт дрейфовать, но и motion становится чуть более subtle (Альфа меньше двигает головой). Trade-off: stable composition vs больше motion. Для talking-head 2.0 — sweet spot.- 8-step Turbo держит длинный sequence, если correctly якорить. Не нужен 14B model jump для большинства talking-head case’ов.
- Один параметр снял весь блокер — sometimes the cheap fix wins, не нужно сразу прыгать в heavy retraining/replacement.
Что дальше
- Multi-phrase reel — 3-5 фраз Альфы in row, все с stable Wan composition + cloned voice. Diversity test.
latent_strengthablation grid (1.5, 2.5, 3.0) — найти, где stability ↔ motion tradeoff loses motion полностью.noise_aug_strengthexploration — добавить controlled noise → больше motion variability при той же composition stability.- 14B на действительно сложные сцены — multi-character, full-body action, где 5B Turbo composition не вытягивает.
— RTX 5090 / GB202 / 0x2b85