← все проекты

Монтажёр (ИИ-монтаж живого сырья)

Скилл Claude Code + локальный конвейер на Windows владельца (RTX 3060 12 ГБ): разбор сырья, нарезка длинного, сборка из дублей с матч-катами и инфографикой, аутро для Пульса цен. Опора на С12 «Режиссёр роликов» cz-core (лист, блоки, критик). В Контент Завод позже по API. Память: ai-montazher-project.

готовS1 · С0 · Разбор сырья и каркас21/21

Цель: Папка с видео → index.json (сцены, речь пословно, паузы, лицо и поворот головы, качество, дубли, Gemini-описание) + локальная раскадровка. Проект, docs/, venv CUDA, лист из cz-core.

↑ Каркас: папка проекта, docs, окружение CUDA
E:\Проекты для Гитхаба\montazher: docs/PROJECT, ACCEPTANCE, MONTAZH-MACHINE, DECISIONS-QUEUE, SCOPE-CUTS-LOG. venv с torch CUDA, whisperx, mediapipe, scenedetect, opencv, librosa. Ключ OpenRouter с cfru в .env.
✓ E:\Проекты для Гитхаба\montazher (+ латинский вход E:\mz), docs/PROJECT, ACCEPTANCE, INDEX, MONTAZH-MACHINE, DECISIONS-QUEUE, SCOPE-CUTS-LOG. venv: torch 2.8+cu128, whisperx 3.7, mediapipe 1.0, scenedetect 0.7, librosa. Ключ OpenRouter в .env.
feature
↑ Экзамены С0 до кода (spec-tests)
tests/test_c0_*.py по таблице ACCEPTANCE.md: A1–A10. Обязаны упасть на пустом коде. Исполнителю только на чтение.
✓ tests/conftest.py + tests/test_c0_razbor.py: 11 экзаменов A1–A10 (+ live A8 под флагом). Первый прогон падал (нет модуля), после кода: 10 passed, 1 skipped.
feature
Разбор сырья: паспорт, сцены, паузы, качество (код)
ffprobe + PySceneDetect + silencedetect + OpenCV. Поворот кадра по лицу. Миниатюры сцен на диск.
✓ montazher/ff.py, scenes.py: ffprobe, прокси 480p, PySceneDetect по прокси (2 с вместо 98), silencedetect с порогом от среднего уровня, резкость/экспозиция OpenCV. MVI помечен повёрнутым (−90°).
feature
A1 паспорт файла и признак «кадр повёрнут»
MVI_0014 помечен повёрнутым, .MOV нет. test_a1_passport
✓ pytest tests/test_c0_razbor.py: passed (16.09, 10 passed, 1 skipped). A11: out/test-c0/rech-sverka.md.
acceptance
A2 сцены по порядку, ≥0,3 сек, миниатюра у каждой
test_a2_scenes
✓ pytest tests/test_c0_razbor.py: passed (16.09, 10 passed, 1 skipped). A11: out/test-c0/rech-sverka.md.
acceptance
A4 паузы >0,4 сек внутри файла, без пересечений
test_a4_pauses
✓ pytest tests/test_c0_razbor.py: passed (16.09, 10 passed, 1 skipped). A11: out/test-c0/rech-sverka.md.
acceptance
A6 резкость и экспозиция числом и словом на сцену
test_a6_quality
✓ pytest tests/test_c0_razbor.py: passed (16.09, 10 passed, 1 skipped). A11: out/test-c0/rech-sverka.md.
acceptance
Речь по словам: WhisperX на CUDA + сверка с GigaAM
Тайминги слов от WhisperX (выравнивание ru). Текст сверить с GigaAM на cfru (voice_text.py), расхождения по лицу глагола в отчёт rech-sverka.md.
✓ montazher/speech.py (large-v3 float16, выравнивание ru, монотонность), montazher/sverka.py. Сверка: dubl-1 похожесть 85%, mvi 95%, расхождений по лицу глагола нет; отчёты out/test-c0/rech-sverka.md.
feature
A3 речь по словам: монотонно, ≥100 слов на дубле, русский
test_a3_words
✓ pytest tests/test_c0_razbor.py: passed (16.09, 10 passed, 1 skipped). A11: out/test-c0/rech-sverka.md.
acceptance
A11 отчёт сверки речи WhisperX vs GigaAM
ручная, приложить rech-sverka.md
✓ out/test-c0/rech-sverka.md: dubl-1 похожесть 85%, mvi 95%, расхождений по лицу глагола нет; Whisper лучше пишет бренды и числа.
acceptance
Лицо и взгляд: MediaPipe, метки направления
FaceLandmarker 5 раз/сек, yaw/pitch через solvePnP, медиана по 5 кадрам, метки в камеру/влево/вправо/вверх/вниз/нет лица, рамка лица для будущего рефрейма.
✓ montazher/gaze.py: FaceLandmarker по прокси 5 раз/сек, yaw/pitch из матрицы, медиана по 5. dubl-1: 81% в камеру, mvi 97%.
feature
A5 метка взгляда ≥5 раз/сек, на дублях >50% «в камеру»
test_a5_gaze
✓ pytest tests/test_c0_razbor.py: passed (16.09, 10 passed, 1 skipped). A11: out/test-c0/rech-sverka.md.
acceptance
Группировка дублей по смыслу фраз
Нормализованный текст, похожесть ≥0,6, группы через файлы. Проверка на двух .MOV.
✓ montazher/takes.py: ratio/token_sort ≥65 при сопоставимой длине (partial_ratio давал мусорную группу на 15 вхождений). Итог: 15 групп, все dubl-1↔dubl-2.
feature
A7 группа дублей содержит фразы из обоих .MOV
test_a7_takes
✓ pytest tests/test_c0_razbor.py: passed (16.09, 10 passed, 1 skipped). A11: out/test-c0/rech-sverka.md.
acceptance
↑ Глаза: Gemini через OpenRouter, смета и гейт
Ужать видео до 480p/2 Мбит, video_url base64, один вызов на файл: описание сцен и моменты с таймкодами. --dry печатает смету. Ключ с cfru. Запуск только после «трачу?».
✓ montazher/eyes.py: смета до вызова, --dry печатает «будет оплачено», кэш ответа. Сухой прогон: 3 файла ≈ 40 468 токенов ≈ 2,2 ₽. Живой прогон ждёт «трачу?».
feature
A8 глаза: --dry печатает смету и не зовёт модель; с ключом у сцен описание
test_a8_eyes_dry, test_a8_eyes_live после «трачу?»
✓ Сухой: test_a8_eyes_dry зелёный, в сеть не ходит. Живой: 18.09, 3 файла, 4,07 ₽ (OpenRouter usage), моменты 5/6/6, 8 моментов вне длительности отброшены после ОТК. Сырой ответ пишется на диск до разбора.
acceptance
Раскадровка: один html без сервера
Лента миниатюр по сценам, текст с таймингами, полоса взгляда, группы дублей, заметки глаз. Без техслов и эмодзи.
✓ montazher/page.py: лента сцен, полоса взгляда, текст с таймингами, паузы, дубли. Проверено скриншотом в браузере.
feature
A9 раскадровка без сервера, без техслов и эмодзи
test_a9_page
✓ pytest tests/test_c0_razbor.py: passed (16.09, 10 passed, 1 skipped). A11: out/test-c0/rech-sverka.md.
acceptance
Идемпотентность: повтор не пересчитывает
Кэш по хешу файла и версии шага в out/<имя>/cache/.
✓ montazher/cache.py: хеш первых 8 МБ + размер, версия шага. Повтор: 0 с на файл, экзамен A10 зелёный.
feature
A10 повтор < 10 сек, индекс тот же
test_a10_idempotent
✓ pytest tests/test_c0_razbor.py: passed (16.09, 10 passed, 1 skipped). A11: out/test-c0/rech-sverka.md.
acceptance
Прогон на найденном сырье + ОТК С0
MVI_0014, два .MOV, лекция 41 мин. Скилл otk перед словом «готово». Заполнить SCOPE-CUTS-LOG.
✓ ОТК круг 1 (18.09): сверка со спекой (9 есть, A8 частично, A11 отчёт потерян) + критик (21 находка со сценариями) + масштаб (41 мин → 297 с, 249 сцен, 12 528 меток; статика: таймауты есть, платный цикл с потолком 40 МБ/10 мин) + регресс. Все находки закрыты кодом, экзамены не тронуты, 10/10 зелёные с чистой папки. SCOPE-CUTS-LOG С0: 5 углов.
feature
ревьюS2 · С1 · Нарежь длинное18/19

Цель: Из индекса кандидаты клипов 15–60 сек с хуком → страница согласования → сборка: вырезка ffmpeg, авто-рефрейм 9:16 со слежением за лицом, караоке-сабы и заголовок слоем Remotion.

↑ Экзамены С1 до кода
tests/test_c1_narezh.py по B1–B10 из ACCEPTANCE.md; тестовое сырьё: конференция 24.03 (out/konf) и лекция 41 мин (out/scale-41). Падают на пустом коде.
✓ tests/test_c1_narezh.py, 10 экзаменов B1–B10; падали на пустом коде (10 errors), после кода и ОТК 10/10.
feature
↑ Кандидаты клипов: фильтр фраз + режиссёр-ИИ + критик кодом
Фильтр галлюцинаций (чёрный список, скорость слов). Один вызов модели через OpenRouter на весь транскрипт: 10–20 кандидатов по номерам фраз, заголовок, хук, причина. Критик кодом: 15–60 с, границы фраз, пересечения ≤20 %, хук в первой фразе.
✓ montazher/narezh.py: чёрный список типовых выдумок Whisper + скорость 0,12–2 с/слово; режиссёр Gemini Flash через OpenRouter (≈33 тыс. токенов ≈ 1 ₽ на 2 часа, кэш по хешу содержания речи, --dry печатает смету); критик: сплошные окна из смежных фраз, подрезка краёв, 15–60 с, пересечения ≤20 %, ≤20 кандидатов, укорачивание заголовка без обрыва на предлоге. Конференция: 18 кандидатов.
feature
B1 ≥5 кандидатов 15–60 с на границах фраз
test_b1_candidates
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
B3 пересечения ≤20 %
test_b3_overlap
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
B4 выдуманные фразы не попадают в кандидаты
test_b4_hallucinations
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
Страница отбора kandidaty.html
Номер, миниатюра, длительность, заголовок, хук, текст, причина. Без техслов и эмодзи. Выбор — командой --render 1,3,5.
✓ narezh.write_page: №, миниатюра (по времени исходника), длительность, диапазон, заголовок, хук, причина, текст, моменты глаз, «Клип собран». Скриншот проверен.
feature
B2 заголовок, хук, причина; страница без техслов
test_b2_page
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
↑ Рендер клипа: точная вырезка + рефрейм 9:16 со слежением за лицом
ffmpeg перекодировка отрезка; лицо MediaPipe на исходнике 5 раз/с, сглаженное окно 9:16 с наездом при мелком лице; кадры через OpenCV в ffmpeg; звук синхронно.
✓ montazher/render.py: лицо MediaPipe (1280) → фигура YOLO11n (зрители у кромки отбрасываются, сброс при рывке), окно 9:16 одной высоты на клип, интерполяция + сглаживание, кадры OpenCV → ffmpeg по трубе, 50→30 к/с по времени, звук -ss/-t. ОТК поймал: время замеров и запроса в разных шкалах (трекинг стоял) — исправлено, проверено кадрами.
feature
B5 рендер 1080×1920, длина ±0,3 с, звук/видео ±0,1 с
test_b5_render
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
B6 лицо в кадре ≥80 %
test_b6_face_in_frame
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
Караоке-субтитры и заголовок (ASS через ffmpeg)
Группы по 2–4 слова, подсветка текущего слова, стиль как в банке примеров (жирный гротеск, цвет бренда). Заголовок первые 2 с. Remotion-титры — в С2.
✓ ASS: группы 2–4 слова ≤22 символов, подсветка от начала слова до начала следующего, светло-зелёный &H00A0FFB4, WrapStyle 0; титр 96 кегль первые 2 с. Remotion-титры — С2.
feature
B7 сабы пословно, группы 2–4, светлый текст в нижней трети
test_b7_subtitles
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
B8 заголовок первые 2 с
test_b8_title
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
Глаза по кускам
--eyes смотрит только кандидатов (≤60 с каждый), смета по ним; --dry офлайн.
✓ cmd_narezh --eyes: куски из прокси по кандидатам (≤60 с), ключ кэша по времени исходника, смета до цикла, --dry офлайн; ReadTimeout не повторяется (защита от двойной оплаты).
feature
B9 глаза по кускам, --dry офлайн
test_b9_eyes_chunks
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
Идемпотентность narezh
Кэш кандидатов по хешу индекса и версии режиссёра; рендер по существованию файла.
✓ Кэш режиссёра по хешу фраз (не байтов index.json), kandidaty.json по хешу+версии, рендер по имени с временем и версией сборки (r3), пропавший mp4 не считается собранным. Повтор 1,7 с.
feature
B10 повтор <10 с, тот же kandidaty.json
test_b10_idempotent
✓ pytest tests/test_c1_narezh.py: 10 passed (19.09, после ОТК круг 1). Оговорки B6/B8 в SCOPE-CUTS-LOG.
acceptance
Прогон на конференции 24.03 + ОТК С1
Кандидаты и 2–3 клипа владельцу на оценку (B11). Скилл otk. SCOPE-CUTS-LOG С1.
✓ ОТК круг 1: сверка со спекой (15 расхождений) + критик (12 находок, 4 критичных) — все закрыты кодом; регресс С0 10/10 с чистой папки; масштаб: 18 клипов собраны. SCOPE-CUTS-LOG С1: 7 углов. B11 ждёт владельца.
feature
B11 оценка владельца: страница и 2–3 клипа
ручная
✓ Ждёт: E:\mz\out\konf\klipy\kandidaty.html + 18 клипов klipy/NNN-*-r3.mp4
acceptance
готовS3 · С2 · Собери из сырых дублей1/1

Цель: Режиссёр-ИИ: бриф + индекс → лист с правилами склеек (граница реплики, взгляд в камеру → в бок = смена ракурса, лучший дубль), инфографика из принятых моушен-блоков, критик кодом, сборка ffmpeg + Remotion, ОТК рендера по кадрам.

↑ Пилот С2: рилс «Мысль утра» из 30 клипов дня на Remotion
✓ E:/Для монтажа/готово/Мысль утра v3.mp4 (70 с, 1080×1920). Движок E:/mz/remotion (слои Shot/Grade/Title/Cards/Hud/Captions), лист reels/den/build_list.py, голос из дубля владельца. Оценка владельца 19.09: «вот уже достойно достаточно». Музыка временная, ждёт «трачу?» ~12 ₽.
feature
планS4 · С3 · Аутро Пульса цен и скилл0/0

Цель: Шаблон аутро из макета, приведение форматов, склейка. Скилл montazher: разбери / нарежь / собери / добавь аутро, карта механики, гейт трат перед Gemini.

задач нет

планS5 · Проверки по сроку0/1

Цель: Отложенные проверки со сроком и командой

Сверить цену gemini-2.5-flash в eyes.PRICE с OpenRouter
⏱ 18.10 · просрочено 12 дн.
Сухой прогон обязан быть офлайн, поэтому цена зашита в montazher/eyes.py PRICE ($0.30/$2.50 за млн на 18.09). Проверка: curl -s https://openrouter.ai/api/v1/models | python -c "import json,sys; m=[x for x in json.load(sys.stdin)['data'] if x['id']=='google/gemini-2.5-flash'][0]; print(m['pricing'])" — если цена изменилась, поправить PRICE и комментарий с датой.
check

Ворклог (места остановки)

19.09.2026, 10:23:56 · S3 · claude

19.09: владелец забраковал С1 (нарезка+сабы) и поставил планку «монтажёр за 10k$». За день поднят движок Remotion локально (Kaspersky CA для npm/Chrome, клипы копией в public), собран пилот «Мысль утра»: голос из речи владельца с ужатыми паузами и лицом синхронно, кадры дня как иллюстрация тезисов, кинетические титры на слова, триптих, полоса глав, караоке, цветокор с зерном, финал в ритм. Три версии по раскадровкам, v3 принята: «достойно». Потрачено 0 ₽.

→ 1) Музыка: Suno через Kie, 2 варианта ≈12 ₽ — ждём «трачу?». 2) Кодифицировать режиссёра: лист из индекса моделью по шаблону build_list (слово→кадр), критик кодом. 3) Перенести стиль PRIMERY (карточки, вставки со свечением). 4) Скилл montazher (С3) поверх движка.

19.09.2026, 05:30:20 · S2 · claude

19.09: С1 «Нарежь длинное» собран на записи конференции Fit&Lead 24.03 (2 ч 05 мин): разбор 23 мин, режиссёр выбрал 18 кандидатов, все 18 собраны в 1080×1920 с рефреймом по фигуре (YOLO) и караоке-сабами. ОТК круг 1: 27 находок, все закрыты (главное: трекинг стоял из-за разных шкал времени; дыры в окне кандидата; кэш режиссёра сбрасывался любой перезаписью индекса; --dry не покрывал режиссёра). Экзамены С1 10/10, регресс С0 10/10. Потрачено ≈3 ₽ (режиссёр трижды: ошибка переноса кэша) + 0,4 ₽ лекция.

→ B11: владелец смотрит kandidaty.html и клипы. Дальше С2 «Собери из сырых дублей» по docs/PRIMERY.md (титры на ключевое слово, карточки, две камеры) — нужно настоящее сырьё. Углы С1: окно по сценам, раскладка слайд+спикер, экзамены B6/B8 переписать.

19.09.2026, 00:27:24 · S3 · claude

19.09: владелец прислал 12 готовых рилсов как примеры (E:/Для монтажа/raw). Разобраны конвейером С0 (12 файлов, 21 группа повторов шаблонных фраз). Стиль снят в docs/PRIMERY.md: титры на ключевое слово, карточки, вставки со свечением, две камеры. Найдена и закрыта грабля: телефон снизу даёт наклон +15..+31°, метка «в камеру» теперь от базовой позы файла (gaze v3). Паузы под музыкой silencedetect не видит — для С1 брать из речи.

→ С1 «Нарежь длинное»: критерии → экзамены → код. С2 строить по docs/PRIMERY.md.

18.09.2026, 04:18:30 · S1 · claude

18.09: С0 закрыт через ОТК. Живые глаза: 4,07 ₽ за 3 файла, описания и моменты по делу. Найдено и закрыто: Kaspersky перехватывает TLS (truststore), моменты вне длительности, сухой прогон ходил в сеть, оплаченный ответ не сохранялся до разбора, прокси без атомарной записи, миниатюры по имени файла, версии шагов не доходили до кэша, файлы без звука/видео роняли трейсбеком, VFR-время в взгляде, cp1251-консоль. Масштаб: 41 мин за 297 с. Anything2Explainer изучен: идеи в память, код нельзя (PolyForm Noncommercial).

→ С1 «Нарежь длинное»: критерии в ACCEPTANCE.md → экзамены → код: кандидаты клипов из индекса (законченная мысль 15–60 с, хук), фильтр галлюцинаций на музыке, глаза по кускам (предел 10 мин), страница согласования, рефрейм 9:16 со слежением за лицом, караоке-сабы слоем Remotion. Ждём от владельца: 10 сырых дублей, макет аутро Пульса цен, клип «вверх/вправо» для знака взгляда.

16.09.2026, 13:00:41 · S1 · claude

16.09 вечер: С0 собран и прогнан на сырье (mvi.mp4 с хромакеем, два .MOV — оказались готовыми рилсами, но как дубли годятся). Экзамены 10/10 зелёные, живые «глаза» ждут гейта. Грабли дня в MONTAZH-MACHINE: кириллица в пути (MediaPipe, imread), разные диски C:/E: (pip, nltk), xet-CDN HF по SSL, whisperx требует torch 2.8, сцены по 1080p медленно → прокси 480p.

→ 1) «трачу?» на 2,2 ₽ → живой прогон глаз → A8 закрыть. 2) ОТК С0 (скилл otk), SCOPE-CUTS-LOG. 3) С1 «Нарежь длинное»: критерии, экзамены, код на лекции 41 мин.

16.09.2026, 10:53:24 · S1 · claude

16.09: разведка и ресерч. Выгружен канал ИИздец (821 сообщение, серия про монтаж 11.08 и 27–28.08, примеры моушена просмотрены покадрово: рилс из моушен-сцен с окнами под лицо, 5 слоёв наполнения, звук — слабое место). Поднято сделанное в cz-core С12 (лист, рендерер director-render остановлен 03.09, 8 блоков, критик, разборщик). Ресерч: Gemini agentic video через OpenRouter как «глаза», WhisperX/MediaPipe/PySceneDetect/librosa кодом, Remotion + правила движения, Kling start-end и Runway Aleph через Kie на потом. Решения владельца: отдельный сервис + скилл; всё локально на Windows (RTX 3060 12 ГБ); Gemini ок; сначала бесплатный уровень. Локально: ffmpeg 8.1, Node 22, Python 3.11, CUDA-пакетов нет. Сырьё найдено: E:\Видео ИИ\MVI_0014.MP4 (хромакей, 2:35), два дубля E:\copy_*.MOV по 93 сек, лекция 41 мин в E:\Разобрать.

→ Ждём «ок» владельца по плану С0–С3 (план в чате 16.09). После ок: завести папку проекта E:\Проекты для Гитхаба\montazher с docs/ (PROJECT, ACCEPTANCE, MONTAZH-MACHINE), задачи и критерии kind:acceptance в С0, экзамены spec-tests, venv CUDA, разбор сырья на найденных файлах. Ждём от владельца: 10 сырых дублей, длинный ролик, макет аутро Пульса цен.