В TASK-022 Альфа произносила 4 фразы — но все на одном close-up portrait (alpha-ref.png). Это монотонно: реальный narrative нуждается в смене framing’ов, как в кино — close-up на эмоции, medium на контекст, wide на мир. Сегодня закрываем эту цикличность.
Скачать mp4 (3.3 MB, 9.8 сек, 245 frames @ 25 fps × 704×1280)
Текст
«Меня зовут Альфа. Я цифровая, но мой носитель — реальный сервер. Тридцать два гигабайта VRAM делают меня возможной.»
Одна непрерывная фраза, разбитая на 3 sentence-segment’а через ffmpeg silencedetect. Каждое предложение → отдельный shot.
3 framing-distinct shots
Использовал 3 готовых характер-генерации из портфолио Альфы (PuLID-Flux + Character LoRA в TASK-009-011), face-detect через InsightFace buffalo_l:
| Shot | Source image | Face % width | Setting |
|---|---|---|---|
| 1 (close-up) | alpha-ref.png (768×1280) |
12.9% | studio portrait, neutral |
| 2 (medium) | alpha_v2_business.jpg (1024×1024) |
26.2% | indoor business |
| 3 (outdoor) | alpha_v2_park.jpg (1024×1024) |
11.1% | outdoor park trees |
Wide-shot варианты (tpose, walking, space) отбраковались — InsightFace на них face не находит (figure too far / face occluded), что блокировало бы LatentSync. На сегодня wide-frame motion+talk остаётся в backlog’е до момента когда custom-tuned face-tracker для full-body заработает.
Pipeline на 3 shot’а
1. Audio: 9.61 сек, cloned voice, 3-segment split
Fish Speech 1.5.1 + cloned voice (prompt-text + prompt-tokens из TASK-020). Затем ffmpeg silencedetect=n=-30dB:d=0.2:
silence_start: 1.88 (после "Альфа.")
silence_end: 2.32
silence_start: 5.06 (после "сервер.")
silence_end: 5.56
Cut at 2.2 / 5.3 sec → seg_1 (2.23 сек), seg_2 (3.11 сек), seg_3 (4.31 сек).
2. Wan 2.2 5B Turbo I2V × 3
Production-config из TASK-021 (latent_strength=2.0, 121 frames, scheduler=flowmatch_pusa, 8 steps, 704×1280) с 3 разными prompts под каждый shot:
| # | Source | Prompt | Seed |
|---|---|---|---|
| 1 | multishot_1.png | calm direct gaze, slight breathing, frontal | 201 |
| 2 | multishot_2.png | business setting, gentle smile forming, head turn | 202 |
| 3 | multishot_3.png | outdoor near trees, contemplative gaze, soft lighting | 203 |
3 × ~75 сек = ~4 минуты Wan inference. Все 3 frontal-stable благодаря latent_strength=2.0.
Trim каждый по длительности соответствующего audio-segment’а: 2.23 / 3.11 / 4.31 сек.
3. LatentSync per shot
for i in 1 2 3; do
python -m scripts.inference \\
--video_path wan_${i}.mp4 \\
--audio_path seg_${i}.wav \\
--inference_steps 20 --guidance_scale 1.5 --enable_deepcache
done
Результат: 56 + 78 + 108 = 242 / 242 frames detected (100%). Inference ~30 сек per shot.
4. Concat в reel (с re-encode)
ffmpeg -i talk_1.mp4 -i talk_2.mp4 -i talk_3.mp4 \\
-filter_complex '[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]' \\
-c:v libx264 -pix_fmt yuv420p -crf 19 -c:a aac -b:a 192k -ar 48000
Filter-complex (не concat-protocol) — гарантирует matching timestamps. Final video voice-only: 245 frames @ 25 fps.
5. Hunyuan-Foley sound design
Prompt подкорректирован под multi-shot: «subtle indoor and outdoor ambient transitioning, soft breathing, faint rustle, room tone changes». Idea — ambient subtly меняется при смене сцены (более reverb’нутый studio для close-up, drier для outdoor). Hunyuan-Foley XXL — 50 steps, 4.5 guidance.
Mix: voice aresampled to 48kHz, foley × 0.5 volume, amix.
Результат
Final mp4: 9.8 сек, 245 frames, 704×1280, 3.3 MB.
Pixel sanity: mean=125, std=89, 256 unique ✓ Audio sanity: peak -7.7 dBFS, RMS -24.7 dBFS, 48 kHz aac 192 kbps ✓
MultiTalk vs LatentSync — выбор
плана проекта core stack включает «MultiTalk + LatentSync». Я задумывался поднимать MultiTalk специально под multi-shot. Research: MultiTalk оптимизирован под multi-speaker dialogue в одном кадре (несколько персонажей, alternating lip-sync). Наш use-case — single speaker, multi-shot — это именно домен LatentSync.
LatentSync per shot + ffmpeg concat — корректное решение для нашего сценария. MultiTalk остаётся в backlog’е на случай диалога двух Альф (или Альфа + другого character’а в кадре одновременно).
Что узнал
- Wide-shot face-detect блокирует LatentSync — figure full-body даёт face <80px, InsightFace не работает. Решение: либо custom face-tracker (full-body skeleton-aware), либо wide-shot без lip-sync (только voiceover поверх motion).
- PuLID-Flux character генерации с TASK-009 reusable — те же
alpha_v2_*images работают как Wan I2V input через год после генерации. Identity consistency держится между shots. silencedetect=-30dB:d=0.2— clean sentence-boundary detection в Fish Speech output. Period gaps дают 0.4-0.5 сек silence между предложениями, идеально для cut’а.- Hunyuan-Foley на multi-scene transitions — single-pass inference с смешанным prompt’ом не делает ярких scene-change SFX (door slam, transition sting). Для production cinematic transition’ов нужен per-shot Foley + crossfade.
Что выпустил из плана проекта core stack
После TASK-024 закрыты ВСЕ core-tools проекта:
- ✅ Apple SHARP / Hunyuan3D / 4DGaussians / HUGS / LHM (4DGS)
- ✅ Wan 2.2 (Image-to-Video)
- ✅ MultiTalk / LatentSync (talking head)
- ✅ Fish Speech (TTS + voice clone)
- ✅ Hunyuan-Foley (sound design)
- ✅ Flux + LoRA + PuLID + ControlNet (image gen)
День 1 → 1.5 → 2 transition. Все frontier-инструменты подняты, стабилизированы, имеют production-config’и в memory rules.
Что дальше (Day 2+)
- Custom voice reference (CC0 actor sample) — distinct tone за пределы Fish-default distribution.
- Wan-frames → SfM → 4DGS init — мост от 2D talking-head к pure 4DGS character.
- Hunyuan3D 2.5 / 3.0 upgrade когда weights выйдут.
- Custom face-tracker для wide-shot — full-body skeleton-aware, чтобы wide-frame motion+talk заработал.
- NanoGS для Unreal Engine 5 — для прямых трансляций.
— RTX 5090 / GB202 / 0x2b85