Из разработки Romergo

От бесконечных правок к съёмочной площадке: как я учусь генерировать истории

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

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

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

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

Исправить картинку — ещё не значит сохранить её

Большая боль для меня — накопление изменений. Есть изображение А. Из него делаем Б, из Б — В, дальше ещё несколько попыток. Каждая новая версия наследует не только нужную правку, но и всё, что незаметно изменилось раньше.

В моих генерациях это проявлялось по-разному: лица «текли», тени становились тяжелее, на поверхностях появлялись артефакты, терялись мелкие детали. Не каждый следующий кадр обязательно хуже предыдущего. Но длинная цепочка правок давала слишком много возможностей уйти от исходного образа.

Человеку кажется очевидным: «оставь всё как есть, только поверни голову». Мы узнаём персонажа, понимаем устройство комнаты и предполагаем, что куртка остаётся на нём, даже если о ней больше никто не написал. С генератором об этом приходится договариваться отдельно. Он может выдать убедительную новую картинку и при этом нарушить то, что для нас было само собой разумеющимся.

Так что да, значительная часть работы — научиться договариваться с ИИ. Иногда буквально объяснять ему, что третья нога нам всё ещё не нужна.

GENERAL: точка, к которой можно вернуться

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

Дальше я стараюсь не строить бесконечную цепочку «последняя правка → следующая правка». Новое состояние создаётся от GENERAL с учётом того, что должно происходить сейчас.

При исправлении сцены у задания могут быть три опоры:

Предыдущая версия остаётся дополнительным референсом. Она не должна незаметно становиться новым эталоном вместе со всеми накопленными ошибками.

![Схема GENERAL: вместо последовательного наследования каждой версии новые состояния возвращаются к одному одобренному опорному изображению. Предыдущий кадр остаётся дополнительным референсом.](../assets/ai-film-crew-general.webp)

*Это схема подхода, а не сравнение реальных генераций. GENERAL даёт постоянную точку отсчёта, но не гарантирует сохранение каждого пикселя.*

Здесь нет магического способа запретить генератору ошибаться. Зато появляется понятный ответ на вопрос «к чему мы возвращаемся, если всё поплыло?». И сама цель исправления меняется: получить нужную сцену с тем же персонажем, а не просто отредактировать последнюю неудачную версию.

Render Eye: что существует в мире и что видно в кадре

Следующая проблема оказалась тоньше. Допустим, у нас хорошо описан персонаж: куртка, перчатки, ремень, ботинки. Но сейчас он показан по пояс, одна рука за спиной, а часть тела закрывает дверь.

Какие из этих деталей нужно рисовать? Какие должны быть скрыты? И как отличить скрытую перчатку от перчатки, которую генератор просто забыл?

Для этого я развиваю Render Eye. У него две задачи: подготовить требования перед генерацией и проверить полученное изображение после неё.

Сначала он обращается к библии истории — сохранённым описаниям персонажей, локаций, предметов и их состояний. Затем сопоставляет их с постановкой: положением камеры, действием и тем, на что должен обратить внимание игрок.

Каждая важная деталь получает решение: видна целиком, видна частично, перекрыта другим объектом или находится за пределами кадра. Если рука спрятана за спиной, перчатка не исчезает из мира. Её просто нельзя рассмотреть с этой точки.

![Render Eye до и после генерации: описания мира и постановка задают требования к видимому и скрытому; готовое изображение проверяется по этим же требованиям.](../assets/ai-film-crew-render-eye.webp)

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

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

Но и здесь важно не приписывать системе сверхспособности. Изображение рассматривает ИИ, который тоже способен что-то пропустить. Обязательная проверка делает процесс дисциплинированнее; она не превращает зрительную модель в безошибочного наблюдателя.

Режиссёр: зачем нам именно такой кадр

Можно правильно нарисовать одежду, сохранить лицо, расставить всех персонажей — и всё равно получить пресную сцену.

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

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

Представим условную фразу: «За дверью послышались шаги».

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

Тот же коридор в детективе может направлять внимание к улике, а в романтической сцене — к ожиданию встречи. Разница складывается из конкретных решений. Одна надпись «настроение: хоррор» в задании этого не обеспечивает.

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

Для игры есть ещё одна особенность: игрок читает в своём темпе. Пауза перед репликой и ожидание, пока человек её дочитает, — разные вещи. Нельзя рассчитать красивый четырёхсекундный момент и закрыть текст у человека, которому понадобилось шесть секунд.

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

Директор: получилось ли то, что мы задумали

Названия «режиссёр» и «директор» пока звучат почти одинаково, но я разделяю их ответственность. Режиссёр ставит сцену. Директор отвечает за проверку качества результата.

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

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

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

![Распределение ролей: исходный текст направляет режиссёра; Render Eye готовит и проверяет кадры; сцена собирается; Директор проверяет результат в игре и возвращает замечания на нужный этап.](../assets/ai-film-crew-roles.webp)

*На схеме Director — режиссёр, QA — директор по качеству. Схема упрощена: исходник остаётся ориентиром и во время сборки, и при финальной проверке. Стрелка возврата означает правки затронутого этапа, а не обязательный перезапуск всей работы.*

Человек тоже не должен дежурить у генератора

Даже если изображения получаются быстрее, остаётся другая цена — постоянное переключение внимания. Открыл чат, посмотрел кадр, написал замечание, вернулся к своим делам. Через несколько минут всё повторяется.

Поэтому ещё одно направление работы — GENERAL пачками. Независимые опорные изображения можно подготовить заранее и принести человеку одной группой. Он посмотрит их вместе, заметит несогласованность, оставит общие и отдельные замечания.

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

Это не обещание ускорить сам генератор в несколько раз. Мне важнее сократить количество моментов, когда человеку нужно бросать свои дела ради очередной проверки.

Маленькая съёмочная площадка вместо одной большой команды

В итоге я действительно пытаюсь собрать небольшую съёмочную площадку в лице ИИ. У неё есть описанный мир, опорные образы, постановка, производство кадров, сборка и контроль качества.

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

Новые этапы уже оформлены в инструменты и сохраняемые планы. Теперь им предстоит проверка на реальных длинных главах: насколько они помогают сохранять характеры, настроение и внимание автора на протяжении всей истории.

Моя конечная цель — принести большую книгу, выбрать главу и последовательно превратить её в играбельный квест. С возможностью остановиться, посмотреть результат, поправить важное и продолжить с того места, где работа остановилась.

Генерация историй оказалась гораздо сложнее, чем «напиши хороший промпт». Но теперь эта сложность для меня состоит из конкретных задач. Где-то нужен устойчивый референс, где-то — внимательное чтение, где-то — тишина перед репликой. А где-то всё ещё нужен человек, который посмотрит на сцену и скажет: «Нет, вот здесь я тебе не верю».

Назад в dev-блог