Сегодня я попросил агента оживить две обычные фотографии. На первой двое мужчин должны были взлететь из двора в позе супергероев. На второй пара должна была превратиться в Бэтмена и Женщину-кошку. Через несколько минут агент вернул готовые MP4 со звуком.

Весь inference прошёл локально на моей RTX 4090. Агент самостоятельно выбрал video workflow, загрузил исходный кадр, составил подробный prompt, отправил задачу в очередь, дождался завершения и проверил финальный файл через ffprobe.

В этой статье разберу, как устроен пайплайн и что получилось на практике.

Первый эксперимент: совместный взлёт

Исходная фотография снята во дворе: два человека стоят рядом и смотрят в камеру. Задача звучала коротко: «Оба человека улетают как Супермены».

Для модели агент развернул её в подробное описание движения:

Оба человека одновременно отталкиваются от земли, взлетают вверх и принимают классическую супергеройскую позу. Камера плавно поднимается вслед за ними. Лица, одежда, пропорции и окружение сохраняются. Под ногами поднимаются пыль и листья.

Такой prompt фиксирует три важных свойства сцены:

  • оба человека участвуют в действии одновременно;
  • внешность и одежда должны сохраниться;
  • камера получает понятную траекторию движения.

Результат занял около 220 секунд генерации. Получился ролик продолжительностью 5,17 секунды, с частотой 24 кадра в секунду и разрешением 608×800.

Второй эксперимент: превращение в Бэтмена и Женщину-кошку

Во втором тесте исходником стало зеркальное фото пары. Здесь движение сложнее: модель должна удержать двух людей, постепенно заменить одежду, сформировать маски, изменить освещение и сохранить композицию кадра.

В prompt я заложил последовательную трансформацию:

  • броня и плащ собираются поверх костюма мужчины;
  • чёрный кожаный костюм и маска появляются на женщине;
  • лица, возраст, позы и положение людей остаются стабильными;
  • интерьер постепенно получает холодное синее освещение в духе Готэма;
  • финал заканчивается общей уверенной позой перед зеркалом.

Отдельная часть prompt описывала типовые дефекты: лишних людей, дублирование конечностей, слияние тел, замену лиц и искажение рук. Это не гарантирует идеальную анатомию, но заметно сужает пространство для случайных решений модели.

Генерация заняла около 240 секунд с теми же параметрами: 608×800, 20 шагов и 5 секунд целевой продолжительности.

Что работает под капотом

Снаружи весь сценарий выглядит как одна просьба в Telegram. Внутри запрос проходит через несколько компонентов:

Telegram
Hermes Agent
Python wrapper
ComfyUI :8188
MiniMax H3 на RTX 4090

Hermes получает фотографию и определяет, что задаче нужен image-to-video workflow. Wrapper работает напрямую с нативным API ComfyUI:

  1. загружает исходник через POST /upload/image;
  2. подставляет prompt, размеры, duration и seed в API-format workflow;
  3. отправляет workflow через POST /prompt;
  4. опрашивает GET /history/{prompt_id};
  5. скачивает MP4 через GET /view;
  6. проверяет контейнер, кодеки, разрешение и продолжительность.

ComfyUI самостоятельно ведёт очередь выполнения. Одна генерация занимает несколько минут и полностью загружает GPU. Wrapper получает prompt_id, ждёт завершения workflow и забирает файл из output history.

Минимальный вызов wrapper выглядит так:

python3 generate_image_video_job.py \
  --model minimax-h3 \
  --input photo.jpg \
  --prompt "Both people transform into cinematic superheroes..." \
  --width 608 \
  --height 800 \
  --duration 5 \
  --steps 20 \
  --output result.mp4

Wrapper написан на стандартной библиотеке Python: argparse, urllib, json, time и pathlib. Для одной загрузки, трёх HTTP-операций и polling loop отдельный SDK ничего полезного не добавляет.

Контрольный прогон пайплайна

Для контрольного прогона я запустил полный smoke test через установленный skill. Весь путь прошёл напрямую через ComfyUI на порту 8188.

Сначала FLUX Schnell сгенерировал стартовый кадр размером 512×512 за 5,14 секунды: дружелюбный ретро-робот в цветочном поле.

Тестовый кадр FLUX Schnell для последующей генерации видео

Затем этот кадр стал first_frame для MiniMax H3. Робот должен был поднять руку, один раз помахать и опустить её, пока цветы двигаются от ветра, а камера медленно приближается.

Генерация заняла 150,52 секунды. При целевой длине четыре секунды итоговый MP4 получился продолжительностью 4,458 секунды: H.264, 512×512, 24 FPS, стереозвук AAC 32 кГц. Разница связана с внутренним выравниванием последовательности кадров MiniMax H3.

На контрольных кадрах робот сохранил корпус, голову и пропорции, выполнил заметный взмах рукой, а сцена осталась стабильной. В аудиодорожке присутствует реальный сигнал: средний уровень составил −16,1 dB, пиковый — −1,7 dB.

Этот прогон подтвердил рабочую схему wrapper → ComfyUI: нативной очереди и history ComfyUI достаточно для последовательной генерации изображений и видео.

Из чего состоит workflow MiniMax H3

ComfyUI загружает несколько частей модели:

  • diffusion model MiniMax H3 в FP8;
  • мультимодальный text encoder на базе Qwen3-VL 32B в NVFP4/AWQ;
  • отдельный video VAE в FP16;
  • отдельный audio VAE в FP32;
  • sampler res_multistep;
  • узел MiniMaxH3ImageToVideo для prompt, размеров и первого кадра.

Исходная фотография подключается как first_frame. Поэтому композиция стартового кадра сохраняется намного лучше, чем при чистом text-to-video. В этом же workflow декодируются видео и стереозвук, после чего ComfyUI сразу сохраняет результат в MP4 с H.264 и AAC.

MiniMax H3 выравнивает длину последовательности по внутреннему шагу в 17 кадров. Для целевых пяти секунд при 24 FPS workflow формирует 124 кадра. На выходе получается фактическая продолжительность около 5,17 секунды.

Почему я выбрал 608×800

Обе исходные фотографии вертикальные. Я сохранил близкое соотношение сторон и взял размеры, кратные 32. Это уменьшает лишний crop и удерживает обоих людей в кадре.

Разрешение напрямую влияет на время и потребление памяти. Для короткого эксперимента 608×800 даёт разумный баланс:

  • лица остаются различимыми;
  • вертикальная композиция фотографии сохраняется;
  • результат удобно отправлять в Telegram;
  • одна генерация укладывается примерно в четыре минуты на RTX 4090.

Для горизонтального ролика я бы начал с 864×480. Увеличивать разрешение стоит после проверки движения на более дешёвом прогоне.

Что пришлось настроить на GPU-узле

MiniMax H3 оказался требовательным к окружению. Рабочая конфигурация использует современную сборку PyTorch с CUDA 13, режим DynamicVRAM и параметры запуска ComfyUI --fast-disk --disable-pinned-memory.

Старая сборка PyTorch с CUDA 12.6 упиралась в память ещё при загрузке text encoder и diffusion model. После обновления весь workflow стал стабильно помещаться на RTX 4090 и выдавать пятисекундный ролик за несколько минут.

Параллельные video jobs я сознательно не запускаю. Одна задача насыщает GPU, а конкуренция за VRAM добавляет риск выгрузки моделей и падения процесса. Очередь последовательно обрабатывает тяжёлые генерации, сохраняя предсказуемое время выполнения.

Prompt для видео описывает движение

При генерации картинки prompt в основном отвечает за содержимое кадра. В image-to-video исходник уже задаёт сцену, людей и композицию. Текст должен подробно описывать изменение во времени.

Полезная структура prompt выглядит так:

1. Кто и когда начинает двигаться.
2. Как развивается действие.
3. Как движется камера.
4. Что требуется сохранить из исходника.
5. Каким должен быть финальный кадр.
6. Какие артефакты следует исключить.

Для нескольких людей особенно полезны формулировки both people, simultaneously, remain in their original positions и preserve facial identity. Для трансформаций стоит описывать порядок появления деталей от начала до финальной позы.

Ограничения, которые уже видны

Локальная генерация коротких роликов стала достаточно быстрой для интерактивных экспериментов, но результат по-прежнему зависит от сложности сцены.

Основные слабые места:

  • руки и предметы в руках могут менять форму;
  • лица иногда плывут при быстром повороте головы;
  • два человека повышают вероятность слияния деталей;
  • сложное превращение может закончиться лишь визуально похожим костюмом;
  • модель иногда предпочитает эффектный кадр точному выполнению траектории;
  • пяти секунд мало для нескольких последовательных действий.

Поэтому после генерации агент извлекает контрольный кадр ближе к концу ролика и проверяет наличие обоих персонажей, общий смысл действия и критические анатомические дефекты. Финальную оценку всё равно лучше делать просмотром полного видео.

Зачем запускать это локально

Локальный пайплайн даёт несколько практических преимуществ:

  • фотографии остаются внутри домашней инфраструктуры;
  • стоимость эксперимента определяется уже купленным железом и электричеством;
  • ComfyUI доступен всем моим агентам через один набор wrappers и workflow;
  • workflow, модели, seed и параметры находятся под моим контролем;
  • генерацию можно встроить в Telegram, блог и другие автоматизации.

Самая удобная часть этой схемы — пользователь не работает с ComfyUI напрямую. Достаточно отправить фотографию и одной фразой описать сцену. Агент переводит намерение в технический prompt, выбирает модель и параметры, следит за очередью и возвращает проверенный MP4.

Итог

Локальная MiniMax H3 на RTX 4090 уже позволяет превращать обычные фотографии в короткие вертикальные ролики со звуком примерно за четыре минуты. Качество пока требует контроля, особенно в сценах с несколькими людьми, руками и сложной сменой одежды. Для коротких творческих экспериментов текущий результат вполне пригоден.

Пайплайн закрывает полный путь от фотографии в Telegram до готового MP4 прямыми вызовами ComfyUI. Следующий практический шаг — автоматическая проверка нескольких кадров по всей длине ролика, чтобы ловить кратковременные артефакты между началом и финалом.