EXP-012 / STATUS: BUILT

AIで大アルカナ22枚を作った— 同じキャラクターを22枚に登場させるのは意外と難しい

22枚作れば終わりだと思っていた。
耳が減る。尻尾が増える。顔まで変わる。そうでもなかった。
00 — INTRO

タロット占いを作った。問題はカードだった

ヨルシルベに「タロット占い|今日の一枚」を追加した。大アルカナ22枚から一枚を引く、シンプルなタロット占い。

機能そのものを作るだけなら、それほど大掛かりではない。問題はカードだった。

せっかくヨルシルベでやるなら、一般的なタロット画像ではなく、「ヨイが大アルカナ22枚すべてに登場するオリジナルのタロットカード」にしたかった。

そこで画像生成AIを使って、0「愚者」からXXI「世界」まで、22枚を一枚ずつ制作することにした。

22枚作れば終わり。
そうでもなかった。
01 — WHY ORIGINAL CARDS

ヨルシルベのカードなら、ヨイに出てほしい

ヨイはヨルシルベのオリジナルキャラクター。黒から深紫の毛、小さな金色の目、額の三日月と星。そして、だいたい眠そうで、あまり興味がなさそうな顔をしている。

もう二つ、大事な特徴がある。耳のような器官は、頭頂部に一本と左右に垂れた二本。尻尾は二本。

耳は3本、尻尾は2本。

この特徴を、テーマも構図も違う22枚すべてで維持する。それが今回の本題になった。

02 — 22 CARDS

大アルカナを、一枚ずつ作る

同じヨイが登場しても、カードごとの意味と景色は必要になる。一度にまとめて完成させたのではない。生成し、確認し、修正し、再生成し、採用する。その繰り返しだった。

  • 0 愚者 / THE FOOL
  • I 魔術師 / THE MAGICIAN
  • II 女教皇 / THE HIGH PRIESTESS
  • III 女帝 / THE EMPRESS
  • IV 皇帝 / THE EMPEROR
  • V 教皇 / THE HIEROPHANT
  • VI 恋人 / THE LOVERS
  • VII 戦車 / THE CHARIOT
  • VIII 力 / STRENGTH
  • IX 隠者 / THE HERMIT
  • X 運命の輪 / WHEEL OF FORTUNE
  • XI 正義 / JUSTICE
  • XII 吊るされた男 / THE HANGED MAN
  • XIII 死神 / DEATH
  • XIV 節制 / TEMPERANCE
  • XV 悪魔 / THE DEVIL
  • XVI 塔 / THE TOWER
  • XVII 星 / THE STAR
  • XVIII 月 / THE MOON
  • XIX 太陽 / THE SUN
  • XX 審判 / JUDGEMENT
  • XXI 世界 / THE WORLD
03 — CONSISTENCY

耳が減る。尻尾が増える

画像生成を続けると、ヨイが少しずつ変わった。頭頂部の一本が消える。垂れた耳の形が変わる。尻尾が二本から三本になる。顔つきが別のキャラクターになる。

後ろ姿では身体構造が崩れ、カードのテーマが明るければ、ヨイまで急に楽しそうになる。放っておくと、普通の猫にも近づいていった。

一枚だけ見れば綺麗でも、並べると別人なら採用できない。制作中は何度も同じ確認に戻った。耳は3本、尻尾は2本。最後の一枚まで、それは変わらなかった。

04 — FIXES

綺麗にできても、ヨイでなければ戻す

愚者 / THE FOOL

身体は後ろ向きで、頭だけこちらを見る構図にしたかった。最初は身体と尻尾の位置関係が不自然だったため、尻尾が正しい位置から出るように調整。身体は後ろ向き、頭だけ30〜45度ほど振り返る形に落ち着いた。

恋人 / THE LOVERS

ヨイの尻尾が三本になった。画像としては綺麗だった。でも、ヨイの尻尾は二本なので修正した。綺麗かどうかと、キャラクターとして正しいかは別だった。

戦車と隠者

戦車は、最初の猫系の動物から白豹と黒豹が戦車を引く構図へ変更。隠者は耳の形を直そうと生成を重ねたものの、最終的には一つ前の画像を採用した。回数を増やせば必ず良くなるわけでもない。

恋人(THE LOVERS)のタロットカード
VI — 恋人 / THE LOVERS
正義(JUSTICE)のタロットカード
XI — 正義 / JUSTICE

正義 / JUSTICE

制作を続けるうちに、ヨイの顔が基準デザインから離れてきた。そこで基準画像を改めて参照させ、顔と頭部を戻した。特徴をテキストで指定し続けるだけでなく、戻る場所になる画像を持っておくことが重要だった。

太陽と世界

太陽では、カードの意味に引っ張られてヨイまで明るく楽しそうになった。だがヨイは、世界が明るかろうが暗かろうが通常運転。「太陽の下でも眠そうなヨイ」へ戻した。

最後の世界でも、壮大な景色につられて顔と頭部が変わり、楽しそうになった。基準画像を参照し、「世界が完成していても、ヨイ本人は別に興味がなさそう」な顔へ戻した。

太陽(THE SUN)のタロットカード
XIX — 太陽 / THE SUN
世界(THE WORLD)のタロットカード
XXI — 世界 / THE WORLD
05 — MASTER & WEB

原本と、Webで配る画像を分ける

完成画像は1024×1536のPNGで保存した。これはWeb配信用ではなく、将来また使うためのマスター。画像生成AIから得た完成画像を、そのまま公開用ファイルにはしなかった。

Web版は768×1152のWebP、品質84。描き直しや構図変更を伴うトリミングはしていない。原本を残しておけば、公開側だけを用途に合わせて作り直せる。

用途形式22枚合計
原本 / MASTER1024×1536 PNG60,022,377 bytes / 約57.2 MiB
Web配信768×1152 WebP / 品質845,701,454 bytes / 約5.44 MiB

Web版は一枚あたり約227〜301 KiB。22枚合計では、原本から約90.5%小さくなった。

06 — LAZY LOADING

22枚あっても、22枚送る必要はない

タロットページを開いた時点で、カード画像のリクエストは0件。ユーザーがカードを引き、結果が決まった後に、選ばれた一枚だけを読み込む。

画像が全部で約5.44 MiBあることと、一回のページ表示で5.44 MiBを転送することは別の話だ。存在する画像容量と、その場で必要な転送量は分けて考えた。

最初は0枚。
引いたあとに、1枚だけ。
07 — UPRIGHT / REVERSED

22画像で、正位置と逆位置の44結果

大アルカナ22枚には、それぞれ正位置と逆位置がある。結果は44通りになるが、画像を44枚作ったわけではない。

管理する画像は22枚。逆位置では同じ画像をCSSで180度回転して表示する。画像を複製せず、正位置と逆位置の見た目を両方作った。

利用者から見える仕様は「1日1枚」「同じ日は同じカード」「翌日になると新しく引ける」。結果を選ぶ内部処理は、ここでは扱わない。

08 — UI

静かなまま、カードをめくる

画面は、カード裏面から始まる。カードを引くと反転し、選ばれた大アルカナと占い結果が現れる。派手にしすぎず、ヨルシルベの静かな雰囲気を壊さない程度の動きにした。動きを減らす設定にも対応している。

画像には幅768、高さ1152を明示し、2:3の領域を先に確保。object-fit: containで絵を切り抜かずに表示する。保存済みカードの復元も初回描画前に行い、再訪時のレイアウトシフトを抑えた。

PC 1440px、スマートフォン390pxと320pxで確認し、横スクロールなし、CLSは0。カードのaltには名称と正位置/逆位置を含め、たとえば「愚者(THE FOOL)逆位置のタロットカード」と読めるようにした。

09 — WHAT I LEARNED

基準へ、何度でも戻る

生成AIで同じキャラクターを大量の画像に登場させるとき、一枚ずつ綺麗に作るだけでは足りなかった。

綺麗でも耳が違う。構図が良くても尻尾が増える。カードらしくても、ヨイらしくない。だから基準となるデザインを持ち、生成のたびにそこへ戻って確認する。

22枚を自動で一気に作ったわけではない。生成、確認、修正、再生成、採用。その手順をカードごとに繰り返した。

最後まで確認する。
耳は3本、尻尾は2本。
10 — WHAT NEXT

作ったので、実際に使われるところを見る

カードは完成し、タロット占いにも組み込んだ。各結果にはメッセージ、注意点、今日の一手、ヨイの一言がある。

次に見るのは、実際にどのくらい使われるか。22枚を作る時間は長かったが、一日に出るのは一枚だけ。その一枚が、誰かの今日を少し考えるきっかけになればいい。

TECH NOTES / VERIFIED
IMAGES
22 paths: HTTP 200 / upright 22 / reversed 22
LOADING
初期画像リクエスト 0 / 結果表示時 1
ACCESSIBILITY
alt確認済み / prefers-reduced-motion対応
LAYOUT
1440px / 390px / 320px、横スクロール 0、CLS 0
QUALITY
ESLint / TypeScript / 自動テスト45件 / production build 成功
世界が完成しても、
ヨイはたぶん興味がない。