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


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