🎬 Регламент нарезки рилов из длинного видео

Полный пошаговый процесс + все правила. Отработано на 20 рилах Влада Ясько. Держать под рукой на каждый новый исходник.

ГЛАВНЫЙ ПРИНЦИП. Каждый рил = 4–6 смысловых битов (ХУК → РАЗВИТИЕ → ЭКСПЕРТ → ЦЕННОСТЬ → СУТЬ → CTA), нарезанных дословно с плёнки по явным таймкодам. Никакого пересказа, никакого «примерно». Один рил проходит цикл: данные → реальные tc → перегон → сверка → кадр → звук → утверждение Арта → деплой.

0. Что нужно на старте (один раз на видео)

1. Пошаговый процесс на КАЖДЫЙ рил

ШАГ 1 — Сценарий (биты). Определить тему рила и 4–6 битов. Каждый бит = завершённая мысль, дословная фраза Влада. Структура: ХУК (цепляет с 1 секунды) → РАЗВИТИЕЭКСПЕРТ (методология/цифры) → ЦЕННОСТЬ (что получу) → СУТЬ (главный инсайт) → CTA. Записать в _gen_scenarios.py.
ШАГ 2 — Найти РЕАЛЬНЫЕ позиции. SRT-таймкоды ВРУТ (на 19:19 в SRT может быть уже CTA). Реальные позиции берём двумя способами:
GK=$(grep -oE 'gsk_[A-Za-z0-9_-]+' ~/.zshrc|head -1)
ffmpeg -y -ss 1758 -to 1818 -i <видео> -ar 16000 -ac 1 /tmp/w.mp3
curl -sS https://api.groq.com/openai/v1/audio/transcriptions \
 -H "Authorization: Bearer $GK" -F file=@/tmp/w.mp3 \
 -F model=whisper-large-v3 -F language=ru \
 -F response_format=verbose_json -F "timestamp_granularities[]=word" \
 | python3 -c "import json,sys;d=json.load(sys.stdin);print(' '.join(f\"[{1758+w['start']:.1f}]{w['word']}\" for w in d.get('words',[])))"
Получаем каждое слово с точным временем → ставим границы бита ровно от первого до последнего нужного слова.
ШАГ 3 — Явные таймкоды. В _gen_scenarios.py у бита вместо "19:13" писать диапазон "19:09.5-19:13.2" (mm:ss.d). Это режет РОВНО по окну, минуя капризный fuzzy-align. Обязательно для битов, которые сидят близко друг к другу (в одном прогоне речи) — иначе fuzzy их крамит: дубли, пропажи, обрезки.
ШАГ 4 — Перегон + сверка. BATCH_ONLY=NN python3 _batch_reels.py. Потом сверить результат транскриптом (Groq по финалу) — все биты на месте? дублей нет? не обрезано? Транскрипт финала:
ffmpeg -y -i нарезка/NN_final.mp4 -ar 16000 -ac 1 /tmp/r.mp3
curl ... -F response_format=verbose_json -F "timestamp_granularities[]=segment" ...
ШАГ 5 — Проверить КАДР. Выдернуть 3–5 кадров по длине (ffmpeg -ss T -i final -frames:v 1 f.jpg) и глазами: в кадре Влад (не Данил/не экран), он не в углу, субтитры на груди (не на лице/над головой), «Claude Desktop» на одной строке.
ШАГ 6 — Звук. Авто: _batch_reels.py в конце дублирует левый канал в оба (голос Влада в исходнике только слева). Проверка: оба канала ~равны по mean_volume.
ШАГ 7 — Утверждение Арта. Открыть рил (open final.mp4), показать что починил. Ждать «ок/заебись/дальше» — только потом деплой.
ШАГ 8 — Деплой. Пересжать в 720p под новым именем NN-vX.mp4 (X больше прошлого!), поправить index.html, wrangler pages deploy. Новое имя = кэш не подсунет старьё.

2. Правила НАРЕЗКИ (движок)

ПравилоКак
Явные tc для близких битовБиты в одном прогоне речи (напр. 28:00–28:40) крамятся fuzzy → писать диапазоны mm:ss.d-mm:ss.d. Форс-кусок в stage2 идёт БЕЗ чистки (он уже цельный).
Якорь кадраКогда рядом чужое лицо (Данил) или экран сбивает трекер: "41:09-41:25@cx,ey,zoom" — статичный кроп на Владе, мимо трекера. Пример: @0.32,0.46,1.5. cx/ey — доля кадра (0.32=слева), zoom — крупность.
Границы по словамНачало бита — на первом слове, конец — сразу за последним. Иначе цепляет соседнюю фразу («Пожалуйста. Все») или обрезает панч-слово («живи в моём…» без «Telegram»).
Текст = звукТекст бита в данных должен совпадать с тем, что реально сказано. Сильно короче звука → субтитр «зависает» (слова размазываются). Пропускать 1–2 слова можно, фразу — нет.
Кросс-дедупОдин и тот же кусок НЕ должен быть в двух рилах. Вести учёт: продавец «10 лет» → только рил 12; «бот спишь / ты один» → только рил 20; ДНК-триггеры → только рил 10.
Битый бит убратьЕсли бит провалился (align<0.3, 0.4с мусора) и рил без него цельный — просто удалить бит (глитч-огрызок в конце уйдёт).

3. Правила СУБТИТРОВ (Стиль 1)

4. Правила КАДРА

5. Правила ЗВУКА

6. Правила CTA

7. Правила ДЕПЛОЯ

8. ✅ Чеклист приёмки (перед показом Арту)

9. 🔧 Типичные баги → фиксы

СимптомПричинаФикс
Фраза повторяется 2 разаХук перехватил кусок следующего битаЯвные tc: хук кончается ровно перед фразой развития
Бит пропал / рил слишком короткийКрам близких битов, fuzzy схлопнулЯвные tc по словам на каждый бит
Обрезано на полусловеНеверный tc (SRT врёт) / граница не по словуGroq пословно → точная граница
Субтитры висят / в 2 ряда весь роликOver-bracket (речь склеилась в одну «фразу»)Явные tc → тугой кусок
Субтитры «ебанулись» за 4–5с до концаПровалившийся бит = 0.4с огрызок перед CTAУбрать битый бит
Зависание / лаг субтитра в концеТекст бита короче звука (рамбли-CTA)Кодовое-CTA (короткий) + текст = звук
«Desktop» на отдельной карточкеПеренос последнего словаАнти-сирота (уже в движке)
В кадре Данил вместо ВладаТрекер поймал соседаЯкорь @cx,ey,zoom на позицию Влада
Влад в углу / кадр на экранеТрекер поймал лицо на проекцииЯкорь на реальную позицию Влада (проверить 4K)
Голос в одно ухоИсходник пишет голос в левый каналpan дублирует левый в оба (авто)
На сайте старое видеоКэш (одинаковое имя файла)Новое имя -vX + no-cache + Cmd+Shift+R

10. Ключевые файлы и команды

# данные всех рилов (title + биты + tc)
reels_analysis/_gen_scenarios.py

# перегнать один рил (или несколько через запятую)
BATCH_ONLY=7 python3 _batch_reels.py
BATCH_ONLY=14,16,18,19 python3 _batch_reels.py

# формат бита в SEGMENTS:
("ХУК","11:32.5-11:34.9","дословный текст","акцент")   # явный tc
("ХУК","41:09-41:25@0.32,0.46,1.5","...","...")          # + якорь кадра
("ХУК","13:22","...","...")                              # fuzzy (только если бит одиночный)

# деплой (сменить имя на новую версию!)
ffmpeg -i нарезка/NN_final.mp4 -vf scale=720:1280 -crf 28 ... .deploy-vlad-reels/NN-vX.mp4
cd .deploy-vlad-reels && wrangler pages deploy . --project-name=vlad-reels --branch=main --commit-dirty=true
КОРОТКО, КАК МАНТРА:
Дословно с плёнки · реальные tc из Groq (не из SRT) · явные диапазоны для близких битов · сверять транскриптом · Влад в кадре (не Данил) · субтитры на груди по словам · звук в оба уха · кодовое-CTA · кросс-дедуп · утвердил Арт → деплой под новым именем.
Reel$$$hot · регламент нарезки · отработано на 20 рилах