Генерация карт Таро при помощи OpenAI модели GPT-Image-1

от автора

Я решил сделать уникальную колоду карт Таро. Заказывать их у фриланс-художников дорого: каждая карта стоит от 5 USD, так что для полной колоды из 78 карт это выходит 390 USD. Перебрав разные генераторы изображений, я остановился на модели GPT-Image-1 от OpenAI, поскольку она выдаёт максимальное качество и минимальный процент ошибок. В среднем генерация одной карты занимает около минуты. Создание одной колоды обошлось мне в 25 USD. В итоге я сгенерировал три колоды с уникальными стилями и потратил на это в общей сложности 75 USD.

Результат можно посмотреть здесь: https://evgenyigumnov.github.io/ai-tarot

Опишу процесс создания Python скрипта для генерации карт Таро. Сначала я описал все карты таро вот в таком массиве:

CARDS = [   {     "number": 0,     "name": "The Fool",     "description": "A youth with a knapsack on a staff stepping at the edge of a cliff, with a small dog beside him",     "meaning": "The beginning of a journey, spontaneity, freedom"   },   {     "number": 1,     "name": "The Magician",     "description": "A figure stands behind a table with symbols of the four elements, staff raised upwards",     "meaning": "Willpower, skill, manifestation of power"   },   {     "number": 2,     "name": "The High Priestess",     "description": "A woman sits between two pillars with a book on her lap, a crescent at her feet",     "meaning": "Intuition, hidden knowledge, sacred wisdom"   },   ... ]

Далее написал функцию, которая вызывает OpenAI API для генерации изображения и сохраняет картинку на диск:

def generate_and_save(prompt: str, filepath: str):   if os.path.exists(filepath):     print(f"File already exists: {filepath}")     return   img = client.images.generate(     model=model,     prompt=prompt,     n=1,     size="1024x1536",     quality=quality   )   image_bytes = base64.b64decode(img.data[0].b64_json)   with open(filepath, "wb") as f:     f.write(image_bytes)     print(f"Created: {filepath}")

Для генерации картинки я использовал prompt в виде строки который передавал в OpenAI API, где style — описание стиля карты:

    "number": {card["number"]},     "name": "{card["name"]}",     "description": "{card["description"]}",     "meaning": "{card["meaning"]}"      Background: Light     Write the card name: bottom center.     Write the card number: top center only for major arcana      Draw this tarot card in style: {style}  

Вот примеры style:

  • Anime realistic style

  • Anime futuristic style

  • Digital painting in modern realistic style, modernity 2025, white skin, luxury, professional makeup. Natural lighting, with soft painterly textures, office places

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

i = 0 for card in CARDS:     filepath = os.path.join(output_dir, f"{i}.png")      if os.path.exists(filepath):         print(f"File already exists: {filepath}")         i += 1         continue      number = f"""     "number": {card["number"]},     """     number_desc = "Write the card number: top center only for major arcana"     if i>21:         number = ""         number_desc = ""     prompt = f"""     {number}     "name": "{card["name"]}",     "description": "{card["description"]}",     "meaning": "{card["meaning"]}"      Background: Light     Write the card name: bottom center.     {number_desc}      Draw this tarot card in style: {style}        """      print(prompt)     generate_and_save(prompt, filepath)     i += 1

Итоговый скрипт, которым можно генерировать карты, выложен в репозитории: https://github.com/evgenyigumnov/ai-tarot

Если кто-то захочет добавить свои карты в репозитории, то можно сделать pull request: https://github.com/evgenyigumnov/ai-tarot/pulls

Ваша колода будет опубликована на сайте https://evgenyigumnov.github.io/ai-tarot

PS

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

Вот для примера шаблон пустой для карты:

Вот сгенерированных 2 карты:

Почти в стиль попал 🙂


ссылка на оригинал статьи https://habr.com/ru/articles/913142/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *