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

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

Время на прочтение3 мин
Количество просмотров1.9K

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

Результат можно посмотреть здесь.

Опишу процесс создания 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 карты:

Почти в стиль попал :)

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

Публикации

Работа

Data Scientist
50 вакансий

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