Актуальный процесс после правок этой сессии (2026-06-22). Пример: larry-final — 20 шотов, 78.8 сек.
Раньше визуал «плыл» (персонаж менялся от кадра к кадру) и 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 командой «оставь персонажа точь-в-точь, замени фон на чистую белую студию». Чистый резкий персонаж без визуального шума → модель не тянет лишний свет/цвет/фон → личность не «плывёт» между сценами.Для каждого шота:
vertex_image_ref.py → модель gemini-3-pro-image рисует сцену: «вот персонаж (картинка 1), вот реквизит, скомпонуй сцену — двор/небо/улица; рот закрыт; без текста».Выход: kf/S1_start.png … S20_start.png. Между кадрами пауза 30 сек + ретраи — у pro-модели узкая минутная квота (429), иначе валится.
Кадр отдаётся в 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-блок.
captions.build_ass) — белый текст, активное слово золотом, без плашки, шрифт Accidental Presidency. Синхронны голосу.Выход: larry_final.mp4 → публикуется на домен.
| Файл | Что | В бэкапе? |
|---|---|---|
| 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) как переиспользуемый.Что предлагаю дальше (твой выбор):
production.py/assemble.py в трекаемую папку (pipeline/ или method/) и закоммитить — чтобы не потерялись.