Как стать автором
Обновить

Новый вид контента: ИИллюстрированная аудиокнига

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров1.3K

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

из Артур Кларк «Часовой»
из Артур Кларк «Часовой»

Вот пример результата: Артур Кларк «Часовой»

И ещё три примера:

Создание иллюстрированной книги при помощи Ai-llustrator

Процесс состоит из 7 этапов:

0. Подготовка проекта

Для начала работы нужно создать папку проекта. Положите в неё аудиофайл с названием audio.mp3. Укажите путь к папке в файле project.ts. Пример структуры папки проекта: ai-llustrator/book/chasovoi.

1. Транскрибация аудио

Исходными данными для видео является аудиофайл с аудиокнигой. Пока я ограничился короткими рассказами, так как в полностью автоматическом режиме пайплайн работает, скажем так, не идеально. На сегодняшний день у меня реализовано два рассказа по 20 минут («Девять миллиардов имён Бога» и «Часовой») и один рассказ на 30 минут («И грянул гром»).
Чтобы видеоряд был синхронизирован с аудиоповествованием, необходима транскрибация с таймкодами. Сначала я попробовал использовать OpenAI Whisper, так как у неё есть функция таймкодов, но она показала себя недостаточно хорошо: некоторые абзацы терялись. Затем я попробовал OpenAI Audio Preview — она лучше транскрибирует, но не поддерживает таймкоды. В итоге я использовал 11ElevenLabs — она работает очень хорошо, предоставляет все необходимые данные и надёжна.

npm run 1_transcribe

Принимает: audio.mp3
Создаёт: transcr.json, содержащий объект, возвращаемый API 11ElevenLabs.

2. Разбиение на сцены

В результате работы 11ElevenLabs мы получаем каждое слово с таймкодами. Я сначала объединяю слова в предложения (пунктуация присутствует и точна), а затем несколько предложений — в сцены. Я выбрал частоту смены кадров 4 кадра в минуту, то есть каждое изображение показывается в среднем 15 секунд. Алгоритм такой: предложения объединяются в сцены по следующим правилам:

  • в сцене должно быть минимум одно предложение;

  • сцена должна длиться не менее 5 секунд;

  • и не более 18 секунд, если это не противоречит правилам выше. 18 секунд — эмпирически подобранное значение, чтобы средняя продолжительность сцены была около 15 секунд.

npm run 2_transcr2scenes

Принимает: transcr.json
Создаёт: scenes.json с текстом, разбитым на сцены, и необходимыми таймстампами.
После работы этого скрипта нужно переименовать scenes.json в scenes_.json, чтобы случайно не потерять ручные правки (зачем — см. далее).

3. Извлечение общей информации из текста книги

Чтобы генерировались корректные промпты для создания изображений, модели нужна общая информация о книге. Я помещаю весь рассказ в контекст модели (gpt-4.1) и прошу вернуть (через structured output):

  • Саммари рассказа

  • Список локаций с описаниями

  • Список главных героев с наиболее подходящим актёром-прототипом и описанием его одежды в разных локациях

  • Краткое описание наиболее подходящего художественного стиля для иллюстраций Такая информация позволяет генерировать промпты, которые, в свою очередь, создают изображения с относительно консистентными локациями и героями. Использование известных актёров позволяет делать героев узнаваемыми и похожими на себя в разных сценах. Пример — в: ai-llustrator/book/chasovoi.

npm run 3_data_extract

Принимает: transcr.json
Создаёт: _summary.txt, _locations.txt, _cast.txt, _style.txt.
Далее к имени каждого файла нужно добавить подчёркивание (_summary_.txt и т.д.) и редактировать уже их (зачем — см. далее).

4. Генерация промптов для картинок

Мои опыты показали, что генерация изображений по промптам — самое слабое звено этого пайплайна. Поэтому особенно важно создавать максимально качественные промпты: короткие и однозначные. Для генерации промптов я использую модель gpt-4.1.

Системный промпт:

Твоя задача — создавать промпты для генерации иллюстраций к следующему рассказу.

Краткое содержание:
${summary}

Локации:
${locations}

Действующие лица:
${cast}

Напиши один промпт на русском языке для иллюстрации сцены <current_scene/>. Используй содержание <future_scenes/> для прогнозирования будущих сцен.

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

Не давай объяснений и не добавляй лишний текст.

Юзер промпт:

Напиши промпт для иллюстрации сцены <current_scene/>:

<current_scene>
${currentScene}
</current_scene>

<future_scenes>
${futureScenes}
</future_scenes>

Модель получает системный промпт с кратким пересказом книги, описанием локаций и главных героев. В юзер-промпте я передаю текущую сцену и 4 будущие сцены, чтобы модель «видела будущее». Чтобы модель помнила прошлое, я добавляю в историю генерации 6 предыдущих промптов. То есть на каждом этапе она знает как общее содержание книги, так и точное повествование за полторы минуты назад и минуту вперёд.
В системном промпте я также прошу выбирать план и ракурс сцены — это делает визуальное повествование более разнообразным.

Пример результата:

Крупный план Вильсона (Джереми Айронс, 50 лет, короткая стрижка, светло-серый свитер, тёмно-синие штаны) внутри главной каюты вездехода: он стоит у мини-плиты, держит лопатку над сковородой, в которой жарятся сосиски; его взгляд задумчиво обращён в сторону иллюминатора. Через широкий иллюминатор видно: вдали раскинулись мощные серо-белые горные хребты, закрывающие южную часть горизонта, небо тёмное, усеяно звёздами, скалистый берег исчезает по краям кадра. Атмосфера воспоминаний и уюта в тесном жилом пространстве среди величественной лунной природы.

npm run 4_prompts_generator

Создаёт: файлы prompts/scene_*.txt

5. Генерация изображений

Чтобы все изображения были выполнены в едином стиле, к промпту, полученному на предыдущем этапе, добавляется строка со стилем:
Стиль: Гиперреализм, акварель плюс цифровая доработка, акценты на отражениях света.
Результирующий промпт используется для генерации изображений.
Для генерации изображений я использовал модель gpt-image-1. Для её использования понадобилось пройти валидацию OpenAI-аккаунта (с фото паспорта, российский паспорт подходит). Однако можно использовать и любые другие модели.
gpt-image-1 генерирует изображения в трёх уровнях качества: low, medium, high
и трёх форм-факторах: 1024×1024, 1536×1024, 1024×1536.
Цены (на 3 июня 2025 года):

Низкое качество даёт очень приблизительное изображение — например, актёра не узнать. Я остановился на среднем качестве: все книги, которые я сделал, были срендерены именно так. Высокое качество даёт более высокую детализацию, но стоит в 4 раза дороже и требует вдвое больше времени. Я и так потратил на эксперименты в среднем качестве около 150 долларов, так что в высоком это было бы примерно 600… Один 20-минутный рассказ с экспериментами и переделками обходился мне примерно в 20 долларов.

npm run 5_images_generator

Создаёт: картинки image/scene_*.png

Для ускорения процесс организован так, что картинки создаются параллельно, по 10 штук одновременно.
Периодически может возникнуть ошибка, что промпт нарушает term and conditions. В таком случае достаточно просто перезапустить генерацию — с большой вероятностью картинка будет сгенерирована успешно. Лишь однажды мне пришлось изменить промпт, чтобы обойти ошибку: это была сцена про убийство динозавра в «И грянул гром» Рэя Брэдбери — уж слишком кровавый промпт создала модель на предыдущем этапе.

6. Генерация видео

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

npm run 6_video_generator

Кэш: video/scene_*.mp4, video.json
Создаёт: output.mp4

Как улучшить результат

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

1. Правка автоматически сгенерированных файлов локаций, героев, стиля

Самый эффективный способ управления результатом — несколько раз прослушать или прочитать книгу и чётко выбрать и описать все основные локации (_locations_.txt) и главных героев (_cast_.txt). Удалите всё ненужное и упростите всё необходимое. См. пример в проекте в этом репозитории: ai-llustrator/book/chasovoi:

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

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

Внутри вездехода (главная каюта/камбуз)
Уютная, но тесная кабина с приборными панелями, спальными местами и мини-кухней в углу. Через иллюминаторы виден освещённый солнцем лунный пейзаж с горами, на фоне тёмного неба, усыпанного звёздами. Внутри — тёплый свет ламп.

Смотровая башня на вездеходе
Кабина с полусферической прозрачной крышей и телескопом направленным чуть вверх. Открывается панорамный вид на лунный пейзаж. Внутри приборы и панели, приглушённый свет.

Вершина с пирамидой (издалека)
Одна из вершин в горной гряде на горизонте выделяется ровной, плоской площадкой. На самом плато различим небольшой сверкающий объект — пирамиду, заметно отличающуюся от окружающего ландшафта. Вершина окружена крутыми склонами, а сама пирамида видна как яркое пятно на фоне серо-белых скал.

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

Космический корабль инопланетян
футуристический инопланетный космический аппарат продолговатой формы, оставляющий за собой след голубого свечения
_cast_.txt:
Вильсон (геолог, рассказчик) — похож на Джереми Айронса, 50 лет, короткая стрижка.
  Внутри вездехода: светло-серый свитер, тёмно-синие штаны.
  На поверхности луны: серо-серебристый скафандр c нашивкой руководителя на рукаве, закрытый шлем с прозрачным визором.

Гарриет (член экипажа) — мужчина похожий на Сэма Роквелла, 40 лет, подтянутое телосложение.
  Внутри вездехода: бежево-серый комбинезон с синими вставками.
  На поверхности луны: серо-серебристый скафандр, закрытый шлем с прозрачным визором.

Льюис (член экипажа, специалист по связи) — похож на Джона Кьюсака, 35 лет.
  Внутри вездехода: тёмно-синяя футболка, светло-серые свободные штаны, очки для чтения.
  На поверхности луны: серо-серебристый скафандр, закрытый шлем с прозрачным визором.

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

2. Перегенерация изображения без изменения промпта

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

Здесь, конечно, промпт слишком динамичный, чтобы получить действительно хороший результат.

3. Правка промпта

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

измени этот промпт:  
Крупный динамичный план: Вильсон (Джереми Айронс, 50 лет, серо-серебристый скафандр с нашивкой руководителя, закрытый шлем). 
...  
пусть в кадре только один герой - Вильсон и он не кидает крюк а только замахивается

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

Теперь осталось только привязать верёвку к крюку — и всё будет отлично.

4. Правка сцены

Можно также добавить информацию прямо в текст отдельной сцены в файле scenes_.json. Например:
[Внутри вездехода у иллюминатора] "Это хорошая причина как раз для того, чтобы туда отправиться", ответил я с достоинством. В тот вечер мы остановили вездеход в полумиле от выступа и рано легли спать. Гарриет собирался утром идти со мной.
Я добавляю дополнительное описание в квадратных скобках перед сценой — это хорошо работает. После правки нужно удалить соответствующий промпт и иллюстрацию, а затем перегенерировать их по порядку.

Резюме

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

Что дальше

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

Обо мне

Больше двух лет пишу проекты про интеграцию LLM в приложения: агентский RAG, мультиагентский DeepResearch, голосовое управление приложениями и т.д. Оказываю консультации по интеграции LLM.
Недавно начал вести телеграм-канал о сильных и слабых сторонах LLM: LLM => AGI?

Теги:
Хабы:
+6
Комментарии27

Публикации

Ближайшие события