Reel$$$hot · производственный регламент
Алгоритм нарезки
длинных видео в Reels
Пошаговый конвейер: из 50-минутного интервью/доклада → готовый вертикальный рилс со смыслом, чистым звуком, трекингом лица и кинематографичными субтитрами. Выверено на риле №1 «Пропасть» (доклад Влада Ясько).
6 этапов
исходник 4K → 1080×1920
движок: Python + ffmpeg + Groq + cv2
глаза на линии 0.355
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-height → emph_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.
- Приёмка серией кадров по всей длине, не одним стоп-кадром.