Привет, Хабр.
Недавно я писал про edge-навигацию на руль — OLED, 2ГИС, велосипед/мотоцикл. Побочный эффект DIY: накопилось много не особо связаных между собой видосов. Медийку развивать мне хотелось, а времени на монтаж и разбор видео особо не было (на самом деле идея и базовая реализация появились давно, но сейчас это рпигодилось на практике).
Так появился NeuroCut — локальный AI-ассистент для rough cut. Кидаешь видео (или несколько), пишешь brief текстом, получаешь план монтажа и экспорт:
FCP7 XML для Premiere Pro / DaVinci Resolve;
ZIP с готовыми MP4-клипами (удобно для мобильных редакторов);
склеенный render «под ключ»;
субтитры на готовом клипе;
CEP-плагин для Premiere, который кладёт клипы на таймлайн без повторной загрузки медиа.

UI на старте: пять типов задач — от транскрипта и субтитров до NLE XML и turnkey MP4.
Репозиторий: https://github.com/jdmarshall95/neurocut
Разбор пайплайна, граблей и решений, на которых я споткнулся
Я не пытался полностью заменить монтажера. Цель снять с человека первый проход.
Типичный сценарий:
Есть запись интервью / вебинара / обзора / мультикамерный набор клипов.
Есть текстовое задание: «оставь только ответы про продукт, убери воду, добавь маркеры на ключевые мысли».
Нужен rough cut, который можно открыть в Premiere и уже руками довести.
Обьективно автоматический монтаж пока еще слабоват, примерно на уровне готовых шаблонов из кэпкат. Но задачи по типу “вырежи молчаливые паузы” он решает вполне сносно.

Пример: sintel-trailer.mp4 + «Cut a 30 second cinematic teaser…». Режим Turnkey clip.
Как устроен пайплайн
Схема простая по шагам и довольно жёсткая по контрактам данных.

В UI живой progress с теми же стадиями:

Старт: FFmpeg вытаскивает audio.wav.

Дальше STT (Whisper / Silero / GigaAM) с таймкодами.

После scene detection LLM собирает edit plan. На скрине видно модель: gemini-3.1-flash-lite.

Финал для turnkey-режима: склейка MP4 по плану.
Стек:
Backend: Python 3.11, FastAPI;
Frontend: React + Vite;
Медиа: FFmpeg / ffprobe;
STT: Whisper (
faster-whisper), Silero, GigaAM;LLM: Google Gemini (по умолчанию), DeepSeek как fallback;
Экспорт в NLE: Jinja2-шаблон Final Cut Pro 7 XML.
С деплоем я пока не заморачивался, пдготовил просто докер компоузы.
Что получается на выходе

На этом прогоне: 4 клипа, 2 маркера, ~52 с, mode speech
Почему не «просто залить видео в мультимодальную модель»
Первый соблазн был очевидный: скормить proxy в Gemini и попросить «нарежь красиво». На практике это быстро упёрлось в три вещи:
Квоты и деньги. Загрузка видео в модель на каждом джобе сразу уничтожит лимит
Text-out модели. Многие актуальные Flash-модели удобнее и дешевле именно как text-in / text-out.
Поэтому дефолт такой (ADR в репо):
USE_VIDEO_FOR_LLM=false;на каждом джобе всё равно гоняется дешёвый scene proxy (низкий FPS, низкое разрешение);
в LLM уходит: brief + транскрипт с таймкодами + границы планов (+ manifest источников);
Итог: быстрее, дешевле по квотам и заметно честнее по стыкам. «Умный» отбор по резкости/стабильности — отдельный будущий слой эвристик.
Работа с озвучкой
Монтаж от транскрипта ломается на неожиданном месте: когда речи почти нет.
Если исходник без аудиодорожки или с неразборчивой речью, пайплайн не должен падать:
проверяется наличие аудио через ffprobe;
пустой/редкий транскрипт — валидный кейс;
включается visual mode на основе scene timeline.
Для русской речи есть first-class offline-путь через GigaAM (sherpa-onnx + модели в gigaam-ru/). В режиме STT_ENGINE=auto для ru система предпочтёт GigaAM, если модели скачаны. Whisper остаётся универсальным fallback.
Отдельно полезный функционал content-addressable cache транскриптов: ключ от хэша аудио + длительности. Повторная заливка того же файла не гоняет STT заново.
Нюанс: у GigaAM/Silero нет нормальных word-level timestamps. Для karaoke-субтитров интервал сегмента приходится делить пропорционально между словами. Работает, но это компромисс.
Почему FCP7 XML
Я сознательно выбрал Final Cut Pro 7 XML:
его стабильно едят Premiere и Resolve;
его реально шаблонизировать через Jinja2;
Не обошлось без нюансов: абсолютные pathurl ломаются, когда XML уезжает на другую машину. Решение — portable paths вида file://./filename и упаковка медиа рядом с XML.
Для тех, кому XML вообще не нужен, есть ветка экспорта клипов: FFmpeg режет куски по edit_plan.json, кладёт manifest.json и собирает ZIP. В UI это отдельные карточки задач — NLE edit и Mobile clips на первом скрине.
Premiere-плагин без повторного upload
Web-UI удобен для демо и self-host, но монтажёр часто уже сидит в Premiere с медиа на диске. Поэтому начал реализовывать именно плагин, но он сейчас в зачаточной стадии.
Как поднять у себя
Минимум:
git clone https://github.com/jdmarshall95/neurocut.git cd neurocut cp .env.example .env # прописать GEMINI_API_KEY=... docker compose up --build
Для CUDA Whisper:
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up --build
Дальше в UI выбираешь задачу (транскрипт / XML / клипы / render / субтитры), загружаешь видео, пишешь brief, забираешь артефакт — как на скринах выше.
Что уже есть и чего ещё нет
Уже работает как MVP/OSS-ассистент:
полный pipeline rough cut;
multi-file источники на одной шкале времени;
несколько STT-движков;
экспорт XML / clips / render / subtitles;
health, Prometheus metrics, CI, Docker resource limits.
В roadmap осознанно лежат вещи, которых пока нет:
более широкие экспорты (EDL / FCPXML / Resolve markers);
Premiere CEP plugin;
эвристики «стабильный / резкий» кадр;
публичный demo dataset и regression fixtures;
CapCut export
Это early open-source (API около 0.1.0), не SaaS.
Если сделаете issue/PR — буду рад. Особенно полезны:
реальные brief’ы и фейлы таймкодов;
предложения по export-форматам;
опыт с GigaAM vs Whisper;
Вместо заключения
Про «навигационную» ветку — скоро отдельный текст: в первой части я писал, что официального публичного API у 2ГИС нет, но оказалось ручка у приложения все таки есть - нашёлся Dashboard API и HUD перестал жить на парсинге шторки.
Репо ещё раз: https://github.com/jdmarshall95/neurocut
Спасибо, что дочитали. Пишите в комментарии, какие на ваш взгляд функции было бы еще интересно увидеть.

