Я решил сделать уникальную колоду карт Таро. Заказывать их у фриланс-художников дорого: каждая карта стоит от 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/
Добавить комментарий