0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人開発で「Discord + Web」の AI 画像生成サービスを作って公開するまで(ポイント課金・フォトコン付き)

0
Posted at

はじめに

言葉を書くだけで画像ができる AI 画像生成サービス Kamie(カミエ) を、個人で作って公開してみました!

  • Discord:サーバーで /imagine と打つだけ
  • Web:ブラウザからログインして、そのまま生成

👉 https://blacklagunastudio.com/kamie/

866158939_17994111606106057_5329633538161516943_n.jpg

はじめての人には無料ポイントがあるので、登録して 1 枚つくるまで 1 分かかりません。まずは触ってみてください。

この記事では、企画からデザイン・サーバー・決済・運用までを 1 人で作るときに 「ここは考えてよかった」 と思ったポイントを、設計の考え方を中心に紹介します。

実装の細部まではあえて書いていません。「こういう考え方で作るとラクだった」というエッセンスとして読んでもらえるとうれしいです。


できること

機能 ひとことで言うと
✨ 生成 プロンプトを書いて 1 枚つくる
🎰 おまかせガチャ お題を Kamie が考えて、ランダムに 1 枚
🔁 続ける できた画像を元に「髪を赤く」「夜にして」などと直していく
🧩 共通設定 「銀髪の女騎士、油絵風」のような設定を毎回のプロンプトに自動で付ける
🪄 プロンプト作成 書くことが思いつかない人向けに、選ぶだけでプロンプトができる
🏆 フォトコン 月ごとのお題に投稿して、みんなで投票
💎 ポイント・VIP 毎日のログインボーナス、ポイント購入、月額プラン

特に気に入っているのが 🔁 続ける と 🧩 共通設定 の組み合わせです。
同じキャラで何枚も作りたいとき、毎回長いプロンプトを書かなくても、少しずつ直しながら「自分の 1 枚」に近づけていけます。


全体の構成(ざっくり)

                 ┌──────────── 1 つの Python プロセス ────────────┐
Discord ────────▶│  Discord Bot(スラッシュコマンド・ボタン)       │
                 │        │                                        │
ブラウザ ─▶ Caddy ─▶│  Web API / Web ページ(同じプロセス内)         │──▶ 画像生成 API
  (HTTPS)        │        │                                        │──▶ 決済(Stripe)
                 │     SQLite(ユーザー・ポイント・作品・投票)       │
                 └────────────────────────────────────────────────┘
  • 言語:Python(discord.py + aiohttp)
  • DB:SQLite
  • Web サーバー:Caddy(HTTPS 証明書を自動で取ってくれる)
  • ログイン:Discord / Google
  • 決済:Stripe
  • サーバー:クラウドの小さめのインスタンス 1 台

「え、全部 1 プロセス? DB も SQLite?」と思われるかもしれませんが、個人開発の最初の 1 台としてはこれがちょうどよかった というのが一番伝えたいことです。


考えてよかったポイント 5 つ

1. Bot と Web を「1 つのプロセス」にした

Discord Bot の中で Web サーバーも一緒に動かしています。

よかったこと

  • ポイントの増減・生成処理・決済の反映が 同じコード・同じ DB を通るので、Discord と Web でズレが起きない
  • デプロイ対象が 1 つだけ。再起動も 1 回だけ
  • Discord でログインした人は、Web でも 同じポイント・同じ VIP をそのまま使える

気をつけたこと

  • 画像生成のように時間がかかる処理で、Bot 全体が止まらないようにする(非同期で待つ)
  • 再起動の瞬間は両方止まるので、トップページのような「止まってほしくないもの」は Caddy から静的ファイルとして直接返す

「サービスが小さいうちは、分けるより まとめておくほうが壊れにくい」というのが実感です。

2. ポイントは「財布を 2 つ」に分けた

ポイントを 1 つの数字で持つと、すぐに困ります。

  • 月額プランでもらった分 → 更新日にリセット したい
  • 購入した分・特典でもらった分 → 無期限 にしたい

そこで、ポイントを 「月額分」と「購入・特典分」の 2 つの財布 に分けて持ち、

使うときは、月額分から先に減らす

というルールにしました。こうするとユーザーにとって損がなく、画面にも「月額分 ◯pt / 購入分 ◯pt」と素直に出せます。

課金まわりは後から仕様を変えるのが本当に大変なので、最初に「ポイントの種類」と「減る順番」を決めておく のがおすすめです。

3. 「成功したときだけポイントを減らす」を最初から設計に入れた

画像生成は、外部 API のエラーや「この内容は生成できません」という判定で失敗することがあります。

そこで処理の流れを

  1. 残高が足りるかを確認する
  2. 生成する
  3. 成功したときだけ、ポイントを減らして記録する(ここは 1 回の DB トランザクションでまとめて行う)

という形に固定しました。「払ったのに何も出なかった」が起きないので、問い合わせがほぼ来ません。

決済も同じ考え方で、Stripe から同じ通知が 2 回届いても、ポイントが 2 回付かない ようにしています(通知ごとの ID で「もう処理したか」を記録するだけで防げます)。

4. 「続ける」は “前の画像” と “前のプロンプト” を両方使う

「🔁 続ける」は、ユーザーが書いた指示だけを送ると、顔や画風が変わってしまいがちです。

なので、

  • 元の画像
  • 元のプロンプト
  • 今回の指示(「髪を赤く」など)
  • 共通設定(オンなら)

を組み合わせて、「指示されていないところは、できるだけそのまま保つ」 という前提で生成するようにしました。画像の縦横比も元の画像に合わせます。

AI 機能は「すごい 1 枚」よりも、思った方向に少しずつ近づけられる操作感 のほうが満足度が高い、と感じています。

5. 運用のための「自分用の画面」を早めに作った

公開後に一番時間を取られるのは、実は開発より 「今どうなってる?」を確認する作業 でした。

  • DB の中身をブラウザで見られる 読み取り専用の管理画面(Basic 認証つき)
  • デプロイ後に主要ページが正しく返るかを自動でチェックするスクリプト

このあたりを作ってから、運用のストレスがかなり減りました。
管理画面は 「読み取り専用」にしておく のがポイントで、うっかり本番データを壊す心配がありません。


1 人で作ってみて

  • 最初の構成は小さく、でもお金とポイントのルールだけは最初に固める
  • 失敗したときの体験(返金・お詫び・エラーメッセージ)を先に作る
  • 自分が運用しやすい道具は、ユーザー向けの機能と同じくらい大事

この 3 つが、個人でサービスを公開してみて一番の学びでした。


まずは触ってみてください 🎨

👉 Kamie:https://blacklagunastudio.com/kamie/

  • Web なら、Discord または Google でログインするだけ(メールアドレスやパスワードの入力は不要)
  • はじめての人には 無料ポイント があります
  • 毎日のログインボーナスでも、ポイントがもらえます
  • 作った画像は 商用利用もできます

おすすめの遊び方は、

  1. 🎰 おまかせガチャ で 1 枚つくってみる
  2. 気に入った画像を 🔁 続ける で「夜にして」「笑顔にして」と直してみる

です。「選ぶだけのプロンプト作成」もあるので、何を書けばいいか迷っても大丈夫です。

感想・要望・「こういう作りにしたらもっとよくなるよ」などのコメントも、大歓迎です!

まとめ

仕事後に頑張って作ったので疲れた…

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?