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