Дупломатика — Производственный пайплайн v5
Полная техническая документация видео-завода канала. YouTube Shorts, RU, стиль Robot Chicken puppet. Порядок этапов и гейтов — v5 («режиссёрская» архитектура). Источник правды рецепта — эталонный прогон «Pepsi-флот».
Этот документ фиксирует ВСЁ: последовательность, что из чего вытекает, правила, команды, грабли. Источник правды — sandbox/oko/outputs/pepsi-navy/.
01Обзор: YouTube-завод и 4-слойная модель
YouTube-завод — не «сделать один ролик», а станок, который штампует ролики канала конвейером с зафиксированными наработками. Каждый фидбек/фикс уходит в ТЕХНИЧЕСКИЙ код пайплайна, а не в правку одного ролика (иначе наработки теряются между итерациями).
Всё производство разложено на 4 слоя. Ключевой закон — параметр живёт на самом ВЫСОКОМ слое, где остаётся постоянным. Это не даёт правкам расползаться и наработкам теряться.
ASCII-версия 4-слойной модели
┌──────────────────────────────────────────────────────────────┐
│ ЯДРО (станок, channel-agnostic, неизменный) │
│ контракты данных · оркестрация стадий · тех-формат │
│ адаптеры Grok/Vertex/TTS · рендер · БИБЛИОТЕКА возможностей │
│ (шрифты · голоса · переходы · FX · саунд — реализованы ОДИН раз)│
├──────────────────────────────────────────────────────────────┤
│ КАНАЛ (Дупломатика) — идентичность │
│ персона/маскот/тон/аудитория/баны │
│ инварианты бренда (акцент-цвет, личность рассказчика) │
│ CHANNEL_ANCHOR (мастер-референс мира → биндится во все кадры) │
├──────────────────────────────────────────────────────────────┤
│ ФОРМАТ (байка-анекдот) — структура │
│ каденс/длина/метод/гейты/скрипт-рецепт │
│ подформаты (монолог / диалог) │
├──────────────────────────────────────────────────────────────┤
│ СТИЛЬ (залочен) — сенсорный комплекс │
│ LOOK/палитра/style_prompt/якоря персонажей │
│ шрифты субтитров · голоса · переходы · FX · музыка · грейд │
└──────────────────────────────────────────────────────────────┘Закон размещения (примеры)
| Параметр | Слой |
|---|---|
| Личность рассказчика (надменный дупель) | КАНАЛ |
| Тембр/пресет голоса (playboy→shadow) | СТИЛЬ |
| Каст персонажей ролика (банка-командир, Сталин) | ПОДФОРМАТ |
| FX реализован как код (word-pop сабы, subscribe-анимация) | ЯДРО |
Принцип capability / binding: возможность реализуется в ЯДРЕ один раз; форма (канал/формат/стиль) только ВЫБИРАЕТ подмножество на своём слое. Пример: ядро умеет рендерить любой .ass-стиль сабов → канал ВЫБИРАЕТ word-pop караоке + шрифт Accidental Presidency.
Нейминг: generic-по-функции для переиспользуемого (core/keyframe/compose/voice), имя собственное — только для channel/format/style (profile_dich, style_robotchicken).
02Слой КАНАЛ — Дупломатика (ДНК)
Источник правды: pipeline/profile_dich.py.
Имя и суть
- «Дупломатика» (запасное — Дупло). Обыгрывает «диплом/дипломатика» + дупло дерева. Заменяет рабочее «ДИЧЬ»/«OKO».
- Формат — faceless (без лица): контент доходит ТОЛЬКО через голос + монтаж. Значит текст пишется под ухо диктора, а не под чтение глазами.
Маскот-рассказчик
- Птица киви-«дупель»: плотный коричневый, длинный изогнутый клюв, надменно-прищуренный циничный взгляд (приподнятая бровь, полуопущенные веки), пренебрежительный жест крылом. Тёплый янтарно-коричневый свет, мягкий 3D.
- Якорь консистентности:
~/sites/duplo-brand/mascot_dupel_anchor2.png. - Рассказчик повествует СО СТОРОНЫ, с превосходством, подъёбом и сухим цинизмом. НЕ глумится над жертвой — бьёт по системе/нелепости.
Тон (ядро канала)
Регистр: смешно · курьёзно · абсурдно · с подъёбом · цинично (НЕ высокий эпос ERA, НЕ научно-сухое).
Тон живёт ВО ВСЁМ — монтаж И концепция, не только текст. «Мемный монтаж» обязателен; научно-сухой ролик = мимо.
4 формулы тона (profile_dich.TONE), ≥2 на ролик (де-факто цель выше — панч почти на каждый бит):
- подъёб — подкол героя/ситуации/зрителя;
- цинизм-добивка — сухой итог в КОНЕЦ эпизода, бьёт по системе;
- абсурд-гипертрофа — раздуть цифру нелепым бытовым сравнением;
- курьёз — подать факт как анекдот.
Целевая аудитория
Максимально широкая: мужчины и женщины 15-60+, без спецзнаний. Тест: если хоть один (школьник ИЛИ пенсионер) не поймёт фразу/кадр — упростить. Никакого жаргона без объяснения.
CHANNEL_ANCHOR — мастер-референс мира
brand/channel-anchor/CHANNEL_ANCHOR.png+ спекаbrand/channel-anchor/ANCHOR-SPEC.md.- Одна богатая картинка, фиксирующая ВСЮ визуальную ДНК мира (3 кукольных персонажа + абсурдная бытовая катастрофа + разнофактурный реквизит + детализированный миниатюрный сет).
- Биндится во все будущие ассеты/кадры через
vertex_image_ref→ единый кукольный мир. Залочен.
Акцент-цвет
FFC23D (золото) — фирменный акцент, активное слово в субтитрах (profile_dich.ACCENT_HEX).
03Слой ФОРМАТ — байка-анекдот с моралью
Формат канала — байка-анекдот: ОДИН яркий герой ИЛИ абсурдный эпизод с аркой, из которого ВЫТЕКАЕТ циничная мораль. (Выведено из 6 эталонных сценариев: Люстиг, Макгрегор, Паркер, война с эму, безголовый Майк, биткоин-свалка.)
Каркас 5 битов
- ХУК — in medias res, факт-шок в первой фразе (БЕЗ «сегодня мы…» / «родился в…»).
- КУРЬЁЗ — герой подан как анекдот.
- ОКСЮМОРОН — абсурдный твист «и вот тут самое смешное».
- АБСУРД-ГИПЕРТРОФА — бытовое сравнение (раздуть цифру наглядно).
- ЦИНИЗМ-ДОБИВКА + ЗАКОЛЬЦОВКА — мораль «так что в следующий раз… вспомни про парня, который…».
Критерии отбора идей (приоритет)
- format_fit — ДОМИНАНТА (яркий герой/эпизод с аркой, пересказуемо как байка; вечнозелёное).
- moral_closer.
- absurd_twist.
- hook.
- freshness / yt_gap — ВТОРИЧНЫЕ тай-брейкеры (свежесть — приправа, не блюдо; новости-заметки в каркас не лезут).
Скаут идей ОБЯЗАН якориться на sandbox/oko/voice-and-script/*-short.md.
Драматургия интриги — ТОМИТЬ до финала
Твист-разгадку («СССР платил флотом за газировку») поставили ВТОРОЙ фразой — убили загадку. «А нахуя так быстро раскрываешь интригу?!»
Правило: вопрос-хук/загадка ТОМЯТСЯ до кульминации. После хука → ДЕРЖАЛКА (заверение/поднятие ставки без спойлера: «звучит как бред, но это правда») → ключевое раскрытие приберечь на финал, где бьёт как осознание.
viewer-агент СОГЛАСИЛСЯ что «твист во 2-й фразе держит» и ошибся. Симулированный зритель не заменяет чутьё Тимура — вердикт по драматургии перепроверять.
Инструмент сценария
- Skill
era-style-script(Claude-в-цикле) — каркас реверс-инжиниринг ERA MMA, тон переориентирован на наш. - Рецептура:
sandbox/oko/voice-and-script/SCRIPT-RECIPE.md(53KB) — 7 формул панча, метафор-домены, эвфемизмы-добивки. - Read-aloud gate — смешно ли ВСЛУХ.
- Viewer-test — 3 симулированных зрителя перед сдачей (но чутьё Тимура перепроверяет вердикт).
Формула длины (profile_dich.SCRIPT_TARGET)
- target: 60-80с (макс 1:20); темп playboy ~2.4 слова/сек → бюджет 150-190 слов, hard_max 200.
- Писать СРАЗУ под бюджет плотно (панчи), НЕ «250 слов → нарезать → потерять смысл».
- НИКОГДА не резать подъёбы/панчи ради секунд — резать только связочный жир/канцелярит.
Ключевые правила письма (oko-script-rules)
- НЕТ длинных тире (—) — рвут озвучку на слух. Внутри фраз точки/запятые.
- Каждая фраза РАСКРЫВАЕТ суть, не намекает. Канцелярит → бытовое.
- НЕТ прямых реплик в кавычках — рассказчик всегда СО СТОРОНЫ, косвенно.
- Фирменная ДОБИВКА-формула в финале обязательна.
- Каждое противопоставление ОБЯЗАНО закрываться панчем («X, а не Y» без укуса = мёртвая фраза).
- Редактуру Тимура вносить ВЕРБАТИМ, не переписывать.
04Слой СТИЛЬ — сенсорный комплекс (залочен)
LOOK — Robot Chicken puppet
Источник: pipeline/style_robotchicken.py — STYLE_PROMPT (добавляется в КАЖДЫЙ кадр Imagen), KEY_ATTRIBUTES, NEGATIVES. AD не выдумывает лук — он залочен здесь; AD решает только раскладку истории по битам.
Суть: взрослый stop-motion, ФИЗИЧЕСКИЕ КУКЛЫ/МИНИАТЮРА — видимые шарнирные суставы и швы, матовые лепленые лица, чуть утрированные пропорции экшн-фигурок, РЕАЛЬНАЯ сшитая ткань. НЕ мультик, НЕ пластик, НЕ глянец, НЕ фотореал, НЕ Aardman/пластилин. Жёсткий направленный свет, резкие тени, лёгкая грязь. Снято «изнутри самодостаточного мира как если бы он был реальным» — не миниатюра на столе, без человеческих рук.
Слово «Photoreal» и требования injection-molded plastic / tabletop DoF воевали с puppet/fabric-промптом → фотореал-дрейф + safety-блок лиц у Veo. Приведено к ОДНОМУ непротиворечивому медиуму — осязаемая кукла.
Палитра канала
| Роль | HEX |
|---|---|
| Красный | A41018 |
| Серый | D1D2D0 / C0C2C0 |
| Бирюза | 1CE2B4 |
| Акцент субтитров (золото) | FFC23D |
Грейд: мутная, слегка грязная, гритти-палитра (dusty primaries, yellowed whites).
Субтитры (залочено)
- Word-pop караоке (стиль Б, как i11ush): пословно по центру, белый жирный гротеск + толстая чёрная обводка, БЕЗ плашки, активное слово — золото
FFC23D. - Формат .ass V4+. Шрифт «Accidental Presidency (Rus by Lomzz)» — файл
assets/fonts/Accidental-Presidency-Rus.ttf. - В Pepsi-сборке (
build_final_pepsi.py):Fontsize 128,Outline 9,Shadow 3,PER_LINE 3, difflib-выравнивание читаемогоscript.txt↔ whisper-таймингов.
Голос (залочен)
- Клон playboy (
CtLRZDtn8Xgr90sVZl7u) → STS shadow в Brian (nPczCjzI2devNBz1zQrb) = ФИНАЛ канала. Shadow = voice-conversion (speech-to-speech), НЕ фильтр. - Модель TTS —
eleven_v3(2026-07-03; та же цена что v2, лучше контекст/просодия). STS-этап остаётсяeleven_multilingual_sts_v2(v3 STS нет). - Пресет длинного текста —
dich_stable(stability 0.85 / sim 0.85 / style 0.05 / speed 1.0).--chunkобязателен для >40с (иначе EL плывёт к середине). - Альт ровный диктор: ERA Narrator
MesHavvgW96DAQ3Us2o3(НЕ использовать без явной просьбы — это канон чужого канала). - Хелперы:
.claude/skills/voice-clone-channel/helpers/el.py. - Ключ:
~/.claude/.accounts/elevenlabs.env.
eleven_v3 ИГНОРИТ voice_settings.speed и <break>-теги.
- Ускорение речи — ТОЛЬКО ffmpeg
atempo(постпрод, питч сохранён). Pepsi: ×1.3 = 73с от базовых ~96с. - Паузы — ТОЛЬКО ffmpeg-склейкой блоков с тишиной (
gen_voice_paused.py), не тегами. - Считать хронометраж по
ffprobe, не по номинальному множителю.
Числа и год ПИСАТЬ ПРОПИСЬЮ в TTS-тексте («1989» → «тысяча девятьсот восемьдесят девятый»). Держать отдельный *-tts.txt (прописью) рядом с читаемым *.txt (цифрами). Омографы — combining acute (U+0301) над гласной, per-occurrence, НЕ словарь.
Музыка / FX
- Марш ролика — EL Music
/v1/music(Pepsi: советский комичный/имперский). Микс мягким дакингом под голос. - Grok-SFX — звук из видео-клипов = SFX-слой.
- Иерархия микса: голос
1.0≫ марш~0.42> Grok-SFX~0.28. Дакинг мягкий (sidechaincompress ratio 3, НЕ 8 — иначе музыку задавит в ноль).
05Пайплайн v5 — этапы и гейты
Источник правды: docs/PIPELINE-V5.md (задан Тимуром 2026-07-04). v5 заменяет ПОРЯДОК ЭТАПОВ И ГЕЙТОВ v3/v4. Технические рецепты операций (озвучка v3, Grok i2v, монтаж, брендинг — раздел 07) НЕ меняются — v5 определяет, КОГДА и КЕМ они вызываются.
Принцип: система работает как часы. Центральная роль — РЕЖИССЁР. Ничего дорогого не генерится, пока нет утверждённого концепт-пакета.
Никаких параллельных согласований. Ассеты / кадры / музыка — не «ветки», а выходы режиссёрского пакета. Всё вытекает из режиссёрской проработки (этап 2).
5 этапов
| Этап | Роль | Что происходит | Выход |
|---|---|---|---|
| 0 · Поиск идей | scout | Тренды YouTube (аномалии в жанре), вирусные ролики, статьи, новости, Reddit/Wikipedia. Фильтр жанра: байка-анекдот (format_fit — доминанта). Политика/война/чернуха = мусор | 10-15 карточек: ideas/candidates-YYYY-MM-DD.json + HTML-лист |
| 1 · Тиндер-отбор | Тимур | Гейт A: да / нет / отложить по карточкам. Пока интерфейса нет — HTML-страница + ответ текстом («беру №3 и №7») | ideas/approved-<дата>.json |
| 2 · Концепт-пакет | РЕЖИССЁР + критик | Ядро v5, см. раздел 06: 2-3 диаметральных концепта → оценка критика → полная проработка топ-концепта (сценарий, озвучка, раскадровка, музыка, ассеты, промпты кадров, тайминги, обложка) | outputs/<slug>/concept-package/ + HTML-страница пакета |
| 3 · Ключевые кадры | producer | Keyframes по промптам пакета (vertex_image_ref, реф-биндинг, style locked) | storyboard/*.png + HTML-галерея |
| 4 · Шоты + склейка | producer | Без промежуточных показов: Grok i2v по всем шотам (⚡ASK — платно) → монтаж (обрезка+concat+микс+word-pop сабы) → брендинг (pipeline/build_branding.py) → публикация | final/<slug>_final_cover.mp4 + duplomatika.obahoba.com/<slug>/ |
4 гейта (все — Тимур)
| Гейт | После этапа | Что согласуется | Вердикты |
|---|---|---|---|
| A · Тиндер | 0 | Карточки идей | да / нет / отложить |
| B · Пакет РАЗОМ | 2 | ВЕСЬ концепт-пакет одним согласованием | утвердить / выбрать другой концепт (→ пересборка) / правки точечно |
| C · Кадры | 3 | Keyframes. Кривой кадр = база-реф + точечный промпт правки, НЕ перегенерация с нуля | правки точечно |
| D · ГОТОВЫЙ ролик | 4 | Один финальный артефакт: склейка + звуки + музыка + озвучка + сабы + вотермарк + subscribe + вшитая обложка | правки → точечные доработки → пересборка |
4 роли (субагенты, все — opus)
| Агент | Этапы | Зона | Файл |
|---|---|---|---|
| duplo-scout | 0 | поиск и скоринг историй, карточки на тиндер | .claude/agents/duplo-scout.md |
| duplo-director | 2 | концепты, сценарий, раскадровка, музык-промпт, промпты кадров, обложка-концепт — думает и пишет, НЕ генерит | .claude/agents/duplo-director.md |
| duplo-critic | 2.2 | комплексная оценка креативности концептов (идея+сценарий+раскадровка+визуал как единое), вердикт | .claude/agents/duplo-critic.md |
| duplo-producer | 2.3, 3, 4 | исполнение генераций по эталон-скриптам pepsi-navy, все грабли в голове | .claude/agents/duplo-producer.md |
Оркестрация — главная сессия: ведёт этапы, дёргает агентов, держит гейты, сдаёт Тимуру.
Что изменилось против v4
| Было (v4) | Стало (v5) |
|---|---|
| 7 гейтов по отдельности (сценарий → озвучка+ассеты → раскадровка → промпты → кадры → видео) | 4 гейта: A тиндер / B концепт-пакет ЦЕЛИКОМ / C кадры / D готовый ролик |
| Режиссура размазана (shotlist/director по остаточному принципу), ассеты и кадры выглядели «параллельной веткой» | РЕЖИССЁР — центральный этап. Всё (ассеты, кадры, музыка, обложка, тайминги) ВЫТЕКАЕТ из режиссёрской проработки |
| Один вариант подачи | 2-3 диаметрально разных концепта подачи на выбор |
| Музыка ad-hoc (march.mp3 без скрипта) | Музыка — часть режиссуры: промпт продумывает режиссёр, генерация кодифицирована (pipeline/gen_music.py) |
| Согласование сырых шотов | Финальный гейт — ГОТОВЫЙ ролик со всем брендингом |
| Оценки креативности нет | Критик оценивает концепт КОМПЛЕКСНО, с обоснованием |
Контракты между этапами (файлы)
ideas/candidates-<дата>.json → гейт A → ideas/approved-<дата>.json
outputs/<slug>/concept-package/ → гейт B (утверждённый пакет = источник правды ролика)
outputs/<slug>/storyboard/ → гейт C
outputs/<slug>/final/<slug>_final_cover.mp4 → гейт D
Как этапы v5 вызывают операции v4
Важно: 11 шагов из раздела 07 — это библиотека рецептов операций (команды, скрипты, грабли). Они никуда не делись, но живут не как конвейер с 7 гейтами, а как операции, которые этапы v5 вызывают в своём порядке:
| Этап v5 | Операции (шаги v4) |
|---|---|
| 2 · Концепт-пакет | ш.1 сценарий · ш.2 озвучка · ш.3 whisper+раскадровка · ш.10 марш (gen_music.py) + обложки · ш.4 ассеты (мастер-рефы в пакет) |
| 3 · Ключевые кадры | ш.5 keyframes |
| 4 · Шоты + склейка | ш.6 Grok i2v · ш.7 монтаж · ш.8 CapCut (опц.) · ш.9 брендинг (build_branding.py) · ш.11 обложка-в-конец |
06РЕЖИССУРА — как из истории рождается кадр
Самый важный раздел: отвечает на вопрос «каким промптом делается кадр?» — дословно, на реальном материале эталона Pepsi-флот. Роль — duplo-director (этап 2 v5). Источники всех цитат: outputs/pepsi-navy/raskadrovka.md, gen_full_keyframes.py, gen_grok_videos.py, pipeline/style_robotchicken.py.
6.1 Что решает режиссёр (и чего НЕ решает)
Стиль канала залочен (RC puppet, палитра, голос playboy→shadow, word-pop сабы) — режиссёр НЕ выдумывает лук. Его зона:
- Драматургическая раскладка — какой бит озвучки на какой шот, где резы (по панчам, 2-3.5с, на хуке 2-2.3с).
- Каждый шот — план (крупность) · камера (ракурс/движение) · свет · действие в кадре · SFX-бриф · реф-биндинги (какие ассеты в кадре).
- Сквозное видение — как шоты складываются в последовательность после склейки (6.5).
- Промпты кадров — сцена image-промпта + motion-промпт + звуковой бриф на каждый шот.
- Музыка — промпт для EL Music под тему ролика (6.6).
6.2 Цепочка «бит → шот»: как думает режиссёр
Каждая строка раскадровки — это решение: бит сценария → драматургическая функция шота → конкретика кадра. Реальные примеры из raskadrovka.md Pepsi (73.3с, 24 шота, таймкоды выверены по whisper):
| Шот | Бит озвучки (whisper) | Функция | План + камера | Действие + свет | SFX-бриф | Рефы |
|---|---|---|---|---|---|---|
| 1 (0.0–2.3) | «Зачем Pepsi купила подлодки?» | ХУК — визуальный ШОК-образ вопроса, не титул. Рез 2.3с — зона максимальной утечки | быстрый push-in | Банка Pepsi командиром на рубке ржавой подлодки, море, серое небо | подводный дрон, стук-БУМ | pepsi_can + sub |
| 16 (39.0–43.6) | панч «ни единого патрона» | АБСУРД-ЭСКАЛАЦИЯ / sight-gag на панче — визуальная шутка синхронно с текстовым панчем | статика → snap на струю | Банка в фуражке, «пушка» выстреливает струёй газировки, не снарядом | пшик-выстрел комедийный | pepsi_can |
| 22 (64.5–68.3) | твист «не Pepsi покупала» | ТВИСТ — визуальный переворот «кто кому платил», момент осознания | медленный push на обмен | Переворот: советский чиновник ОТДАЁТ флот, жадно хватает баночку Pepsi | reveal-sting, вздох | soviet_official + pepsi_can |
| 24 (71.6–73.3) | финал-панч «сироп со вкусом колы» | ЭХО-ПЕТЛЯ — повтор кадра шота 1, но смысл уже перевёрнут; retention-закольцовка | crane up / pull back | ЭХО шота 1: банка на рубке подлодки, смысл ясен | финальный аккорд + пшик | pepsi_can + sub |
Дальше — как ровно эти режиссёрские решения превращаются в промпты.
6.3 Анатомия промпта кадра (image, Vertex gemini-3-pro-image)
Финальный промпт кадра не пишется одним куском — он СКЛАДЫВАЕТСЯ из 4 текстовых слоёв + реф-биндингов. Формула сборки — реальный код gen_full_keyframes.py:
CRAFT = "; ".join(KEY_ATTRIBUTES[:7]) # из pipeline/style_robotchicken.py
prompt = f"{STYLE_PROMPT}\n\nSHOT: {scene}\n\nKey craft: {CRAFT}\n\nKeep every referenced figure/object IDENTICAL to its reference image (same colors, shapes, cartoon face). NO realistic human face on the can."
# рефы идут НЕ текстом, а image-input'ами (позиционные аргументы CLI):
# vertex_image_ref.py <out.png> 9:16 assets/soviet_official.png assets/pepsi_can.png <<< prompt
Слой 1 — STYLE_PROMPT (залоченный, pipeline/style_robotchicken.py)
Добавляется в КАЖДЫЙ кадр канала. Режиссёр его НЕ трогает. Дословно:
A still frame from an ADULT STOP-MOTION ANIMATED comedy TV show. EVERYTHING in frame is unmistakably a PHYSICAL HANDMADE PUPPET or MINIATURE — clearly articulated action figures, NOT real people, NOT photoreal, NOT live-action photography: visible ball-joint seams, matte sculpted faces, slightly exaggerated action-figure proportions, real sewn fabric clothing on small figures, a clearly handmade miniature set. CRUDE ADULT stop-motion animation in the irreverent action-figure sketch-comedy school (Robot Chicken vein) — absolutely NOT a cute children's cartoon, NOT soft felt or plush, NOT plasticine/clay, NOT Aardman, NOT a warm storybook, NOT glamour-lit. Edgy, satirical, deadpan, a little gritty. Filmed from INSIDE a complete self-contained world as if it were real — never a miniature on a table, never a diorama on a workbench, no human presence, no human hands, no real-world human-scale objects. Characters are detailed CUSTOM ARTICULATED ACTION FIGURES with realistic adult proportions and sharply sculpted, slightly exaggerated expressive faces (NEVER baby-cute, NEVER chibi); visible ball-and-socket articulation; REAL SEWN FABRIC clothing — actual woven cloth with stitched seams, wrinkles and wear (NEVER molded plastic clothes). Real physical materials: rubber/latex, painted weathered metal, real wood, real cloth — NOT felt, NOT plush. Environments are fully built believable places, period- and place-accurate to the story, made of real tactile materials, dressed with depth and grime. HARD directional practical lighting with crisp shadows and a slightly harsh edge — not soft, not cozy. Natural-perspective camera at eye level, normal lens, realistic depth (NO tilt-shift fake-miniature blur). Tangible handmade stop-motion craftsmanship with a deliberate handmade, slightly rough adult edge — clearly an articulated PUPPET, NEVER a real photographed human.
Перевод сути: «кадр взрослого stop-motion шоу; всё в кадре — физическая кукла/миниатюра с видимыми шарнирами и настоящей сшитой тканью; НЕ фотореал, НЕ детский мультик, НЕ пластилин; снято изнутри самодостаточного мира, без человеческих рук; жёсткий направленный свет». Слово «Photoreal» из промпта убрано намеренно — грабля Phase D E2: триггерило фотореал-дрейф + safety-блок лиц.
Слой 2 — SHOT: <сцена> — единственное, что режиссёр пишет per-shot
Реальная сцена шота 22 (твист) из gen_full_keyframes.py, дословно:
SHOT: the Soviet general (=ref1, IDENTICAL) hands over a whole fleet of submarines behind him while greedily grabbing a single small can-commander (=ref2, IDENTICAL). Reveal moment, dramatic light.
Перевод: «советский генерал (=реф1, ИДЕНТИЧЕН) отдаёт целый флот подлодок за спиной, жадно хватая одну маленькую банку-командира (=реф2, ИДЕНТИЧНА). Момент раскрытия, драматичный свет». Обрати внимание: режиссёр указывает =ref1 / =ref2 — привязку персонажей к порядку картинок-рефов, слово IDENTICAL — требование не перерисовывать персонажа, плюс драматургию света («Reveal moment, dramatic light» — свет здесь работает на твист).
Для сравнения — сцена шота 1 (хук):
SHOT: the can-commander (=ref1, IDENTICAL can body/cap/cartoon-face) stands on the conning tower of the rusty submarine (=ref2) at sea, grey overcast sky, hard light. Can-commander is hero.
«Банка-командир (=реф1, ИДЕНТИЧНЫ корпус/фуражка/мультяшное лицо) стоит на рубке ржавой подлодки (=реф2) в море, серое пасмурное небо, жёсткий свет. Банка-командир — герой кадра».
Слой 3 — Key craft: — первые 7 атрибутов KEY_ATTRIBUTES
Тоже залочены, усиливают ключевые свойства медиума:
Key craft: AAA+ custom articulated PUPPET figures — visible ball-and-socket joints, real adult proportions, sharply sculpted slightly exaggerated faces; Matte sculpted skin and faces — no plastic sheen, no glossy toy surface; tactile painted finish; REAL SEWN FABRIC clothing — actual woven cloth, stitched seams, wrinkles and wear (never molded plastic clothes); Real physical materials — rubber/latex, painted weathered metal, real wood, real cloth (not felt, not plush, not clay); Detailed miniature handcrafted toy WORLD — fully built believable places of real tactile materials, dressed with depth and grime; Hard single-source practical light — razor-sharp directional shadows, slightly harsh edge, not soft, not cozy; Deadpan absurdist figure posing — symmetrical but slightly off-kilter framing
Слой 4 — хвост консистентности (один на все шоты с рефами)
Keep every referenced figure/object IDENTICAL to its reference image (same colors, shapes, cartoon face). NO realistic human face on the can.
«Держи каждую референсную фигуру/объект ИДЕНТИЧНОЙ картинке-референсу (те же цвета, формы, мультяшное лицо). НИКАКОГО реалистичного человеческого лица на банке» — вторая фраза лечит конкретную граблю Pepsi: модель рисовала банке человеческое лицо.
Слой 0 — реф-биндинги (не текст, а картинки)
Консистентность персонажей решается ТОЛЬКО передачей мастер-рефов как image-input. Шот 22: refs=["soviet_official","pepsi_can"] → в модель уходят assets/soviet_official.png + assets/pepsi_can.png. Правило: часто-повторяющиеся персонажи/сеты — рефами (1-3), разовые локации/пропы — текстом в сцене. Без рефа модель заново выдумывает персонажа и палитру.
- бренды и читаемый текст в кадре — НЕЛЬЗЯ (Imagen/Veo режут IP): банка Pepsi = «blue-red-white soda can, unbranded, no readable logo»; ценники = «illegible squiggles»;
- узнаваемый мем-образ > историческая точность (чиновник = Сталин, а не «generic official 1989»);
- лица людей — только кукольные (фотореал = safety-блок);
- свет — часть драматургии («dramatic light» на твисте, «hard desk light» на бытовом абсурде, «sunset contour light» на финал-петле).
6.4 Анатомия motion-промпта (Grok i2v)
Видео = keyframe + motion-промпт. Формула сборки — реальный код gen_grok_videos.py:
NOSPEECH = "NO speech, no dialogue, no voices, no singing, no music with vocals — sound effects and ambience ONLY."
full = f"{prompt} {NOSPEECH}"
# запуск: syntx.py grok-i2v <keyframe.png> "<full>"
Два блока: [движение камеры/действие + Sound: SFX-бриф] + [обязательный NOSPEECH-хвост].
Реальный промпт шота 22 (твист), дословно:
Slow push-in: the Stalin-like leader greedily clutches the little can-commander as the fleet sits behind him. Sound: a dramatic reveal sting, a small greedy chuckle-less gasp, warehouse tone. NO speech, no dialogue, no voices, no singing, no music with vocals — sound effects and ambience ONLY.
«Медленный наезд: вождь-как-Сталин жадно сжимает маленькую банку-командира, флот стоит за его спиной. Звук: драматичный reveal-стинг, короткий жадный вздох, гул склада» + запрет речи.
И шота 16 (sight-gag на панче):
The little side cannon fires a splashing jet of dark soda instead of a shell, fizzing. Sound: fizzy pressurized spray-shot, comedic pop, liquid splatter. NO speech, no dialogue, no voices, no singing, no music with vocals — sound effects and ambience ONLY.
Почему так:
- движение пишется ОТ keyframe — Grok анимирует готовый кадр и сам держит консистентность от него (рот-лок эпохи Veo больше не нужен); режиссёр описывает только ЧТО движется (камера/объект/среда);
Sound:— потому что Grok генерит звук сам, и этот звук = наш SFX-слой финального микса (volume ~0.28);- NOSPEECH-хвост обязателен в КАЖДОМ промпте: речь/вокал из клипа конфликтуют с нарратором shadow, который идёт поверх.
6.5 Сквозное видение — шоты как последовательность
Главное отличие режиссуры от «нарезки сценария на картинки»: режиссёр обязан видеть ролик ПОСЛЕ склейки. Как это сделано в Pepsi (из «Связки / непрерывность» в raskadrovka.md):
- Лейтмотив-персонаж: банка-командир (
pepsi_can) — один мастер-реф во ВСЕХ шотах с банкой (1, 3, 5, 15, 16, 21, 22, 23, 24). Её арка = визуальная эскалация ролика: командир на рубке (хук, шот 1) → монарх-держава на троне с армадой (шот 15) → пушка стреляет газировкой (шот 16) → победитель на горе долларов (шот 21) → предмет вожделения Сталина (твист, шот 22) → эхо-петля (шот 24). - Повторы-якоря: один реф на персонажа/сет по всему ролику — kendall (шоты 4, 17, 18: озадачен → самодоволен → понты), soviet_official (11 → 22: даёт флот → в финале хватает газировку = переворот), sub (1, 5, 13, 19, 24), fleet_dock (2, 11, 12, 14, 15), moscow_street (6, 7, 23).
- Ритм резов: 2-3.5с, на хуке 2-2.3с (не отпустить палец в зоне максимальной утечки), рез ПРИВЯЗАН к панчу озвучки (whisper-таймкоды). Sight-gags — точно на панчах (шоты 13 весы, 16 пушка, 19 зонтик, 21 моль из кошелька).
- Чередование крупностей: не 5 общих подряд — макро (5, 8, 21) перемежается сетами (2, 6, 10, 20) и hero-планами (15, 22).
- Цветовая арка: холодный серый СССР ↔ тёплый корпоративный Pepsi; в финале сходятся на кадре обмена (шот 22).
- Финал-петля (retention): шот 24 = эхо кадра шота 1, но зритель уже знает разгадку — визуальное закольцевание под финал-панч.
В v5 это оформлено требованием к режиссёру: в раскадровке ЯВНО прописывать связки («шот 7 отвечает шоту 2», «здесь пик абсурда») — каждый кадр продуман и сам по себе, И как звено последовательности.
6.6 Музыка как режиссёрское решение
- Направление стиля залочено (
style_robotchicken.MUSIC):melodic sarcastic theme sustaining ironic mood throughout, with a drop on the punchline— мелодичная саркастичная тема, ироничный тон, drop на панчлайне. - Тему под ролик задаёт режиссёр: для Pepsi — советский комично-имперский МАРШ (сатира на «державу»); в раскадровке прописано где музыка работает на кадр: «пафос-хор (сатира)» на троне-державе (шот 15), «грустный trombone» на пустом кошельке (шот 21), «финальный аккорд» на петле (шот 24).
- Генерация кодифицирована:
pipeline/gen_music.py(EL Music/v1/music; платно — ASK) →march.mp3в пакет. - Микс — автоматика (голос 1.0 ≫ марш ~0.42, мягкий дакинг sidechaincompress ratio 3), но пики/паузы музыки — решение режиссёра.
Точный текст промпта Pepsi-марша не зафиксирован — на эталонном прогоне марш генерился ad-hoc (см. раздел 13). С v5 промпт музыки — обязательная часть концепт-пакета (music-prompt.md), дыра закрыта gen_music.py.
07Библиотека операций — 11 рецептов (наследие v4)
Эталон: outputs/pepsi-navy/, ролик 73с, 24 шота.
Это НЕ порядок конвейера, а библиотека рецептов операций — команды, эталон-скрипты и грабли каждого шага. Порядок и гейты определяет раздел 05: этап 2 вызывает ш.1-3 + ш.10 + ш.4; этап 3 — ш.5; этап 4 — ш.6-9 + ш.11. Нумерация шагов сохранена v4-шная, чтобы не ломать ссылки из эталон-скриптов и памяти.
Поток v5 — кто какие операции вызывает (ASCII)
идеи (scout) ──► тиндер [гейт A] ──► КОНЦЕПТ-ПАКЕТ (РЕЖИССЁР: ш.1 сценарий + ш.2 озвучка +
ш.3 раскадровка + ш.10 музыка/обложка + ш.4 ассеты)
[гейт B: ВСЁ РАЗОМ]
│
▼
кадры (ш.5 keyframes) [гейт C]
│
▼
шоты + склейка (ш.6 Grok → ш.7 монтаж → ш.8 CapCut опц. →
ш.9 брендинг → ш.11 обложка-в-конец)
[гейт D: ГОТОВЫЙ ролик] ──► публикацияШаг 1 — Сценарий
- Вход: идея/история (byaka-анекдот format_fit).
- Инструмент: skill
era-style-script. - Выход:
voice-and-script/pepsi-navy-short.txt(читаемый, цифрами) +.md. - Правила: хук-ВОПРОС + твист-переворот в ФИНАЛ (интригу НЕ раскрывать рано), панч на каждый бит, добивка-формула. viewer-test 3 зрителя + read-aloud gate.
- Грабли: твист во 2-й фразе убивает загадку; голый контраст без панча = брак.
Шаг 2 — Озвучка (v3)
- Вход:
*.txt→ адаптированный*-tts.txt(числа/год прописью, ударения размечены). - Инструмент: ElevenLabs
eleven_v3, playboy → STS shadow (Brian). Эталонный скрипт:gen_voice_paused.py(блочная генерация со смысловыми паузами через ffmpeg-склейку + STS).
Команда (канон через el.py):
el.py tts CtLRZDtn8Xgr90sVZl7u out_playboy.mp3 --text-file s-tts.txt --preset dich_stable --chunk --model eleven_v3
el.py sts nPczCjzI2devNBz1zQrb out_playboy.mp3 out_shadow.mp3
- Пресет:
dich_stable= stability 0.85 / sim 0.85 / style 0.05 / speed 1.0.--chunkобязателен >40с. - Ускорение: ffmpeg atempo (Pepsi ×1.3 = 73с). Пауза-блоки: хук 0.7с, держалка 0.5с, перед финалом 0.6с, обычные стыки 0.3-0.4с.
- Выход:
shadow_pepsi_final.mp3(финал = shadow). - Грабли: v3 игнорит speed/break-теги — только atempo + ffmpeg-паузы.
Шаг 3 — Whisper-раскадровка
- Вход: финальная озвучка
shadow_pepsi_final.mp3. - Инструмент: Whisper (word-level) →
out/whisper/shadow_pepsi_final.json. - Выход:
raskadrovka.md— 24 шота под РЕАЛЬНЫЕ таймкоды озвучки, резы привязаны к панчам. - Правила: рез 2-3.5с; на хуке 2-2.3с (не отпустить палец в зоне максимальной утечки). Шот 1 = визуальный ШОК-образ хука, не титул. Финал (шоты 24) = эхо-петля первого кадра.
- Артефакт таймкодов (эталон Pepsi): массив
STARTSвbuild_final_pepsi.py— старт каждого из 24 шотов +END=73.3.
Шаг 4 — Ассеты RC
- Вход: утверждённый сценарий + арт-дирекшн (
art-direction.md). - Инструмент:
gen_assets_pepsi.py— каждый ассет = залоченныйSTYLE_PROMPT+ сцена, черезintegrations/gemini/vertex_image.py.
Команда:
GOOGLE_GENAI_USE_VERTEXAI=1 GOOGLE_CLOUD_PROJECT=project-b754ed01-ed79-435d-b6b python3 gen_assets_pepsi.py
- Выход:
assets/*.png— мастер-рефы (персонажи-якоря первыми для консистентности, потом сеты/пропы). - Правила:
- Персонажи-якоря генерим ПЕРВЫМИ (
pepsi_can → kendall → soviet_official → sub), потом сеты/пропы. - Бренды НЕ в промптах (Veo/Imagen режут IP): банки = «blue-red-white/red soda can, unbranded, no readable logo». Читаемого текста в кадре нет.
- Банка-командир БЕЗ человеческого лица (dot-eyes / cartoon-выражение).
- Чиновник = Сталин (узнаваемый мем-образ > историческая точность 1989).
- Sequential + паузы (~30с анти-429) + retry (Vertex 429).
- Персонажи-якоря генерим ПЕРВЫМИ (
- Грабли: отвергнутые варианты сохранены как
*_rejected.png(soviet_official_generic, pepsi_can_humanface).
Шаг 5 — Keyframes
- Вход: мастер-рефы
assets/*.png+ 24 сцены с ref-списками. - Инструмент:
gen_full_keyframes.pyчерезintegrations/gemini/vertex_image_ref.py(передаёт ассеты как image-input → консистентность).
Команда:
GOOGLE_GENAI_USE_VERTEXAI=1 GOOGLE_CLOUD_PROJECT=project-b754ed01-ed79-435d-b6b python3 gen_full_keyframes.py
# vertex_image_ref.py <out.png> <aspect> [ref1.png ref2.png ...] <<< prompt
# модель по умолчанию: gemini-3-pro-image (location=global)
- Выход:
storyboard/shot01_keyframe.png … shot24_keyframe.png(9:16). - Правила: часто-повторяющиеся персонажи/сеты идут рефами (1-3 рефа), разовые локации/пропы — в промпте напрямую. В промпт хвост: «Keep every referenced figure IDENTICAL… NO realistic human face on the can.»
- Грабли: независимая генерация без ref → модель заново выдумывает персонажа/палитру. Консистентность решается ТОЛЬКО ref-биндингом.
Шаг 6 — Видео (Grok i2v)
- Вход: keyframes + motion-промпты + звуковые брифы.
- Инструмент:
gen_grok_videos.pyчерезintegrations/syntx/syntx.py(Telethon-бот@syntxaibot, WARP-прокси SOCKS5 127.0.0.1:40000).
Команда:
<venv>/python syntx.py grok-i2v <keyframe.png> "<motion>. <звуковой бриф>"
# эталон: python3 gen_grok_videos.py (в фоне, мониторить out)
- Выход:
clips/shot01.mp4 … shot24.mp4— 9:16 (704×1280), ~6с СО ЗВУКОМ. - Правила:
- Звуковой бриф в КОНЕЦ КАЖДОГО промпта (обязательно):
Sound: <SFX шота> plus ambience. NO speech, no dialogue, no voices, no singing — sound effects and ambience ONLY.Grok-звук = наш SFX-слой; речь/вокал конфликтуют с нарратором. - Генерация ПО ОЧЕРЕДИ (одна Telethon-сессия).
- Звуковой бриф в КОНЕЦ КАЖДОГО промпта (обязательно):
- Грабли: ⚡~8/клип (платно, ASK). НЕ параллелить с
tg-claude-bot.service→AUTH_KEY_DUPLICATED.
Шаг 7 — Монтаж
- Вход:
clips/*.mp4+shadow_pepsi_final.mp3+march.mp3+script.txt+ whisper-json. - Инструмент:
build_final_pepsi.py. - Команда:
python3 build_final_pepsi.py(--ass-only— только пересобрать сабы). - Выход:
final/pepsi_final.mp4+final/subs.ass.
Что делает (по шагам):
- Обрезка каждого клипа под длительность шота (
STARTS[i+1]-STARTS[i]) + scale/crop до 1080×1920, fps 24. - Concat обрезанных клипов (video + Grok-SFX audio).
- Микс аудио:
ffmpeg filter
[0:a]volume=1.0[v]; # озвучка [1:a]volume=0.42[m]; # марш (loop) [2:a]volume=0.28[sfx]; # Grok-SFX из видео [v][m]sidechaincompress=threshold=0.05:ratio=3:attack=20:release=400[vm]; # мягкий дакинг [vm][sfx]amix=inputs=2:duration=first[mix] - Word-pop сабы: difflib-выравнивание
script.txt↔ whisper-тайминги → .ass (Accidental Presidency, белый + золотоFFC23Dна активном слове), прожигsubtitles=…:fontsdir=….
Дакинг ratio 3, НЕ 8 (иначе «где музыка»). Читаемый script.txt (цифрами) для сабов, *-tts.txt (прописью) для озвучки — разные файлы.
Шаг 8 — CapCut handoff (опциональный ручной монтаж)
- Вход: медиа по публичным obahoba-URL (
https://duplomatika.obahoba.com/pepsi-navy/…). - Инструмент:
build_capcut_pepsi.pyчерезintegrations/capcutapi(venvintegrations/capcutapi/.venv!). - Команда:
python3 build_capcut_pepsi.py. - Выход: CapCut draft на мак (
/Users/gost/Movies/CapCut/.../com.lveditor.draft), запись в реестрroot_meta_info.json,final/_capcut_draft_id.txt. - Поток: draft на мак → Тимур монтирует → Export в
~/Downloads/~/Desktop→ забираю экспорт → прожигаю сабы (голос не двигал → тайминги валидны).
venv именно capcutapi; медиа только по публичным URL; SRT для CapCut отдельный (final/capcut.srt, per=4 слова).
Шаг 9 — Брендинг-слой
Обязательный пост-слой на КАЖДЫЙ ролик. Детали — раздел 08. Строгий порядок: видео+сабы → вотермарк → subscribe-кнопка (СВЕРХУ ВСЕГО) → SFX тихо → обложка 0.5с в конце.
Шаг 10 — Марш + обложка
- Марш: EL Music
/v1/music— тема под ролик (Pepsi: советский комичный/имперский), промпт задаёт режиссёр (см. 6.6). Скрипт:pipeline/gen_music.py(кодифицирован в v5; платно — ASK). →march.mp3. Микс мягким дакингом (шаг 7). - Обложка: Vertex — кликбейт (Pepsi: банка + флот + шок-текст). →
covers/cover_v1..v3.png.
Шаг 11 — Обложка 0.5с в конце
Инструмент/команда:
ffmpeg -loop 1 -i cover.png -t 0.5 -vf "scale=1080:1920,fps=24" ... cover_clip.mp4
# затем concat: [видео с брендингом][cover_clip]
- Выход:
final/pepsi_final_cover.mp4(обложка-кадром в самом конце). - Зачем: чтобы Тимур выбрал этот кадр для YouTube-thumbnail.
08Брендинг-слой (пост-обработка)
Наработан на Pepsi (2026-07-04), эталон-файлы: outputs/pepsi-navy/. Источник: auto-memory oko-endcard-branding.
видео+сабы → вотермарк → subscribe-кнопка (СВЕРХУ ВСЕГО) → SFX (тихо) → обложка 0.5с в конце. Кнопка ОБЯЗАНА быть верхним слоем — иначе вотермарк её перекрывает (RAGE Тимура).
1. Вотермарк
watermark.png(логомаска ДУПЛОМАТИКА с крыльями, RGBA полупрозрачный).- По ВСЕЙ ширине, прибит к ВЕРХУ, весь ролик:
[wm]scale=W:-1[wms];[v][wms]overlay=0:0
2. Subscribe-анимация
- Remotion-композиция
SubscribeButton—sandbox/comic-cover-anim/src/compositions/SubscribeButton.tsx. - Механика (90 кадров @30fps, ~3с): кнопка вылетает сверху → появляется курсор → едет к кнопке → клик (43-49f) → красная
A41018становится серой (текст «ПОДПИШИСЬ» → «ГОТОВО») → улёт вправо-вверх (62-88f). Плавно (spring). - Рендер с ALPHA — PNG-sequence:
remotion render … --sequence --image-format=png
prores/webm через Remotion alpha НЕ дали прозрачность — только PNG-seq.
Overlay на 3с (ПОСЛЕ хука-вопроса):
setpts=PTS-STARTPTS+3/TB, enable='between(t,3,6.1)'
без сдвига PNG-поток кончается к 3с и кнопки не видно.
Верхний слой ОБЯЗАТЕЛЬНО.
3. SFX subscribe
- EL
/v1/sound-generation→sfx/flyin.mp3(вылет 3.0с),sfx/click.mp3(клик 4.5с),sfx/flyout.mp3(улёт 5.07с). - Громкость ТИХО ~0.20 (Тимур дважды просил тише):
adelay=<ms>,volume=0.20 … amix=…:normalize=0
4. Марш
EL Music /v1/music — фоновая музыка ролика, микс мягким дакингом (см. шаг 7).
5. Обложка 0.5с в конце
См. шаг 11.
Переиспользование: SubscribeButton + вотермарк + SFX + обложка-в-конец = один пост-скрипт на любой ролик; меняются только видео/сабы/обложка/марш.
Брендинг-слой оформляется в универсальный пост-скрипт pipeline/build_branding.py (вотермарк → subscribe → SFX → обложка-в-конец; пишется параллельным агентом по рецептам auto-memory oko-endcard-branding). На эталонном прогоне Pepsi ffmpeg выполнялся ad-hoc (промежуточные subscribe_norm.mp4, export_sub_anim.mp4, pepsi_final_sfx.mp4, pepsi_final_cover.mp4 в final/) — эта дыра закрыта.
09Инфраструктура и ключи
| Сервис | Где | Заметки |
|---|---|---|
| Vertex (image/Veo) | integrations/gemini/vertex_image.py, vertex_image_ref.py |
Проект project-b754ed01-ed79-435d-b6b (billing ON). Дефолтный 2a14e28f = billing OFF (403). ВСЕГДА GOOGLE_CLOUD_PROJECT + GOOGLE_GENAI_USE_VERTEXAI=1. Модель картинок: gemini-3-pro-image (location=global). |
| Grok (видео i2v) | integrations/syntx/syntx.py |
Telethon-бот @syntxaibot, WARP SOCKS5 прокси (Telegram DC зафайрволены на VPS). CLI: grok-i2v <img> "<промпт>". Выдаёт 704×1280 ~6с со звуком. Одна сессия — НЕ параллелить с tg-claude-bot.service. |
| ElevenLabs | .claude/skills/voice-clone-channel/helpers/el.py, ключ ~/.claude/.accounts/elevenlabs.env |
TTS (eleven_v3) + STS (eleven_multilingual_sts_v2) + /v1/sound-generation (SFX) + /v1/music (марш — через pipeline/gen_music.py). Голоса: playboy CtLRZDtn8Xgr90sVZl7u, Brian nPczCjzI2devNBz1zQrb. |
| CapCut | integrations/capcutapi (venv .venv) |
draft на мак (/Users/gost/Movies/CapCut/…), реестр root_meta_info.json. Медиа по публичным obahoba-URL. |
| Публикация | https://duplomatika.obahoba.com/<slug>/ |
obahoba Caddy — медиа для CapCut + live-ролик. |
| Шрифт субтитров | assets/fonts/Accidental-Presidency-Rus.ttf |
«Accidental Presidency (Rus by Lomzz)». |
10Карта артефактов outputs/<slug>/
Реальная структура эталона outputs/pepsi-navy/:
pepsi-navy/
├── gen_voice_paused.py # ш.2 — озвучка блоками+паузы+STS
├── gen_assets_pepsi.py # ш.4 — RC-ассеты (мастер-рефы)
├── gen_full_keyframes.py # ш.5 — 24 keyframe (ref-биндинг)
├── gen_grok_videos.py # ш.6 — 24 Grok-клипа (motion+SFX-бриф)
├── build_final_pepsi.py # ш.7 — обрезка+concat+микс+word-pop сабы
├── build_capcut_pepsi.py # ш.8 — CapCut draft на мак
├── art-direction.md # арт-дирекшн + ассет-лист + video-промпты
├── raskadrovka.md # ш.3 — 24 шота под whisper-таймкоды
├── watermark.png # брендинг — логомаска
├── march.mp3 # марш (EL Music)
│
├── assets/ # мастер-рефы: pepsi_can, kendall, soviet_official(Сталин),
│ # sub, coca_cola_can, fleet_dock, moscow_street …
│ # + *_rejected.png (отвергнутые варианты)
├── storyboard/ # shot01_keyframe.png … shot24_keyframe.png + concept-panels.png
├── clips/ # shot01.mp4 … shot24.mp4 (Grok 704×1280 ~6с)
├── out/whisper/ # shadow_pepsi_final.json (word-level таймкоды)
├── sfx/ # flyin/click/flyout.mp3 (subscribe SFX)
├── covers/ # cover_v1..v3.png (кликбейт-обложки)
├── capcut_edited/ # draft_info.json (экспорт из CapCut)
├── final/
│ ├── subs.ass # word-pop сабы (Accidental Presidency)
│ ├── capcut.srt # SRT для CapCut
│ ├── pepsi_final.mp4 # монтаж без брендинга
│ ├── pepsi_final_sub.mp4 # + сабы
│ ├── pepsi_final_sfx.mp4 # + subscribe-анимация+SFX
│ ├── pepsi_final_cover.mp4 # + обложка 0.5с в конце (ФИНАЛ)
│ └── subscribe_norm.mp4 # нормализованный subscribe-оверлей
├── shadow_pepsi_final.mp3 # ФИНАЛЬНАЯ озвучка (73с, ×1.3)
└── full_x1.0 / x1.15 / x1.3 / x1.5 / x1.7.mp3 # варианты atempo
Ядро пайплайна (pipeline/, channel-agnostic станок)
| Модуль | Что делает |
|---|---|
contracts.py | Структуры данных (Beat, ScriptSpec, VoiceResult, Keyframe, Segment…) + пути + реестры шрифтов/голосов. ⚠️ дефолты устарели — см. раздел 13. |
profile_dich.py | Профиль канала Дупломатика (NAME, PERSONA, TONE, VOICE, SCRIPT_RECIPE, AUDIENCE, ACCENT_HEX). Источник правды по каналу. |
style_robotchicken.py | Залоченный STYLE_PROMPT + KEY_ATTRIBUTES + NEGATIVES + палитра/музыка/шрифт. |
scripter.py | Сценарист: история → ScriptSpec (RU) по конституции (Gemini). |
voice_shadow.py | Shadow-озвучка с тайм-кодами (playboy → STS Brian). |
keyframe.py | Двухэтапная генерация визуала (стартовый кадр + анимация), ref-anchored. |
captions.py | Караоке-субтитры .ass (word-pop). |
compose.py | Финальная сборка вертикального mp4 9:16 (жёсткие cut'ы). |
director.py | Арт-директор (always-on мастер-слой, Claude-в-цикле). ⚠️ в v5 режиссура живёт в роли duplo-director (см. раздел 06). |
shotlist.py | Человекочитаемый шот-лист — артефакт гейта-1 (v4-наследие). |
gen_music.py | Кодифицировано в v5: генерация музыки/марша ролика через EL Music /v1/music по промпту режиссёра (платно — ASK). Пишется параллельным агентом. |
build_branding.py | Кодифицировано в v5: универсальный брендинг-пост-скрипт (вотермарк → subscribe → SFX → обложка 0.5с в конец). Пишется параллельным агентом. |
11Гейты и контроль качества
Порядок гейтов — v5 (см. раздел 05): A тиндер-отбор идей → B концепт-пакет ЦЕЛИКОМ (сценарий+озвучка+раскадровка+музыка+ассеты+промпты+обложка — ВСЁ РАЗОМ, одним согласованием) → C ключевые кадры → D ГОТОВЫЙ ролик (со всем брендингом).
Старая лестница из 7 гейтов по отдельности (сценарий → озвучка+ассеты → раскадровка → промпты → кадры → видео) упразднена — она размазывала режиссуру и плодила согласования. Внутри этапов те же артефакты продолжают проверяться, но Тимур согласует 4 точки, не 7.
Self-QA перед КАЖДЫМ отчётом (HARD): сам иду проверяю работу, ищу косяки, редактирую. Сдаю отревьюенное, не сырое.
Другие гейты
- Read-aloud gate (сценарий) — смешно ли ВСЛУХ.
- Viewer-test — 3 симулированных зрителя (но чутьё Тимура перепроверяет).
- STORYBOARD-GATE — апрув концепции ПЕРЕД тратой Vertex на ассеты.
- TTS-адаптация — обязательный отдельный проход (числа прописью, ударения, дробление длинных фраз).
Правила консистентности
- Формат 9:16 ВСЕГДА, текст только русский и НЕ запекать моделью (Vertex коверкает кириллицу) → оверлеем.
- Консистентность персонажей — ТОЛЬКО ref-биндинг на якорь, не текстовый промпт.
- НЕТ Ken Burns / slow-zoom по статике в финале (маркер любительского).
- Узнаваемый мем-образ > историческая точность (Сталин).
12Примеры (реальные пути Pepsi)
Live: https://duplomatika.obahoba.com/pepsi-navy/
Keyframes (RC, 9:16)
outputs/pepsi-navy/storyboard/shot01_keyframe.png— хук (банка-командир на рубке подлодки)outputs/pepsi-navy/storyboard/shot15_keyframe.png— держава (банка на троне, армада веером)outputs/pepsi-navy/storyboard/shot16_keyframe.png— sight-gag (пушка стреляет газировкой)outputs/pepsi-navy/storyboard/shot22_keyframe.png— твист (Сталин отдаёт флот за баночку)outputs/pepsi-navy/storyboard/shot24_keyframe.png— финал-петля (эхо шота 1)outputs/pepsi-navy/storyboard/concept-panels.png— концепт-полотно (панели)
Ассеты (мастер-рефы)
outputs/pepsi-navy/assets/pepsi_can.png— банка-командир (без лица)outputs/pepsi-navy/assets/soviet_official.png— чиновник-Сталинoutputs/pepsi-navy/assets/kendall.png— CEO Pepsioutputs/pepsi-navy/assets/fleet_dock.png— сет флота
Клипы (Grok)
outputs/pepsi-navy/clips/shot01.mp4— хук-клип со звуком
Финал
outputs/pepsi-navy/final/pepsi_final_cover.mp4— ФИНАЛ (сабы+вотермарк+subscribe+SFX+обложка)outputs/pepsi-navy/final/pepsi_final_sfx.mp4— до обложки
Обложки
outputs/pepsi-navy/covers/cover_v1.png,cover_v2.png,cover_v3.png
Брендинг
outputs/pepsi-navy/watermark.png— логомаска-вотермарк
★Эталон: Pepsi-флот
Реальные артефакты прогона «Pepsi-флот» (73с, 24 шота). Кликните миниатюру для увеличения.














13Расхождения код ↔ факт
Замеченные устаревшие места в коде (документируется ФАКТ канала Дупломатика, код помечен как наследие):
| Место в коде | Устаревший дефолт | ФАКТ канала Дупломатика |
|---|---|---|
contracts.py:73 default_voice_id | "pqHfZKP75CvOlQylNhV4" («Bill», documentary narrator, английский) | Голос = клон playboy CtLRZDtn8Xgr90sVZl7u → STS shadow Brian nPczCjzI2devNBz1zQrb. «Bill» — наследие другого трека (youtube-factory), НЕ канал Дупломатика. |
contracts.py:52 font_name + SUBTITLE_FONTS["Montserrat"] (дефолт) | "Montserrat" | Шрифт субтитров = Accidental Presidency (Rus by Lomzz) (assets/fonts/Accidental-Presidency-Rus.ttf). Montserrat — наследие. (Accidental Presidency в реестре есть — строка ~100 — но не дефолт.) |
contracts.py:23 комментарий # sandbox/faceless-video/ | путь другого трека | Реальный ROOT — sandbox/oko/. |
profile_dich.VOICE["preset"] = "dich" (0.72/0.85/0.22) | пресет dich для по-битной | Актуальный для длинного текста — dich_stable (0.85/0.85/0.05), см. preset_long. По-битная генерация отключена (per_beat: False). |
art-direction.md колонка «Модель» FAST/FULL (Veo-разметка) | Veo 2-key | Видео = Grok i2v (заменил Veo). Veo-разметка оставлена как справка по типу движения. |
memory feedback-oko-veo-nanobanana-only-lock | «стек залочен на Veo» | Устарело — видео теперь Grok. |
raskadrovka.md «25/26 шотов», «Veo», «720×1088» | ранние черновые числа | Финал: 24 шота, Grok 704×1280. (Внутренние расхождения самого черновика раскадровки.) |
brand/brand.json | name «ОКО», tagline англ., caption_font «Montserrat» | Наследие бренда OKO/ДИЧЬ до переименования в Дупломатику. Актуальная ДНК — profile_dich.py + brand/channel-anchor/. |
Что НЕ удалось подтвердить в коде (честно)
- Брендинг-слой на эталонном прогоне был ad-hoc. Ffmpeg-команды вотермарка/subscribe-overlay/SFX/обложки-в-конце реконструированы из auto-memory
oko-endcard-branding+ промежуточных файлов вfinal/, а не из исполняемого скрипта. В v5 дыра закрывается кодификацией вpipeline/build_branding.py(пишется параллельным агентом). - Точные CLI-параметры разрешения Grok (704×1280 vs 720×1088) — настраиваются в WebView
@syntxaibot, вsyntx.pyне захардкожены; 704×1280 взято из memory (подтверждённый тест), 720×1088 в черновике раскадровки — расхождение. - Команда рендера Remotion SubscribeButton (
--sequence --image-format=png) — из memory; конкретной build-строки/npm-скрипта вcomic-cover-animне проверял. march.mp3и обложки — файлы есть, но на эталонном прогоне сгенерированы ad-hoc (скриптов вoutputs/pepsi-navy/нет; точный текст промпта Pepsi-марша не зафиксирован). В v5 музыка кодифицируется вpipeline/gen_music.py, промпт — обязательная часть концепт-пакета.- atempo базовая длительность — из memory (~96с база → ×1.3=73с); в коде
gen_voice_paused.pyatempo не применяется (только блоки+STS), финальныйfull_x1.3.mp3собран отдельным ad-hoc вызовом.
Источник правды рецепта:
sandbox/oko/outputs/pepsi-navy/ · Live: duplomatika.obahoba.com/pepsi-navy