--- name: postcreator-motion-inserts description: Анимированные перебивки и субтитры к говорящей голове, интервью или репортажу. Исходник и речь остаются как есть; на слова речи встают сцены, которые агент рисует под этот ролик, — на весь кадр или 3D-карточкой в пространстве видео, а если в исходнике нет субтитров — стильные субтитры, в том числе слова в перспективе кадра. Применяй после postcreator-motion, когда пользователь дал видео с речью и хочет моушн-графику поверх. --- Сначала выполни шаги из `postcreator-motion`: проверь `doctor`, создай проект `--recipe inserts`. Формат проекта бери по исходнику: вертикальный → `portrait`. ## 1. Исходник ``` pc-motion ingest <видео> --project . --as footage pc-motion transcribe --project . --lang ru pc-motion words --project . pc-motion look --project . --every 4 ``` `words` — каждое слово с временем начала; это единственные часы рецепта, таймкоды руками не подбирай. Whisper иногда пишет слова с ошибкой («макап», «Галилео»): в якорях пиши слово так, как оно в расшифровке, а на экране — правильно. `look` кладёт в `work/look/sheet-*.jpg` кадры исходника с сеткой по десятым долям кадра; люди закрашены красным, а в ответе есть `cuts` — время склеек. При первом запуске он сам скачивает модель поиска людей (около 400 МБ вместе со средой) и проходит видео пару минут, дальше берёт из кэша. Посмотри все листы и запиши для себя: - есть ли **вшитые субтитры** и где они (от этого зависит раздел 2); - плашки с именами: когда появляются и исчезают — их нельзя закрывать. Точные моменты смотри покадрово: `pc-motion look --project . --from 28 --to 34 --every 0.5 --width 360`; - где люди в каждом плане и где свободное место (стена, пол, потолок, небо) — туда встают карточки и слова в пространстве; - где склейки (`cuts`): карточка и слово в пространстве живут внутри одного плана. ## 2. Субтитры Если субтитры уже вшиты — свои не добавляй (`"captions": { "preset": "none" }` или без ключа). Если их нет — выбери пресет; полный список с полями даёт `pc-motion inserts templates` (раздел `captions`): | Пресет | Как выглядит | Когда | | --- | --- | --- | | `pop` | 1–3 слова в нижней трети, каждое выпрыгивает на своём слове, ключевые — акцентом | энергичная речь, рилсы | | `karaoke` | фраза до двух строк, текущее слово загорается плашкой | разговорная речь, обучение | | `stack` | крупный блок: слова друг под другом влетают с размытием, ключевое — в плашке | короткие сильные фразы | | `minimal` | тихие строчные субтитры внизу | интервью, спокойный тон | | `spatial` | ключевые слова встают в пространство кадра — на пол, стену, потолок или в воздух — в его перспективе и едут вместе с камерой; остальная речь — `base` (`minimal` или `none`) | когда хочется, чтобы слова были частью сцены | `keywords` — слова-акценты: 1 на 1–2 фразы, только смысловые (не «это», «очень»). Для `spatial` у каждого слова укажи `place` (`floor`, `wall-left`, `wall-right`, `air`, `ceiling`) и `x`, `y` — долю ширины и высоты кадра — по кадрам `look` в этот момент: в свободном месте, не на лице и не на плашке. `text` — как написать слово на экране («кластер» вместо «кластере»). Движение камеры считается само (`work/track.json`, кэшируется), слово, которое пережило бы склейку, сборка обрежет по ней. ```json "captions": { "preset": "spatial", "base": "minimal", "keywords": [ { "word": "кластере", "text": "кластер", "place": "air", "x": 0.4, "y": 0.21 }, { "word": "коворкинга", "place": "wall-right", "x": 0.68, "y": 0.42 } ] } ``` Субтитры прячутся под полноэкранной перебивкой и остаются при карточке. ## Главное правило: графика никогда не закрывает человека - Карточки и слова в пространстве не касаются ни одного человека в кадре — ни говорящего, ни тех, кто рядом. - Субтитры не заходят на лица; по телу ниже плеч — можно. - Графика поверх кадра не налезает друг на друга: карточка, слово в пространстве и строка субтитров стоят в разных местах. - Перебивка на весь кадр заменяет картинку, а не перекрывает её — для неё действует правило 3 секунд (раздел 3). Сборка проверяет это сама по маске людей и откажет с точным временем: «карточка suit на 34.5 с закрывает человека». Переставь элемент в свободное место по красной заливке на кадрах `look`, уменьши его или закончи раньше. `"overPeople": true` у карточки или слова — только для плана, где никто не говорит (общий план толпы). ## 3. Карта перебивок Прочитай расшифровку и выбери мысли, которые можно **показать**. Перебивка — это анимация того, о чём говорят, а не титр с пересказом. Правила: - одна перебивка на 8–15 секунд речи; длина — 2,5–7 секунд (сборка примет 1,5–12, но короче и длиннее смотрится хуже); - **между полноэкранными перебивками говорящий на экране не меньше 3 секунд.** Если он мелькнёт на секунду, это смотрится как сбой; сборка такой план не примет. Две близкие мысли — одна перебивка, а не две; - главное движение «приземляется» на ключевое слово (`land`), каждый шаг — на своё слово (`marks`); - текст только подписывает картинку: заголовок до 4 слов, подписи 1–3 слова; - **никаких выдуманных фактов и цифр**: на экране только то, что сказано, или то, что дал пользователь. Нет числа в речи — нет числа на экране; - образы не повторяются подряд; - перебивка на весь кадр не кончается за мгновение до склейки — иначе старый план мелькнёт на пару кадров; сборка предупредит, продли её за склейку (`tail`) или закончи раньше. Подходы сочетаются под задачу: большая мысль — перебивка на весь кадр; короткий факт, пока важно видеть говорящего, — карточка; ключевое слово между перебивками — слово в пространстве (если субтитров нет); субтитры — только когда их нет в исходнике. В один момент в одном месте — что-то одно. Для каждой перебивки выбери вид: - **на весь кадр** — мысль требует внимания целиком: процесс, система, место, сравнение; - **3D-карточка** (`"card"`) — короткий факт или пример, при котором важно видеть говорящего: карточка стоит в пространстве видео в перспективе, внутри неё идёт анимация, она едет за камерой. Карточка не закрывает говорящего, поэтому правило 3 секунд к ней не относится (до соседней перебивки — 0,5 с). Поставь её в свободное место по кадрам `look` и закончи до ближайшей склейки — сборка предупредит, если нет. ```json "card": { "x": 0.72, "y": 0.22, "scale": 0.45, "tilt": -18, "pitch": 6, "size": "square" } ``` `x`, `y` — центр карточки в долях кадра; `scale` — её размер (0,4–0,6); `tilt` и `pitch` — поворот в градусах; `size` — `square`, `tall` или `wide`; `"track": false` — не ехать за камерой. На резких движениях камеры (вжик, наезд) трекинг может унести карточку за край — сборка предупредит, тогда выключи трекинг. Сцена карточки рисуется в своём кадре: `square` — 1080×1080, `tall` — 1080×1350, `wide` — 1350×1080; без HUD и ириса, со своей областью `B`. Карточка уменьшена до `scale`, поэтому текст в ней крупный: заголовок от 64 px, подписи от 40 px — иначе на экране он станет мельче 15 px. ### Генеративная вставка — только предложить Иногда лучше не рисовать поверх, а изменить сам кадр: в интервью говорят о Галилее — и Галилей проходит у них за спиной и машет в камеру; говорят о драконе — по залу пролетает дракон. Это правка куска видео в Seedance 2.5 с картинкой-референсом. Она платная и заметно дороже графики, поэтому **сам не запускай**: предложи пользователю одну-две такие идеи, где это действительно украсит ролик, с ценой, и делай только после его «да». 1. Кусок внутри одного плана, 4–30 с, целой длины (6 с, а не 5,7): `pc-motion segment --project . --from 95 --to 101 --id galileo`. Если в исходнике вшиты субтитры, сотри их в куске — иначе модель перерисует их с ошибками: `--blank 0.085,0.643,0.92,0.716` (полоса субтитров долями кадра, по кадрам `look`). Команда вырежет кусок без звука в `work/segments/`, покажет, что в нём говорят, и предупредит о склейке внутри. 2. Референс персонажа или предмета в полный рост — картинка пользователя или генерация в Postcreator (дёшево). 3. Загрузи кусок (`create_file_upload` и `curl -T`) и посчитай цену `quote_generate_to_chat` для `seedance-2.5`: `source_video` — кусок, `reference_images` — референс, `seedance25_task: "edit"`, `duration` — длина куска, `resolution` — по выбору пользователя (`seedance25_draft: true` — дешёвый черновик 480p). Цена — за секунды входа и выхода вместе. Покажи цену и жди согласия; платные шаги — в `pc-motion ledger`. 4. Промпт: сохранить кадрирование и всё из исходника (люди, лица, губы, жесты, зал, движение камеры), добавить персонажа как на референсе, где именно он идёт (по кадрам `look` — за людьми, в свободном месте), что делает по секундам; свет и зерно — как в съёмке; «никакого текста и субтитров». 5. `pc-motion fetch --project . --name galileo` положит результат в `assets/clips/galileo.mp4`; в плане: ```json { "id": "galileo", "template": "swap", "file": "assets/clips/galileo.mp4", "start": 95, "duration": 6, "captions": [0.085, 0.643, 0.92, 0.716] } ``` Кусок встаёт на свои секунды как есть, с мягким переходом (`fade`, 0,2 с), звук остаётся исходным. `captions` — та же полоса: настоящие субтитры вырезаются из оригинала по буквам и ложатся сверху. Модель может немного перекадрировать — на стыке это выглядит как обычная подсечка; если скачок мешает, `"align": true` подгонит кусок по масштабу и сдвигу к оригиналу, а `"people": true` положит сверху людей из оригинала (их лица и губы останутся настоящими). `keep` — прямоугольники, которые берутся из оригинала как есть. Говорящий в кадре, поэтому правило 3 секунд к замене не относится. Проверь `snapshot --only galileo`; если люди или губы «поплыли» — включи `"people": true` или не ставь замену. ## 4. Каждая сцена рисуется под этот ролик Готовых сцен в итоговом ролике нет: каждую перебивку ты придумываешь и рисуешь для этого видео и этой фразы. В плане это `"template": "custom"` и свой файл: ```json { "style": { "accent": "#8ce874", "ground": "#05060a", "ink": "#f4f4f0", "brand": "бренд × проект" }, "captions": { "preset": "none" }, "inserts": [ { "id": "dome", "template": "custom", "file": "custom/dome.html", "topic": "купол", "at": { "word": "иммерсивная" }, "until": { "word": "обзор" }, "land": { "word": "обзор" }, "data": { "kicker": "купол", "title": "Весь обзор" } }, { "id": "suit", "template": "custom", "file": "custom/suit.html", "topic": "мокап", "at": { "word": "костюме" }, "until": { "word": "датчиками" }, "marks": [{ "word": "костюме" }, { "word": "движения" }, { "word": "датчиками" }], "card": { "x": 0.7, "y": 0.24, "scale": 0.48 }, "data": { "title": "Мокап", "steps": ["костюм", "движения", "датчики"] } } ] } ``` - `at` — перебивка начинается за 0,35 с до этого слова (`lead` меняет запас); `until` — заканчивается через 0,4 с после этого слова (`tail`), или длина числом в `duration`. - Слово ищется без учёта регистра и окончания последнего слова: `"97"` найдёт «97-летию». Слово в `at` ищется с начала ролика: если оно звучит не один раз, сборка предупредит и покажет, где ещё, — `"occurrence": 2` возьмёт второе, `1` подтвердит первое. Слова в `until`, `land` и `marks` ищутся после начала перебивки. Вместо слова можно указать секунды числом. - `data.title` и `data.kicker` сборка сама выводит подписью сверху (`highlight` — слово-акцент); остальные поля `data` — твои, в скрипте это `DATA`. - Звуки: вход и уход есть всегда; у своей сцены по умолчанию тикает каждый шаг `MARKS`. `"sound": { "land": "boom", "ticks": true }` добавит удар на `LAND` (`boom`, `chime`, `tick`, `whoosh`, `swish` или `null`); `"sfx": false` выключает звуки перебивки. - `"hud": false` в `data` убирает номер и тему сцены сверху. Затем `pc-motion inserts scaffold --project .`: для каждой сцены появится заготовка `custom/.html` с тем, что говорят в этот момент, длиной, `LAND` и `MARKS`. Замени заготовку своей сценой. ### Как придумать сцену 1. **Образ этого ролика.** Возьми предмет из самой речи и съёмки: планетарий — купол и звёзды, мокап — костюм с маркерами, Коперник — Солнце в центре орбит. Не подставляй общую иконку, которая подошла бы к любому видео. 2. **Раскадровка из трёх тактов**: что появляется на входе (0–0,6 с), что происходит на `LAND`, что меняется на каждом `MARKS`; последние 0,5 с — уход. 3. **Одно главное движение и 2–3 живые детали**: мерцание, параллакс, подписи. Не двигай всё сразу. 4. **Композиция**: картинка — в `B` (под подписью сверху) и может спускаться до `B.y2`, под кнопки соцсетей; текст — не ниже `B.y1`. Пустая нижняя треть делает кадр тяжёлым сверху. 5. **Язык движения**: входы — `expo.out`, «удар» на слове — `back.out`, последовательности — с задержкой (stagger); ничего линейного, кроме часов. ### Фрагмент сцены Файл — это `
Коперник
``` Помощники в скрипте: - время: `tl` — таймлайн сцены (секунды от её начала), `DUR`, `LAND`, `MARKS` (массив), `DATA`; - место: `B` — область картинки `{x0, x1, y0, y1, w, h, cx, cy, S}`, `U` — единица масштаба (1 на 1080 px), `FW`, `FH`, `PAD`; - цвет: `AC`, `INK`, `GR` (акцент, текст, фон), `mix(a, b, m)`, `alpha(c, a)` — принимают `#rrggbb`, `#rgb` и `rgb()`, так что их можно вкладывать; в CSS — `var(--pc-accent)`, `var(--pc-ink)`, `var(--pc-ground)`; - рисование: `svg` — слой на весь кадр под подписью, `mk(tag, attrs, parent)`, `put(el, attrs)`, `pts(list)` для `points`, `uid("имя")` — id для градиентов и `clipPath`; - элементы: `$(".класс")`, `$$(".класс")` — только внутри сцены; - движение: `clock(t => …)` вызывает рисование на каждом кадре, `ramp(t, at, length)` → 0…1, `lerp`, `clamp`, кривые `inOut`, `out`, `pop`; `rand()` — шум от зерна; - люди: `pose(kind, t, k)` — позы `idle`, `walk`, `dance`, `jump`, `wave`, `lean`; `mixPose(a, b, m)`; `figure(svg, { joints: true })` → `.draw(pose, x, y, рост, цвет, { width, head, bones, dots, hollow, dot, dotColor })`: `bones` — прозрачность тела, `dots` — только маркеров на суставах; возвращает `[x, y, r]` головы — к ней удобно цеплять лицо, шляпу, подпись. Сборка откажет понятной ошибкой, если в сцене есть то, что отрендерится по-разному или помешает другим сценам: `Math.random`, `Date.now`, таймеры, `document.querySelector`, `id` в разметке, внешние файлы и скрипты, шрифты кроме `"Inter"` и `"JetBrains Mono"`, `@keyframes` и `@media`, синтаксическая ошибка в скрипте. Картинки клади в `assets/` и ссылайся относительно. Как сделаны купол, орбиты, скелет с маркерами, 3D-сетка, карта, толпа и персонажи, видно в `runtime/src/visuals.mjs` этого плагина. Читай его ради приёмов (часы, перспектива, позы), но не повторяй его композиции: встроенные шаблоны (`pc-motion inserts templates`) в итоговый ролик не ставь, образ придумывай из своего видео. ## 5. Проверка сцен, черновик, финал ``` pc-motion inserts build --project . pc-motion snapshot --project . --only ``` Сборка печатает `warnings` (карточка переживает склейку или уезжает за край, слово в `at` звучит несколько раз, перебивка кончается перед самой склейкой) — разбери каждое. `snapshot --only ` показывает одну сцену подробно — вход, каждый шаг, приземление, середину и уход — и кладёт лист в `work/snapshots//`; `snapshot --at 12.4,12.9` — любые свои секунды ролика в `work/snapshots/at/`. Без рендера, за десятки секунд. Рисуй сцену, смотри кадры, правь, пока она не станет понятной без звука. Затем все сцены разом (минута-две): ``` pc-motion snapshot --project . ``` Открой каждый `work/snapshots/contact-sheet-*.jpg`: перебивки, карточки, слова в пространстве и говорящий между ними. Потом черновик со звуком: ``` pc-motion render --project . --quality draft pc-motion review --project . ``` `work/review/review.jpg` показывает те же моменты из готового ролика. Проверь, что образ понятен без звука, текст читается, ничего не обрезано, лица и плашки не закрыты, а главное движение приходится на своё слово; мелкий текст карточек смотри крупно через `snapshot --at`. Покажи пользователю черновик, внеси правки и собери финал: `--quality delivery`. HyperFrames при рендере может советовать `npx hyperframes skills update` — ничего не ставь, это не нужно для работы.