Свой нодовый холст для видео: собираю ролик целиком на одном графе
Всё, что вы увидели в ролике выше, собрала система, которую я написал сам. Сценарий, персонажи, сцены, склейка, звук — узел за узлом, на одном холсте. Это ещё эксперимент, но результат уже такой, что мне захотелось про него рассказать.
Первые три части серии я разбирал пайплайн по кускам: как выбирал LLM для сценариста, какую видеомодель ставить, зачем между сценарием и видео появилась раскадровка. Здесь показываю весь холст целиком — и первый ролик, который он собрал.
Почему я вообще полез это делать
Сначала я честно пробовал готовое. Взял пару популярных платформ, залил денег, начал собирать ролик — и слил примерно $200, чтобы с трудом выдавить один клип. Не потому что модели плохие. Модели-то как раз хорошие. Проблема в другом: между ними нет связности.
Ты генерируешь картинки в одном месте. Персонажей описываешь в другом и сам держишь в голове, кто как выглядит и как они друг с другом связаны. Реплики — третий инструмент. Сборка — четвёртый. И всё это никак не собрать в одной точке: каждый шаг живёт сам по себе, а ты руками носишь данные между вкладками. Для одного ролика ещё терпимо. Для системы, которая должна делать их пачками, — тупик.
Я архитектор и всю жизнь работаю с графами: сервисы, зависимости, потоки данных. И в какой-то момент до меня дошло, что видео-пайплайн — это ровно такой же граф. Кадр зависит от персонажа, сцена — от кадра, финал — от всех сцен разом. Не хватало только инструмента, где этот граф можно собрать целиком и гонять по нему данные, а не пересобирать в голове каждый раз.
Поэтому я перестал искать готовое и сел писать своё.
Идея: весь ролик — это граф нод
Систему я назвал AVG Node Canvas. Под капотом — litegraph (та же графовая библиотека, на которой стоит ComfyUI) плюс мой слой нод и бэкенд, который ходит в модели. Каждая нода делает один шаг: пишет сценарий, рисует кадр, оживляет его в видео, склеивает. Я соединяю их проводами — и данные текут по графу от имени персонажа до готового ролика.

Главное отличие от ComfyUI или n8n — я не собираю универсальный комбайн. Холст заточен под одну задачу: короткий ролик с диалогами и сквозными персонажами. Поэтому и ноды тут не абстрактные «загрузи-обработай-сохрани», а предметные: «Сценарист», «Душа», «Картинка», «Видео», «Сборка».
Одну инженерную деталь всё же назову, потому что без неё холст был бы игрушкой: порты типизированы. У меня с десяток типов — текст, кадр, видео, звук, голос, «душа», сцена, сценарий, элемент. Провод соединяется только между совместимыми: выход «сцена» не воткнёшь во вход «звук». Звучит скучно, но именно это не даёт графу превратиться в кашу, когда нод становится тридцать.
Сценарист: даю имя — получаю сцены
Первый узел — «Сценарист». Я даю ему тему или просто имя героя, а он сам пишет сценарий и раскидывает его по сценам: сколько нужно, столько и нарежет. На каждую сцену — свой промпт для картинки, движение для видео, реплики, длительность.
Под капотом тут Claude — я выбирал его слепым тестом в первой части серии. Он же собирает диалоги: даёшь ему блоки персонажей — вот огурчик, вот шериф — и он возвращает готовые сцены с репликами, где каждый говорит своё. Мне не нужно расписывать раскадровку руками; я задаю рамку, а текст и логика — на модели.
Персонажи — это «Души»
Персонажей я готовлю заранее и храню как отдельную сущность — «душу». Душа — это имя, портрет, набор ракурсов и параметры характера. Один раз собрал — и переиспользуешь в любом ролике как референс.

Шериф Картофель, огурчик, девочка-морковка, чили-вулкан — это всё заготовки из прошлых экспериментов. Я подключаю нужную душу к сценаристу и к нодам картинок, и дальше она тянется по всему графу: один и тот же герой в каждой сцене, а не четыре разных картофеля.
Баг, который многому меня научил: шляпа из капусты
А вот тут я поймал очень показательную ошибку. Сценарист пишет сцену, но не видит, как выглядит персонаж. Он знает имя — «шериф-картошка» — и сочиняет промпт, который сам себе не противоречит. По его логике всё складно. А на выходе система рисует картошке шляпу. Из капусты.
Формально всё правильно: шляпа есть, персонаж есть. Просто это не тот персонаж, которого я задумал. И баг красиво показал, чего не хватает: модель, которая пишет промпты, ничего не знает про внешность героев.
Починка оказалась простой. Я завёл у каждого персонажа отдельное описание — до полутора тысяч токенов про внешность и повадки — и стал собирать из подключённых героев короткую справку «Персонажи ролика: …», которая уходит в контекст сценаристу перед темой. Теперь модель, сочиняя сцену, уже держит в голове, что шериф — это картофелина в ковбойской шляпе, а не в капустной. Шериф Картофель стал ровно таким, каким должен быть.
И вывод мне нравится больше самого фикса: почти всегда, когда ИИ выдаёт бред, он выдаёт его логично — просто не из тех данных. Не хватало не ума модели, а контекста.
Главный трюк: один кадр — и готова сцена
Дольше всего я бился с началом видео. Генерируешь сцену — а она стартует не с нужного момента, а откуда-то из середины. В одном раннем эксперименте котик должен был войти в дверь и разбудить хозяев, а модель выдавала кота, который уже стоит и уже будит. Завязки нет.
Я собрал стенд из нод и прогнал кучу экспериментов с разными параметрами, пока не нашёл рабочую схему. Она вот такая. Сначала я генерирую стартовую картинку — и уже на ней расставляю референсы персонажа: кто в кадре, в какой позе, что вокруг. А в саму видео-ноду персонажа отдельно не передаю — только этот первый кадр.
И тут срабатывает главное: картинка сама несёт в себе и героя, и мизансцену. Видео-модель берёт её как первый кадр и просто продолжает — не выдумывает завязку заново, а дорисовывает движение от того, что уже есть. Один кадр — и готовая сцена.
В демо на видео-нодах стоит Gemini Omni Flash, он делает восьмисекундный клип «от первого кадра». Но модель тут сменная: холст умеет и Kling, и Seedance, и Grok Imagine — какая лучше зайдёт под сцену, ту и подключаю.
Единая вселенная: сцены цепляются друг за друга
Дальше важно, чтобы сцены не жили порознь, а складывались в один мир. Делаю это руками — и мне это как раз нравится, потому что холст даёт контроль.
Перед третьей сценой я беру последний кадр второй и передаю его как референс — фактически как первый кадр следующего клипа. Добавляю в него огурчика, чуть меняю ракурс, и модель аккуратно сшивает: одна сцена плавно перекатывается в другую.
А иногда я специально не сохраняю базовый контекст. И получается неожиданный переход, который выглядит так, будто его и задумывали. Стиль у ролика намеренно абсурдный, поэтому такие склейки только в плюс.
Финальная сборка
В конце собираю всё в историю. В финальную сцену я передаю героев — шерифа и огурчика — и нужный первый кадр, чтобы сохранить преемственность. Хочу вокруг антураж: магазинчик, морковку, толпу — подкидываю референсы всех персонажей сразу.

Склейкой занимается нода «Сборка»: гоняет ffmpeg, стыкует клипы встык или через короткий кроссфейд и приглушает музыку под речь — громкость падает до 20%, когда кто-то говорит. Дальше «Экспорт 9:16» — и ролик готов к скачиванию.
Ещё одна мелочь, ради которой стоило городить свой холст: смета считается прямо на графе. Каждая нода показывает примерную цену — картинка около восьми центов, видео-нода дороже, весь граф в этом проекте вышел примерно в пять долларов. И тут же кэш: если входы у ноды не поменялись, перепрогон стоит ноль. Не переплачиваешь за то, что уже посчитано.
Что дальше
Повторю то, с чего начал: это пока эксперимент. Есть куда расти — и по качеству склеек, и по автоматизации ручных шагов. Но даже сейчас связный ролик от имени персонажа до готового файла собирается на одном холсте, а не в пяти вкладках за $200.
И у меня к вам вопрос по делу. Мне интересно, зашло бы такое как продукт — чтобы вы могли собирать ролики на таком же холсте сами. Если наберётся интерес, открою доступ. Напишите, стоит ли.