Как сейчас создаётся ролик Ларри

Актуальный процесс после правок этой сессии (2026-06-22). Пример: larry-final — 20 шотов, 78.8 сек.

Суть за 30 секунд

Раньше визуал «плыл» (персонаж менялся от кадра к кадру) и Veo при анимации морфил лица. Главный сдвиг этой сессии — нашли приём, который это убил:

чистый «эталон» персонажа на БЕЛОМ фоне по нему генерим каждую сцену Veo анимирует каждый кадр мелким движением склейка + озвучка + субтитры + музыка

Картинки рисуются на gemini-3-pro-image (Nano Banana Pro), движение — на Veo 3.1. Никакого Seedance: он умеет «раскадровка→цельный ролик», но он недоступен с нашего сервера (геоблок + капча), и на Veo этот трюк не переносится — поэтому делаем пошотно.

Что на входе (готовится заранее)

ЧтоФайлОткуда
Сценарий — 20 шотов: текст, что в кадре, какое движение, длина, тип планаscript-v6.jsonпрошлые сессии
Озвучка — готовая дорожка 78.8 сек + пословные таймингиv5/voice/shadow.mp3
voice.json
прошлые сессии (голос shadow)
Ассеты-рефы — персонаж, реквизит (кресло, шары, воздушка, столб), локации (двор, небо, улица)refs_v6/*.pngпрошлые сессии
★ ЭТАЛОН персонажа на белом фоне — главный новый элемент. Чистый Ларри без фона/мусора.larry_core_white.pngэта сессия
Эталон на белом — сердце метода. Сгенерён из старого char_larry.png командой «оставь персонажа точь-в-точь, замени фон на чистую белую студию». Чистый резкий персонаж без визуального шума → модель не тянет лишний свет/цвет/фон → личность не «плывёт» между сценами.

Этап 1 · Ключевые кадры production.py keyframes

20 статичных кадров — по одному на каждый шот

Для каждого шота:

Выход: kf/S1_start.png … S20_start.png. Между кадрами пауза 30 сек + ретраи — у pro-модели узкая минутная квота (429), иначе валится.

Только pro-модель. Flash (gemini-2.5-flash-image) быстрее и дешевле, но слабее — консистентность падает. Решено: картинки только на pro, квоту лечим паузами, не даунгрейдом.

Этап 2 · Анимация production.py clips

Каждый кадр → короткий видео-клип на Veo 3.1

Кадр отдаётся в Veo 3.1 как первый кадр (image-to-video), плюс промпт движения. Два режима — в этом вся защита от артефактов:

РежимКогдаЧто двигаетсяЗачем
FREEZE
(заморозка)
широкие/общие планы, где персонаж мелкийперсонаж замер полностью (голова/лицо неподвижны), двигается ТОЛЬКО окружение — шары, облака, проводамелкое лицо при движении Veo корёжит в «пластилин» → морозим = нет варпа
SUBTLE
(мягкое)
средние/крупные планылёгкое движение из сценария (поднял голову, привязал шар) + «рот закрыт, лицо солидное, один персонаж»мелкое движение → Veo нечего «выдумывать» → нет морфа

Промпт движения — JSON-структурный (через keyframe.build_animation_prompt): зафиксированная сцена + негативы (рот закрыт, анти-морф, анти-дубль, анти-варп). Клип режется в длину шота.

Выход: clips/S1_clip.mp4 … S20_clip.mp4. Вео 3.1-fast, 1-key (один кадр-источник), авто-ретрай на safety-блок.

Два артефакта Veo и их лечение (durable):
КЛОН (дорисовал второго Ларри на земле) → перегенерить с другим seed + в промпте «ровно один человек, область внизу пустая».
FACE-WARP (лицо плывёт к концу) → режим FREEZE: персонаж не двигается вообще.

Этап 3 · Сборка финала assemble.py

20 клипов → готовый ролик с озвучкой, субтитрами и музыкой

Выход: larry_final.mp4 → публикуется на домен.

Музыка bed_dich (твой любимый бид) был 34 сек — зациклен бесшовно (кроссфейд на стыках) до 78.8 сек + фейд в конце. Менять музыку/баланс = только пересобрать этот этап, перегенерация видео не нужна.

Почему именно так (3 решения, которые всё держат)

Что я менял в коде после прошлого бэкапа

ФайлЧтоВ бэкапе?
integrations/gemini/vertex_image_ref.pyдобавлен переключатель модели через env (по умолчанию pro — безопасно)да
outputs/larry-final/production.pyновый — оркестратор этого ролика (кадры + клипы)НЕТ (gitignore)
outputs/larry-final/assemble.pyновый — сборка финалаНЕТ (gitignore)
outputs/veo-method-test/*.pyскрипты обкатки метода (core-ref, чейн, фиксы s4)НЕТ (gitignore)

Использует готовые модули из pipeline/: keyframe.py (gen_start_frame, gen_animated_clip, build_animation_prompt), captions.py (субтитры), contracts.py.

Текущее состояние — честно

Это пока не «завод», а собранный вручную прогон. production.py/assemble.py — рабочие скрипты конкретно под Ларри, лежат в outputs/ (которая не в гите → в бэкап не попали, живут только локально на сервере). Метод доказан, но ещё не вшит в основной пайплайн (refpack/keyframe) как переиспользуемый.

Что предлагаю дальше (твой выбор):