Привет, Хабр.

Недавно я писал про edge-навигацию на руль — OLED, 2ГИС, велосипед/мотоцикл. Побочный эффект DIY: накопилось много не особо связаных между собой видосов. Медийку развивать мне хотелось, а времени на монтаж и разбор видео особо не было (на самом деле идея и базовая реализация появились давно, но сейчас это рпигодилось на практике).

Так появился NeuroCut — локальный AI-ассистент для rough cut. Кидаешь видео (или несколько), пишешь brief текстом, получаешь план монтажа и экспорт:

  • FCP7 XML для Premiere Pro / DaVinci Resolve;

  • ZIP с готовыми MP4-клипами (удобно для мобильных редакторов);

  • склеенный render «под ключ»;

  • субтитры на готовом клипе;

  • CEP-плагин для Premiere, который кладёт клипы на таймлайн без повторной загрузки медиа.

Главный экран NeuroCut: выбор задачи, upload и editing brief

UI на старте: пять типов задач — от транскрипта и субтитров до NLE XML и turnkey MP4.

Репозиторий: https://github.com/jdmarshall95/neurocut

Разбор пайплайна, граблей и решений, на которых я споткнулся

Я не пытался полностью заменить монтажера. Цель снять с человека первый проход.

Типичный сценарий:

  1. Есть запись интервью / вебинара / обзора / мультикамерный набор клипов.

  2. Есть текстовое задание: «оставь только ответы про продукт, убери воду, добавь маркеры на ключевые мысли».

  3. Нужен rough cut, который можно открыть в Premiere и уже руками довести.

Обьективно автоматический монтаж пока еще слабоват, примерно на уровне готовых шаблонов из кэпкат. Но задачи по типу “вырежи молчаливые паузы” он решает вполне сносно.

Загружен клип и текстовый brief для cinematic teaser
Загружен клип и текстовый brief для cinematic teaser

Пример: sintel-trailer.mp4 + «Cut a 30 second cinematic teaser…». Режим Turnkey clip.

Как устроен пайплайн

Схема простая по шагам и довольно жёсткая по контрактам данных.

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

Этап Extracting audio — 10%
Этап Extracting audio — 10%

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

Этап Transcribing — 25%
Этап Transcribing — 25%

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

Этап AI edit — Gemini анализирует текст, 60%
Этап AI edit — Gemini анализирует текст, 60%

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

Этап Rendering turnkey clip — 90%
Этап Rendering turnkey clip — 90%

Финал для 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.

С деплоем я пока не заморачивался, пдготовил просто докер компоузы.

Что получается на выходе

Результат: turnkey clip, статистика джоба и раскрытый Edit plan
Результат: turnkey clip, статистика джоба и раскрытый Edit plan

На этом прогоне: 4 клипа, 2 маркера, ~52 с, mode speech

Почему не «просто залить видео в мультимодальную модель»

Первый соблазн был очевидный: скормить proxy в Gemini и попросить «нарежь красиво». На практике это быстро упёрлось в три вещи:

  1. Квоты и деньги. Загрузка видео в модель на каждом джобе сразу уничтожит лимит

  2. 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

Спасибо, что дочитали. Пишите в комментарии, какие на ваш взгляд функции было бы еще интересно увидеть.