Reel$$$hot · производственный регламент

Алгоритм нарезки
длинных видео в Reels

Пошаговый конвейер: из 50-минутного интервью/доклада → готовый вертикальный рилс со смыслом, чистым звуком, трекингом лица и кинематографичными субтитрами. Выверено на риле №1 «Пропасть» (доклад Влада Ясько).

6 этапов исходник 4K1080×1920 движок: Python + ffmpeg + Groq + cv2 глаза на линии 0.355
0Подготовка 1Смысл 2Чистка 3Кадр 4Субтитры 5Грейд+звук 6Приёмка
0

Подготовка

Исходник, транскрипт, сценарий — и сверка сценария с плёнкой
  • Исходник — горизонт 4K (3840×2160). Конверт webm/mkv → mp4 H.264.
  • Полный транскрипт доклада через Groq whisper-large-v3 (SRT + TXT).
  • Сценарий — каждый рил разбит на биты: ХУК → РАЗВИТИЕ → СУТЬ → ЭКСПЕРТ → ЦЕННОСТЬ → CTA, у каждого свой таймкод на плёнке.
⚠ Грабли №1: сценарий часто «причёсан» — фразы, которых спикер дословно НЕ говорил, и таймкоды врут. Перед нарезкой сверять каждый бит с транскриптом и брать ДОСЛОВНЫЕ слова + верный tc. Иначе word-align не находит, кусок захватывает лишнее и обрывается.
1

Нарезка по смыслу

Word-perfect: каждое слово на месте, ничего лишнего, ничего обрезанного
  • Каждый бит берётся со своего таймкода (рил собирается из кусков с разных минут — это нормально).
  • Текст таргета — дословно с плёнки, не пересказ.
  • Groq word-align: широкое окно ~50с вокруг tc → пословные тайминги → фаззи-матч таргета → старт первого слова / конец последнего.
  • Snap-to-silence: точки реза двигаются к ближайшей паузе (тишина ≥80мс).
  • Клэмп по границам слов: рез не заходит за начало следующего / конец предыдущего слова → нулевой подтёк соседних слов.
  • Хвост-фикс: дотягиваем последнее слово фаззи (нравятся≈нравится), чтобы не резать панчлайн.
  • Обратная Groq-сверка каждого куска с контекстом ±1.2с → Левенштейн ≈ 0.
⚠ Грабли №2: Groq на КОРОТКОМ изолированном клипе галлюцинирует («Субтитры сделал DimaTorzok»). Поэтому сверять только с контекстом, а не голый коротыш.
2

Чистка хвостов

Затяжки, филлеры, ложные старты, провисшие паузы
  • Удалить: явный мусор-междометия (ну / эм / ммм / двойные-тройные гласные), ложные старты (повтор слова), ужать паузы >0.45с до ~0.2с.
  • Триммить, НЕ удалять: реальные однобуквенные слова я и а о у — у них режем только растянутость («Яяя» → «я»), само слово остаётся.
  • Контентные длинные слова (интонация) — НЕ трогать, помечать «?» на ручную.
⚠ Грабли №3: сборка кусков — ТОЛЬКО filter_complex одним проходом (trim/atrim+concat). Конкат многих файлов рвёт A/V на стыках и теряет слова (ловили 95 слов вместо 195).
3

Кадрирование

Динамический трекинг лица: глаза всегда на линии 0.355, Влад всегда в кадре

Eye-lock — динамический трекинг

  • Семпл лица каждые 0.3с (cv2 Haar) → траектория → сглаживание → кроп с time-varying x/y (ffmpeg crop-выражение).
  • Глаза на линии 0.355 (граница верхней трети). Калибровка EYE_CROP=0.43 в формуле даёт реальные 0.355 (оценка по face-боксу систематически завышена).
  • Адаптивный зум — окно подбирается так, чтобы глаза достижимы во всех кейфреймах (без упора в край), BASE_ZOOM 1.40.
  • Отброс скачков >0.16 (чужие/шум) + удержание при потере → камера не дёргается.
✓ Ключевой фикс: рядом сидит интервьюер — трекер прыгал на ЕГО лицо («Влад уехал», субтитры на лице). Решение: опознавать Влада по тёмным очкам — считаем темноту полосы глаз у каждого лица, приоритет тем, кто в очках. На любом куске со вторым человеком без этого камера уедет на него.
Размер по горизонтали меритьвизуально, не по числам
Линия глазy = 0.355 (±0.02), одинаково во всех кусках
Опознать Владатёмные очки (shade полосы глаз > 0.45)
4

Субтитры — Стиль 1

Союз Гротеск + оранжевый скрипт-акцент, на груди, кинетика
ТелоСоюз Гротеск, строчные, белый
АкцентGood Vibes скрипт, оранжевый #E66615
Размер акцентаВИЗУАЛЬНО = тело по x-heightemph_scale 1.42 (не по cap-height!)
Раскладкав основном 2 строки (accent_own_line off), лесенка изредка
Межстрочный≈ ширина пробела (line_gap 0.70)
Позицияна груди — центр между подбородком и пупком (caption_top 0.55), НЕ на лице
Анимацияпословное появление + лёгкое покачивание
⚠ Грабли №4: «одной высоты» = равная видимая высота строчных (x-height), а не числовой кегль и не заглавные. Скрипт визуально «легче» → при равном cap-height кажется мельче.
5

Грейд + музыка

Натуральный кино-цвет, музыка по смыслу — интервью-стандарт
  • Грейд натуральный: лёгкий контраст/сатурация, нейтральный баланс белого, виньетка PI*0.09 (почти нет). НЕ жёлтый, не пережатый. Кастомный plan["grade"]["vf"] — применяется ДО субтитров (текст чистый).
  • Музыка: авто-подбор по смыслу, ровный фон без дакинга, база 0.10, дроп на ключевой мысли.
  • Интервью-стандарт: НЕТ графики / стат-попов / тайтл-карт / SFX / AI-бролла. Кадр чистый.
6

Приёмка

Проверка кадрами по всей длине — не один кадр
  • Выдернуть серию кадров по всей длине (особенно где спикер двигается).
  • Проверить: глаза на 0.355 во всех планах · спикер центрирован и в кадре · субтитры на груди, не на лице · нет скачков между кусками.
  • Финальная транскрипция всего рила (одна, надёжно) — текст слово-в-слово, без потерь.

10 правил, без которых развалится

  • Текст битов — дословно с плёнки, не из причёсанного сценария. Сверять с транскриптом.
  • Резать по пословным таймингам Groq, snap-to-silence + клэмп границ слов.
  • Обратная сверка кусков только с контекстом ±1.2с (иначе галлюцинация).
  • Чистка: реальные слова триммить, не удалять; сборка только filter_complex.
  • Глаза всегда на 0.355 (калибровка 0.43), адаптивный зум — без упора в край.
  • Опознавать спикера по устойчивому признаку (тёмные очки) — иначе камера уедет на соседа.
  • Камера двигается только за устойчивым перемещением; шум и чужие лица — игнор.
  • Субтитры: акцент визуально = тело (x-height), межстрочный ≈ пробел, на груди (не на лице).
  • Грейд натуральный, без жёлтого; виньетка не на лицо; без графики/SFX.
  • Приёмка серией кадров по всей длине, не одним стоп-кадром.

Reel$$$hot · алгоритм нарезки длинных видео · v1 (рил «Пропасть», доклад Влада Ясько)
движки: _reel01_smart.py (смысл+кадр) · _reel01_stage2.py (чистка) · _reel01_render.py → montage.py (субтитры+грейд+звук)