reels-motion — рилс с моушн-оформлением
Из сырых вертикальных видео человека, который говорит в камеру, — готовый рилс: основа по звуку, стоп-кадр-обложка с жестом на плашку, плашки и реакции в выбранном стиле, субтитры по словам, камера, звук. Всё локально: ffmpeg, headless Chromium, numpy. Платный только шаг распознавания речи (fal whisper).
Рядом с этим файлом:
${CLAUDE_SKILL_DIR}/engine/reel.py— единый CLI, у каждой подкоманды есть--help;${CLAUDE_SKILL_DIR}/styles/— пресеты стилей,${CLAUDE_SKILL_DIR}/examples/— таймлайны шаблонов А и Б;${CLAUDE_SKILL_DIR}/reference/— подробности по шагам; читать, когда дошёл до шага.
Ниже R — это python3 ${CLAUDE_SKILL_DIR}/engine/reel.py. Работай в папке проекта пользователя, не внутри папки скилла.
0. Окружение — один раз
python3 ${CLAUDE_SKILL_DIR}/scripts/check_env.py
Проверит Python-модули, ffmpeg с фильтрами, Chromium и шрифты; на каждую проблему печатает команду установки. Быстрая проверка всего конвейера — синтетическое демо без чужого видео (5–10 минут):
R demo --style sticker --out ./reels-demo
1. Разведка исходников
R probe src/*.mov --sheets work/sheets
Размер, к/с, поворот, HDR-метки, звук; лист кадров на каждый файл — смотреть глазами (Read), где что снято и куда смотрит человек. HDR айфона (arib-std-b67) движок пересчитает в BT.709 сам.
2. Распознавание
# ключ fal — только в переменной окружения FAL_KEY (её задаёт пользователь)
R stt src/*.mov --out work/stt
fal whisper по словам. Без FAL_KEY шаг не выполняется (понятная ошибка, код 2) — тогда слова кладутся готовым JSON формата fal chunks. Слова длиннее 1,2 с — почти всегда скрытый повтор или оговорка: команда печатает их сама, проверить замедленной перерасшифровкой ×2:
R stt src/take3.mov --out work/stt --slow 20.0:22.2
3. Выбор дублей и раскладка
Шаблон А или Б — reference/templates.md. Для каждой фразы — последний целый заход; у каждого реза причина словами («убрал повтор», «смена локации»); годный дубль не резать ради паузы короче 1 с. Раскладка — EDL (JSON, формат в engine/rm/cut.py): куски {src, in, out, stage}, кадр стоп-кадра с кончиком пальца, правки слов.
4. Резы по огибающей звука и сетка кадров
R cut --scan src/take1.mov:2.0:11.0 # речь и тихие точки в окне
R cut edl.json --out work
Распознавание говорит, где искать, огибающая — где резать. cut проверяет каждую границу по уровню звука (рез в речи — ошибка, cut_report.json), режет по номерам кадров, делает assert числа кадров основы и пишет base.mov, words.json, beats.json, freeze.png. Затем: R words work/words.json — номера слов для якорей, R faces timeline.json — лицо по планам.
5. Стоп-кадр-обложка с плашкой
Кадр 0 — обложка. Приём «первый кадр с пальцем на плашку»: в EDL freeze: {src, t, fingertip}, в таймлайне freeze.hold 0,4–0,7 с. Плашка хука стоит слева от пальца или к ней ведёт линия от кончика пальца; все времена сдвигаются на стоп-кадр автоматически.
6. Таймлайн
Один JSON: этапы шаблона, слова, стоп-кадр, элементы, камера, субтитры — reference/timeline-schema.md, примеры examples/template-a.timeline.json, examples/template-b.timeline.json. Времена — якорями на слова ({"w": 13}, {"word": "франшиза"}) и склейки ({"cut": 2}). Свободные элементы — elements: реакции 🔥 😮 👍, стикеры, стрелки и выноски, пузырь «ответ на комментарий», акцентное слово, прогресс, счётчик.
R plan timeline.json --style base --verbose # проверка якорей, времени чтения, цифр
7. Выбор стиля — ОБЯЗАТЕЛЬНО до рендера
Стиль молча по умолчанию не выбирать. Спроси пользователя, в каком стиле делать, и покажи превью:
R styles # список стилей
R styles --preview --out work/preview # лист: стоп-кадр с плашкой · лид с субтитрами · призыв для каждого стиля
Покажи лист картинкой. Варианты ответа:
- Пресет:
premium(стекло, тёплый акцент),sticker(стикеры, маркер),kinetic(3D, плиты из глубины),base(нейтральный). - Смесь: например, плашки из sticker, субтитры из premium —
style.jsonс"extends": "sticker", "components": {"*": "sticker", "captions": "premium"}. - Новый стиль по описанию или референсу (скрин, чужой рилс) —
reference/styles.md, раздел «пошагово»:Тест — 4 с: стоп-кадр с плашкой, лид, субтитры, призыв; mp4 и лист кадров через 0,25 с. Посмотри кадры сам, покажи пользователю. Полный рендер — только после его «ок».R style-new neon --from base # заготовка в ~/.reels-motion/styles/neon/style.json # правишь tokens / motion / captions / camera / transitions / audio (и при необходимости свой компонент) R style-test neon --project timeline.json --out work/style-test-neon
Если человек не знает, чего хочет, — предложи 2–3 контрастных варианта (например, premium, sticker и один новый) и покажи превью рядом.
8. Накладки, субтитры, камера
R render timeline.json --style <стиль> --work work/<стиль> # overlay.mov + boxes.json + meta.json
R render timeline.json --style <стиль> --frames 0,45,300 --png-dir work/stills # отдельные кадры для проверки
R compose timeline.json --style <стиль> --work work/<стиль> # video.mp4
Кадр — чистая функция времени (setTime(t)); смаз в движении — 4 подкадра только на входах и выходах. Субтитры по словам — из words.json, вид — из стиля (reference/captions.md). Камера: масштаб плана маскирует склейки, панч-ин на ключевых словах, одна тряска на удар; whip и вспышка — на швах этапов (reference/motion.md). Тяжёлые шаги — по одному на машину: --lock /tmp/reels_motion.lock или REEL_LOCK.
9. Звук
R audio timeline.json --style <стиль> --work work/<стиль>
Голос — только гигиена (highpass 80 Гц, компрессор ≤ 3:1, без шумодава). SFX — синтез, ровно на кадр появления. Музыка — синтез с sidechain под голос. Итог −14 LUFS, true peak ≤ −1, alimiter level=false. Две версии: с музыкой и без (reference/sound.md).
10. Сборка и приёмка
R finalize timeline.json --style <стиль> --work work/<стиль> --out out --name reel
R qa timeline.json --style <стиль> --work work/<стиль> --out out --name reel --stt
R sheet timeline.json --style <стиль> --work work/<стиль> --out out --name reel
Или всё сразу: R build timeline.json --style <стиль> --work work/<стиль> --out out.
Приёмка — reference/qa.md, конечным действием:
qa: кадры = основа + стоп-кадр, BT.709, LUFS/TP, рамки текстов в безопасной зоне, накладки не на лице, SFX на кадре появления ±1;--stt— обратная расшифровка: фразы целые.- Глазами через Read: листы через 0,25 с и каждый кадр вокруг появлений и склеек (
out/sheets/). Кадр 0 — обложка с плашкой. - Файлы пишутся во временное имя и переименовываются в конце.
11. Выдача
out/reel.mp4 (H.264, AAC 256k, faststart), out/reel_nomusic.mp4, out/reel_tg.mp4 (≤ 6 Мбит/с, < 45 МБ), out/reel_cover.jpg, листы кадров. Отчёт: какой стиль, список резов с причинами, замеры qa, что посмотрено глазами.
Правила, которые нельзя нарушать
- Цифры в кадре — только из голоса и в момент произнесения; счётчики для фактов запрещены.
- Ничего не выдумывать: факты, обещания, доход — только как сказал автор.
- Текст не на лице и в безопасной зоне; текст ≥ 40 px; время показа ≥ 0,3 × слов + 0,5 с.
- Не «квадратная плашка»: форма, вход с перелётом, микродвижение —
reference/motion.md. - Грабли (alimiter,
-frames:v,setptsбезfps, HDR, blur в Chromium, недописанный файл, jump cut) —reference/pitfalls.md.