Зачем собирать самому
Если снимаешь обучающие ролики и разборы регулярно — экран + голова в углу становится основным форматом. Заказывать монтаж каждого выпуска — это либо деньги на фрилансера, либо очередь и ожидание. Собрать один раз рабочий локальный пайплайн — вложение, которое окупается на втором-третьем ролике.
ИИ здесь — рычаг на трёх местах: расшифровка сегментов для поиска фальстартов (руками нереально прослушать 330+ обрезков), подбор вставок по собственному каталогу материалов (без него не вспомнишь, что где лежит) и генерация карточек-инфографики. Резка тишины, геометрия композита, финальный рендер — это ffmpeg и авто-detector, без нейросетей, но именно они делают тяжёлую работу.
Ниже — не абстрактная теория, а разбор одного реального ролика: 18 минут 47 секунд, 331 финальный сегмент, ни рубля на монтажные сервисы.
Геометрия кадра
Холст — 1920×1080. Окно записи экрана — 1500×844 в позиции (48, 90). Голова — кроп из вертикального видео с телефона, crop=1762:3340:199:500, затем scale=544:1032, позиция (1352, 24). Сверху — PNG-рамка на весь кадр.
Важное следствие этих чисел: голова перекрывает правые 196 px окна экрана (окно кончается на 1548, голова начинается на 1352). Это влияет на всё, что показывается внутри окна — вставки и карточки нужно проектировать с учётом этой полосы.
Рабочий filter_complex (вход 0 — чёрный фон через lavfi 1920×1080, 1 — запись экрана, 2 — видео с телефона, 3 — PNG-рамка):
[1:v]scale=1500:844,fps=30,setpts=PTS-STARTPTS[scr];
[2:v]crop=1762:3340:199:500,scale=544:1032,fps=30,setpts=PTS-STARTPTS[head];
[0:v][scr]overlay=48:90[tmp1];
[tmp1][head]overlay=1352:24[tmp2];
[tmp2][3:v]overlay=0:0[vout]
Звук берётся с телефона (-map 2:a) — микрофон чище, чем у захвата экрана. На каждом сегменте фейды afade: 0.03 с на вход, 0.08 с на выход. Без них на склейках слышны щелчки.
fps=30,setpts=PTS-STARTPTS), иначе в композите проскакивают чёрные микрокадры на стыках.8 шагов пайплайна
- Съёмка. Телефон снимает лицо вертикально, параллельно идёт запись экрана. Хлопок не нужен — синхронизация дальше идёт по звуку.
- Синхронизация ракурсов. Кросс-корреляция звуковых дорожек телефона и записи экрана. На реальном ролике офсет вышел 0.92 с. Принимать офсет стоит, только если корреляция уверенная.
- Резка тишины. auto-editor режет по амплитуде звука, не по паузам в транскрипте — Whisper врёт про паузы: показывает разрыв там, где его нет. На выходе — список сегментов (
source_in/source_outв кадрах +fps). - Посегментный рендер. Каждый кусок рендерится отдельным mp4, затем склейка
ffmpeg -f concat. Смысл не в красоте: пересобрать один сегмент — 2 секунды, пересобрать весь 19-минутный ролик целиком — 12 минут. - Повторы и фальстарты. Отдельный проход после резки тишины — auto-editor их не убирает (раздел ниже).
- Вставки. Подмена содержимого окна экрана; голова в рамке не двигается и не пересобирается.
- Инфографика-карточки. Размер ровно 1500×844 — под окно экрана.
- Экспорт. mp4 H.264, CRF 26, preset slow,
-movflags +faststart+ постер-кадр. Либо FCPXML для DaVinci Resolve, если дочищать хочется руками.
Повторы и фальстарты
Это самый ценный раздел — здесь реально теряется время, если не знать про две ловушки заранее. Человек, записывая дубль, начинает фразу, обрывает и говорит заново. Auto-editor это не убирает: пауза между фальстартом и переспросом обычно короче порога тишины.
Главная ловушка: искать по расшифровке всей дорожки — бесполезно
Если расшифровать всю дорожку целиком, повторы не видно: Whisper схлопывает фальстарт с переспросом в одно вхождение, и текст в этом месте выглядит чистым, хотя фраза сказана дважды.
Рабочий способ — расшифровать КАЖДЫЙ сегмент отдельным коротким клипом. На клипе в 2 секунды модели нечем «причесать» повтор, и она отдаёт его как есть. Массово это гоняется через whisper-server, модель грузится один раз: 332 сегмента ≈ 4 минуты.
whisper-server -m ~/.whisper-models/ggml-large-v3.bin -l ru --port 8178 -mc 0 -bo 1 -bs 1 -nf
POST на /inference, поле file. Флаг -tp серверу не передавать — падает в help.
Обратная ловушка: слово разрезано пополам на стыке сегментов
Она дороже первой. На границе сегментов слово физически разрезано пополам, и распознавалка достраивает его целиком с обеих сторон. В тексте это выглядит как повтор — в звуке его нет:
хвост сегмента 71: «…и сама карта системы,»
начало сегмента 72: «системы, которая открывается…»
Здесь «системы» произнесено один раз — просто разрезано склейкой. Наличие выреза между сегментами само по себе ничего не доказывает.
Признаки настоящего фальстарта: вторая версия звучит иначе, чем первая (обрублено против полного — «стате…» против «статейная»), и первый сегмент целиком состоит из этой фразы. Реальная цифра с этого ролика: из 8 кандидатов, прошедших автоматический фильтр, настоящим оказался один. Остальные семь отбраковали на слух за минуту.
Правило резки: первое вхождение режем, последнее оставляем. И список всегда показывать человеку до резки — дословно, с таймкодами, обе версии фразы, что именно уйдёт.
Показ с экрана — самая дорогая ошибка
Если в ролике ты включаешь видео на своём экране и показываешь результат — звук плеера приходит на микрофон телефона примерно на −45 дБ. Это ниже порога тишины −32 дБ. Для резки весь показ формально является тишиной, и она выносит его целиком.
Живая цифра с этого ролика: из 166 секунд демонстрации готового видео в первой сборке выжило 42 %. Девяносто шесть секунд — то самое доказательство, ради которого сцену и снимали, — уехали в мусор. Сверху добило второе правило: «сегмент тише −40 дБ = огрызок без речи». Whisper выдавал на этих кусках обрывки чужого текста («Углубление», «который упал»), и они выглядели как шум.
На дорожке три полосы разделяются уверенно:
- речь в кадре — −25…−32 дБ
- звук плеера на ноутбуке — −50…−38 дБ
- настоящая тишина комнаты — ниже −55 дБ
Значит, порог надо опускать не везде, а внутри окон показа. Рабочие настройки: −52 дБ, пауза от 0,80 с, оставляем 0,40 с. Порог −52 дБ проходит между плеером и комнатой, длинная пауза не даёт показу рассыпаться на конфетти из склеек. И правило «тише −40 дБ = мусор» внутри этих окон не применяется вовсе.
Границы окон ищутся по профилю громкости: пол комнаты берётся как 5-й перцентиль, речь как 75-й, а между ними — полоса плеера. Дальше отмечаются отрезки, где полоса держится, а речи нет, и склеиваются через паузы на комментарий. Окна лучше брать с запасом: прихватишь лишнего — тихий порог всё равно вырежет настоящую тишину, а недоберёшь — кусок показа исчезнет.
Как проверить на готовом. Показ должен быть примерно на 15 дБ тише речи:
замерь ffmpeg -ss ВРЕМЯ -t 8 -i мастер.mp4 -af volumedetect -f null -.
Речь около −14 дБ, показ около −28 дБ — слышно, но с голосом не спорит.
Звук: громкость и синхронность
Речь с телефона идёт на −25…−30 LUFS, но одиночные щелчки и касания стола дотягивают
до −1 дБ. Гребёнка в 20+ дБ не даёт loudnorm поднять уровень линейно — он
упирается в −16 LUFS и останавливается. YouTube приводит всё к −14 LUFS и только
приглушает: сдашь тише — он не поднимет, ролик будет звучать тише соседних.
acompressor такие всплески не ловит: щелчок короче его attack. Нужен
быстрый lookahead-лимитер. Рабочая цепочка целиком:
highpass=f=75, volume=<подобранное>dB, alimiter=limit=0.78:level=false:attack=1:release=60
У alimiter параметр level по умолчанию
включён. Он подтягивает выход обратно к нулю и полностью съедает limit:
сколько ни ставь limit=0.66, на выходе пик 0,0 дБ, а true peak уезжает
за 0 dBTP. Всегда level=false. И ещё: makeup у
acompressor — линейный множитель, а не децибелы, makeup=3
это ×3, то есть +9,5 дБ.
Усиление подбирается итерациями по невязке: лимитер съедает тем больше, чем сильнее давишь, поэтому одним делением не обойтись. Считать на выжимке из трёх кусков по 40 с — замер по всему файлу слишком долгий, а результат тот же.
Картинка и звук должны сходиться кадр в кадр
- Длительности считать в кадрах на обоих концах. Если в плане складывать сырые секунды сегментов, а резать по кадрам, план расходится с резкой. На 130 склейках это дало два кадра, и картинка вышла короче звука.
- В конце цепочки резки звука обязательны
apad,atrim=0:<длина>.-tперед-iокругляется до кадра AAC-декодера (~21 мс), каждый сегмент выходит на доли миллисекунды длиннее, и на сотне склеек звук уезжает от картинки на десятки миллисекунд. -ssи-tставим ДО-i. Если после, фильтр видит исходные таймкоды, иafade=outсо своимstсрабатывает ещё до начала сегмента — на выходе цифровая тишина во всех сегментах, кроме первых.- Границы блоков задавать через
-frames:v. Иначе каждый блок округляется вверх на кадр-другой, за полтора десятка блоков набегает полсекунды, и к финалу губа уезжает от звука.
Вставки — грабли, которые стоили времени
- Вторая голова в кадре. Почти во всех скринкастах в правом нижнем углу своя вебка. Если оставить — в кадре два лица. Решение: кропать врезку
crop=1500:844нативно из 1920×1080 — вебка уходит за границу кадра, качество не теряется, потому что масштабирования нет. Правые 196 px врезки всё равно перекрыты головой. - Со слайдами так нельзя. Голова срезает заголовок. Для слайдов —
crop=1920:840,scale=1304:-2,pad=1500:844:0:(844-ih)/2:0x0a0a0a: слайд целиком влезает в видимую зону, поля — в цвет карточек. - Если у источника вебка занимает половину кадра — берётся только окно браузера и апскейлится. На боевом ролике для сцены «Обзор сайтов» это был
crop=1240:698с последующим апскейлом до 1500×844. - Кроп только с чётными сторонами — x264 не берёт нечётную ширину после масштабирования.
- Разный fps источников. Запись экрана часто в 60 fps, телефон в 30 — приводить к общему fps и сбрасывать PTS у обоих потоков, иначе чёрные микрокадры.
-ssперед-iпрыгает на ближайший ключевой кадр, промахи на секунды. Для точной перемотки внутри исходника —-ssпосле-i.
Карточки-инфографика
Делаются в HyperFrames (HTML + GSAP, рендер в mp4). Размер — ровно 1500×844, под окно экрана. Стиль на реальном ролике: фон #0a0a0a, шрифт Manrope, акцент #ff5a30, крупная цифра + подпись капсом. Примеры реальных карточек с этого урока: «300–500 тыс ₽ — стоимость продвижения в месяц у агентств», «660 000 ₽ продано с сайта за месяц», «4 фазы сборки» списком.
npx hyperframes@0.7.109 render
Нужен Node ≥ 22 — системный v20 не подойдёт.
Каталог материалов
Когда на диске лежат сотни своих записей экрана и съёмок, вставку под конкретный тезис подобрать невозможно — не помнишь, где что. Решение — один раз построить каталог.
Индексатор проходит по папкам с видео (~/Movies, ~/Documents/Материалы YT) и собирает index.tsv: id, длительность, разрешение, путь — плюс контактный лист (сетка миниатюр кадров) на каждый клип. Дальше ИИ смотрит кадры каждого клипа и дописывает человеческий каталог CATALOG.md: что происходит на экране, теги, лучшие куски с таймкодами.
Реальный масштаб: проиндексировано 568 файлов, в каталог попало 433 клипа. Покрытие по тегам: #скринкаст 125, #говорящая-голова 123, #claude 55, #сайт 53, #агенты 32, #аналитика 31 и так далее.
Что это даёт на монтаже: вместо «где-то был скринкаст с Метрикой» — грепнул каталог по слову, получил id, путь и таймкод лучшего куска. Именно так на боевом ролике подобрались 17 вставок под конкретные тезисы: урок про семантику под блок о семантике, таймлапс сборки под «ставится за полтора часа», Яндекс.Метрика со списком сайтов под «продвигаю 15 своих сайтов».
5 промптов
Это ядро гайда — готовые промпты под каждый этап. Копируешь в Claude Code, подставляешь свои пути и тезисы. В каждый зашита геометрия и флаги из этого разбора, чтобы агент не выдумывал их сам. Если не хочешь возиться руками — поставь скилл: там эти шаги уже собраны в один пайплайн и добавлены грабли, которых в промптах нет.
Ты работаешь с двумя дорожками одной записи: [путь к записи экрана] (обычно 60 fps) и
[путь к видео с телефона] (обычно 30 fps — с этой дорожки берём звук, микрофон телефона чище записи экрана).
Сделай:
1. Синхронизируй два ракурса кросс-корреляцией звуковых дорожек (не по хлопку). Прими офсет,
только если корреляция уверенная.
2. Прогони получившийся звук через auto-editor по реальной амплитуде (не по паузам в транскрипте —
на паузы в транскрипте нельзя полагаться, Whisper их искажает) — получи список сегментов
source_in/source_out в кадрах + fps.
3. Приведи оба потока к общему fps и сбрось PTS у обоих (fps=30,setpts=PTS-STARTPTS) — иначе на
стыках 60fps/30fps будут чёрные микрокадры.
Отчитайся: какой офсет получился, сколько сегментов на выходе, сколько секунд вырезано тишины,
есть ли подозрительно короткие сегменты (короче 0.1 с).
У тебя есть список сегментов реза (source_in/source_out, fps) и исходное аудио на дорожке телефона.
Задача — найти фальстарты (человек начал фразу, оборвал, сказал заново), которые резка тишины
не убрала, потому что пауза между обрывом и повтором короче порога тишины.
НЕ расшифровывай всю дорожку целиком — Whisper схлопывает фальстарт с переспросом в одно вхождение,
и место в тексте выглядит чистым, хотя фраза сказана дважды. Вместо этого:
1. Нарежь КАЖДЫЙ сегмент отдельным коротким mp4-клипом.
2. Подними локальный whisper-server (модель грузится один раз, на ~330 сегментов уходит около 4 минут):
whisper-server -m ~/.whisper-models/ggml-large-v3.bin -l ru --port 8178 -mc 0 -bo 1 -bs 1 -nf
Флаг -tp серверу не передавай — падает в help. Расшифровку получай POST-запросом на /inference,
поле file.
3. Сравнивай соседние сегменты нежёстко: фальстарт обычно обрублен («стате…» против «статейная»),
а не идентичен слово в слово.
4. Отсеивай ложные срабатывания на стыках: если хвост сегмента N физически обрывает слово, а начало
сегмента N+1 договаривает его целиком — это НЕ повтор, слово разрезано пополам монтажной склейкой
и звучит один раз. Признак настоящего фальстарта — вторая версия звучит иначе, чем первая, и
первый сегмент ЦЕЛИКОМ состоит из этой фразы.
Верни таблицу кандидатов: номер сегмента, что говорит, чем отличается от соседнего, почему это
фальстарт, а не разрезанное слово. НЕ РЕЖЬ САМ — это список на утверждение человеком. Правило по
умолчанию, если утвердят: первое вхождение режем, последнее оставляем.
У меня есть индекс своей видеотеки: index.tsv (id, длительность, разрешение, путь) и CATALOG.md
(что на экране, теги, лучшие куски по таймкодам для каждого id).
Вот тезисы ролика с таймкодами: [вставь список].
Для каждого тезиса найди в CATALOG.md подходящую вставку. Верни таблицу: тезис → id клипа → путь
(из index.tsv) → таймкод лучшего куска → чем обосновано (что на экране совпадает с тезисом).
Жёсткое ограничение: НЕ предлагай клип, где в кадре есть посторонняя вебка/лицо в углу, если её
нельзя убрать кропом. Окно записи в композите — 1500×844, в рамке уже есть голова автора, второе
лицо в кадре не годится. Если у кандидата вебка есть, но занимает угол в скринкасте 1920×1080 —
годится, кроп crop=1500:844 её уберёт (правые 196px всё равно перекрыты головой). Если вебка
занимает половину кадра или это слайд с заголовком — отметь кандидата отдельно, для него нужен
другой кроп, не crop=1500:844.
Собери HyperFrames-композицию с инфографической карточкой размером ровно 1500×844 px (под окно
записи экрана в финальном видео 1920×1080, окно стоит в позиции 48,90).
Цифра/тезис: [вставь].
Стиль: фон #0a0a0a, шрифт Manrope, акцент-цвет #ff5a30, крупная цифра + подпись капсом.
Важно: содержимое прижимай к левому краю, не центрируй — правые 196px карточки в финальном
композите перекрыты головой в рамке, отцентрированный текст будет визуально смещён.
Рендер: npx hyperframes@0.7.109 render (нужен Node ≥ 22, системный v20 не подходит). Результат
положи как renders/video.mp4.
У тебя есть список сегментов (после резки тишины и вырезания подтверждённых фальстартов) и, где
нужно, подменённые вставки для окна экрана. Собери финальное видео:
1. Рендери каждый сегмент отдельным mp4 через filter_complex (вход 0 — чёрный фон lavfi 1920×1080,
1 — запись экрана или вставка, 2 — видео с телефона, 3 — PNG-рамка):
[1:v]scale=1500:844,fps=30,setpts=PTS-STARTPTS[scr];
[2:v]crop=1762:3340:199:500,scale=544:1032,fps=30,setpts=PTS-STARTPTS[head];
[0:v][scr]overlay=48:90[tmp1];
[tmp1][head]overlay=1352:24[tmp2];
[tmp2][3:v]overlay=0:0[vout]
Звук бери с телефона (-map 2:a, микрофон чище записи экрана). На каждом сегменте ставь
audio-фейды: afade вход 0.03с, выход 0.08с — без них на склейках слышны щелчки.
2. Склей все сегменты ffmpeg -f concat.
3. Экспортируй: H.264, CRF 26, preset slow, -movflags +faststart, добавь постер-кадр. Если дальше
дочищать в DaVinci Resolve руками — вместо mp4 собери FCPXML.
Важно: если нужна точная перемотка внутри длинного исходника (не с начала файла) — ставь -ss ПОСЛЕ
-i, а не перед: -ss перед -i прыгает на ближайший ключевой кадр и промахивается на секунды. Кроп
делай только с чётными сторонами — x264 не берёт нечётную ширину после масштабирования.
Честно про время
Это не кнопка «сделать красиво». Резка тишины и рендер — быстрые (whisper-server прожёвывает 332 сегмента за 4 минуты), но список фальстартов и подбор вставок всё равно смотрит человек — иначе рискуешь либо оставить повтор в эфире, либо вырезать слово, которое на самом деле не повторялось. На этом ролике из 8 автоматических кандидатов реальным оказался один — семь остальных отбраковали на слух.
Каталог материалов строится один раз и потом обновляется — это разовая инвестиция часов, не пятиминутный скрипт. И если мычания «э/эм/нуу» из речи не чистить отдельным проходом — их придётся вычищать руками в Resolve, автоматика тишины и повторов их не трогает.
Путь с кириллицей в названиях папок DaVinci Resolve импортирует нестабильно — если собираешь FCPXML для Resolve, держи исходники на ASCII-путях рядом с проектом.
Забрать скилл и промпты
Всё, что выше, лежит открыто на GitHub одним скиллом: скрипты, справочники с граблями и шаблон конфига. Ставится одной командой, работает локально, стоит 0 ₽.
Хочешь такие разборы по мере выхода
Следи за новыми гайдами через бота — там же остальные материалы: SEO-машина под ключ, второй мозг, контент-пайплайн. Или загляни в Цех — там разбираем такие связки вживую.
Читать дальше
Все гайды рабочие: каждый — то, что реально крутится у меня, а не пересказ документации.