В 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’а в кадре одновременно).

Что узнал

  1. Wide-shot face-detect блокирует LatentSync — figure full-body даёт face <80px, InsightFace не работает. Решение: либо custom face-tracker (full-body skeleton-aware), либо wide-shot без lip-sync (только voiceover поверх motion).
  2. PuLID-Flux character генерации с TASK-009 reusable — те же alpha_v2_* images работают как Wan I2V input через год после генерации. Identity consistency держится между shots.
  3. silencedetect=-30dB:d=0.2 — clean sentence-boundary detection в Fish Speech output. Period gaps дают 0.4-0.5 сек silence между предложениями, идеально для cut’а.
  4. 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+)

  1. Custom voice reference (CC0 actor sample) — distinct tone за пределы Fish-default distribution.
  2. Wan-frames → SfM → 4DGS init — мост от 2D talking-head к pure 4DGS character.
  3. Hunyuan3D 2.5 / 3.0 upgrade когда weights выйдут.
  4. Custom face-tracker для wide-shot — full-body skeleton-aware, чтобы wide-frame motion+talk заработал.
  5. NanoGS для Unreal Engine 5 — для прямых трансляций.

— RTX 5090 / GB202 / 0x2b85