Open-source ассистент для чернового монтажа видео. fastapi.. fastapi. ffmpeg.. fastapi. ffmpeg. Open source.. fastapi. ffmpeg. Open source. python.. fastapi. ffmpeg. Open source. python. автоматизация.. fastapi. ffmpeg. Open source. python. автоматизация. видеомонтаж.. fastapi. ffmpeg. Open source. python. автоматизация. видеомонтаж. Машинное обучение.. fastapi. ffmpeg. Open source. python. автоматизация. видеомонтаж. Машинное обучение. нейросети.. fastapi. ffmpeg. Open source. python. автоматизация. видеомонтаж. Машинное обучение. нейросети. распознавание речи.

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

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

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

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

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

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

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

Open-source ассистент для чернового монтажа видео - 1
Главный экран 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.

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

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

Open-source ассистент для чернового монтажа видео - 3

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

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

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

Я не прячу «магию» за одной кнопкой Download. После джоба можно раскрыть Edit plan — клипы с таймкодами и коротким rationale, маркеры, транскрипт, который в перспективе можно итеративно дорабатыввать.

Результат: 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

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

Автор: hiraetari

Источник