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?

GitHub Copilot + Spec Kit で落語AIアプリを3日で作った話

0
Posted at

はじめに

「AIで落語の台本を作って音声化するWebアプリ」を個人開発で作りました。GitHub Copilot(Agent Mode)と仕様駆動開発ツール「Spec Kit」を組み合わせ、設計から実装・デプロイまで約3日で完成させた記録です。

途中、本番環境としてAWS OpenShift(ROSA)を選んだものの、コストが想定以上で急遽EC2 + Docker Composeに構成を変更するという判断もありました。

🎭 公開中!実際に触れます 👉 https://app.autostorytellers.net

どんなアプリ?

Storyteller Rakugoは、あらすじを入力するとAIが落語の台本を生成し、さらに音声合成で音声ファイルを作成するWebアプリケーションです。

主な機能

  • あらすじ入力 → AIが落語台本を生成
  • チャットで台本を改善(「もっとオチを強くして」など)
  • 話者プロファイルを選んで音声合成
  • 作成した落語の一覧管理・音声ダウンロード
  • 利用規約・プライバシーポリシーの同意フロー
  • 管理者ダッシュボード(ユーザー管理・アクセスログ)

技術スタック

レイヤー 技術
フロントエンド Next.js 15, React 19, TypeScript, Tailwind CSS
バックエンド FastAPI (Python 3.12), SQLAlchemy 2.0, Alembic
認証 Keycloak 26.2, NextAuth 5.0
データベース PostgreSQL 16
キャッシュ Redis 7
ストレージ MinIO (dev) / AWS S3 (prod)
AI OpenAI API (GPT-4o-mini, TTS)
リバースプロキシ Caddy (自動HTTPS)
メール送信 AWS SES (Keycloak経由)
インフラ AWS EC2 t3.medium, Docker Compose

アーキテクチャ

┌─────────┐     HTTPS      ┌──────────────────────────────────┐
│  User   │ ◄────────────► │          Caddy (TLS終端)          │
│(Browser)│                 │  Let's Encrypt 自動証明書更新     │
└─────────┘                 └──────┬────────┬────────┬─────────┘
                                   │        │        │
                              /app/*   /api/*   /auth/*
                                   │        │        │
                            ┌──────▼──┐ ┌───▼────┐ ┌▼─────────┐
                            │Frontend │ │Backend │ │ Keycloak  │
                            │Next.js  │ │FastAPI │ │  26.2.4   │
                            │  :3000  │ │ :8000  │ │  :8080    │
                            └─────────┘ └───┬────┘ └─────┬─────┘
                                            │            │
                                  ┌─────────┼────────────┤
                                  │         │            │
                            ┌─────▼──┐ ┌────▼───┐ ┌─────▼──────┐
                            │ Redis  │ │Postgres│ │Keycloak DB │
                            │  :6379 │ │ :5432  │ │  (Postgres) │
                            └────────┘ └────────┘ └────────────┘
                                            │
                                    ┌───────▼───────┐
                                    │  MinIO / S3   │
                                    │ (音声ファイル)  │
                                    └───────────────┘

                            Keycloak ──────► AWS SES
                                           (メール送信)

全7コンテナがEC2 t3.medium (4GB RAM) の1台に載り、AWSマネージドサービス(S3・SES)と連携しています。

OpenShiftが高すぎた話

当初の計画: ROSA (Red Hat OpenShift on AWS)

最初はエンタープライズ感のあるOpenShift(ROSA)で本番デプロイする計画でした。理由は:

  • Kubernetes をフルマネージドで運用できる
  • OpenShift Route で簡単にHTTPS公開
  • Operator エコシステム(Keycloakなど)が充実

実際にROSAクラスタを作成し、マニフェストも書いて動くところまで持っていきました。

現実: 月額コスト

ROSAクラスタのコスト内訳(概算):
- コントロールプレーン:      $140/月
- ワーカーノード (m5.xlarge x2): $280/月
- EBS ボリューム:             $30/月
- データ転送:                 $10/月
────────────────────────────────
合計:                       約 $460/月(≒ 約7万円)

趣味プロジェクトに月7万円はさすがに無理。

方針転換: EC2 + Docker Compose

即座に方針を転換し、EC2 t3.medium + Docker Compose という最小構成に切り替えました。

EC2構成のコスト内訳(概算):
- EC2 t3.medium:              $30/月
- EBS 30GB:                    $3/月
- S3 (音声ファイル):            $1/月
- データ転送:                   $2/月
────────────────────────────────
合計:                        約 $36/月(≒ 約5,500円)

コスト約1/13。 OpenShiftのマニフェストはそのまま残しつつ(将来戻す選択肢を維持)、infra/ec2/ ディレクトリに新しい構成を作りました。

Caddy をリバースプロキシに採用し、Let's Encrypt 証明書の自動取得・更新もワンライナーで実現。HTTPS対応のために追加の設定は不要でした。

Spec Kit による仕様駆動開発

このプロジェクトで最も効率化に貢献したのが Spec Kit です。VS Code の GitHub Copilot Agent Mode と連携する仕様駆動開発ツールで、以下のワークフローで開発を進めました。

ワークフロー

/speckit.specify  →  仕様書(spec.md)を生成
        ↓
/speckit.clarify  →  仕様の曖昧な点を質問で洗い出し、specに反映
        ↓
/speckit.plan     →  実装計画(plan.md)を生成
        ↓
/speckit.tasks    →  タスク分解(tasks.md)を生成
        ↓
/speckit.implement →  タスクに従って実装を実行

実際のフィーチャー一覧

# フィーチャー 内容
001 落語作成・管理 コア機能:あらすじ入力→AI台本生成→音声合成
002 DBスキーママイグレーション Alembicによるマイグレーション整備
003 ユーザー管理 Keycloak連携の認証・認可
004 AWS本番デプロイ (ROSA) OpenShiftデプロイ(後にコスト問題で断念)
005 EC2 Docker Composeデプロイ 最小コスト構成への移行
006 管理者ダッシュボード ユーザー一覧・アクセスログ
007 利用規約・登録UX改善 プライバシーポリシー・入力改善

Spec Kit の何がよかったか

1. /speckit.clarify で仕様の穴を埋める

/speckit.specify で生成した仕様書には、曖昧な部分が残ることがあります。/speckit.clarify を実行すると、AIが仕様の不足箇所を最大5つの質問で指摘してくれます。回答すると、その内容が spec.md に自動反映されます。

例えば「音声ファイルの保存期間は?」「管理者がユーザーを削除したとき音声データはどうする?」といった、自分では見落としがちなエッジケースを洗い出してくれるのが便利でした。

2. Constitutionによるブレない設計

プロジェクトの「憲法」を最初に定義します。例えば:

  • あらすじ入力を必ず起点とすること
  • 音声生成前に話者プロファイルを確認すること
  • 全データはリクエストまでトレーサブルであること

各フィーチャーの plan.md には「Constitution Check」が含まれ、設計が原則に違反していないか自動チェックされます。

3. 仕様→計画→タスクの一貫性

spec.md に書いたユーザーストーリーとAcceptanceシナリオが、plan.md の設計判断、tasks.md の実装タスクまで一貫して追跡できます。人間がやると面倒なトレーサビリティを自動化してくれます。

4. /speckit.implement でタスクを順番に実行

tasks.md に定義されたタスクを、依存関係を尊重しながら1つずつ実行していきます。テストファースト、フェーズ分割、完了チェックまで自動です。

Copilot Agent Mode でのデバッグ事例

全自動で完璧に動くわけではなく、デバッグが必要な場面も多くありました。以下は実際に遭遇した問題と対応です。

1. Keycloakログインテーマが反映されない

カスタムテーマを作成して Docker の volumes でマウントしたのに反映されない。

原因: Keycloak はテーマをキャッシュするため、ファイルを更新してもコンテナ再起動が必要だった。また、レルム設定に loginTheme を適用する API 呼び出しが必要だった。

解決: configure-user-profile.sh にテーマ設定の API 呼び出しを追加。

2. Next.js standalone ビルドで Markdown ファイルが読めない

利用規約ページが fs.readFileSync でMarkdownファイルを読んでいるが、Docker コンテナ内で 404 になる。

原因: Next.js の output: 'standalone' ビルドでは process.cwd().next/standalone/ になるが、src/content/ ディレクトリがそこにコピーされていなかった。

解決: Containerfile に src/content/ を standalone ディレクトリにコピーするステップを追加。

RUN if [ -d src/content ]; then \
  mkdir -p .next/standalone/src/content && \
  cp -r src/content/* .next/standalone/src/content/; \
fi

3. Keycloak の OIDC Provider が削除できない

ROSA クラスタ削除後、OIDC Provider の残骸が残り、rosa delete oidc-provider が 404 を返す。

原因: ROSA 側ではリソースが削除済みだが、IAM 側のリソースだけが残存。

解決: AWS CLI で IAM から直接削除。

aws iam delete-open-id-connect-provider \
  --open-id-connect-provider-arn "arn:aws:iam::xxxxx:oidc-provider/..."

4. ヘルスチェックで curl が使えない

Docker コンテナのヘルスチェックで curl を使っていたが、slim イメージには curl が入っていない。

解決: フロントエンドは Node.js の fetch()、バックエンドは Python の urllib でヘルスチェックを実装。追加のパッケージインストールを回避。

開発タイムライン

Day 1: プロジェクト初期化、Constitution定義、
              001-落語管理、002-DBマイグレーション、003-ユーザー管理
              → Spec Kit で仕様→計画→実装を一気に実行

Day 2: 004-ROSA本番デプロイ 作成・デプロイ実施
              → コスト判明、即日クラスタ削除

Day 3: 005-EC2 Docker Compose デプロイ
              → 本番公開完了、動作確認

Last:  006-管理者ダッシュボード、007-利用規約・UX改善
              → テーマカスタマイズ、プライバシーポリシー整備

コア機能の開発(設計〜実装〜デプロイ)は実質 3日間 で完了しています。Spec Kit がなければ仕様書を書くだけで数日かかっていたと思います。

Copilot + Spec Kit で感じたこと

よかった点

  • 仕様の一貫性: Constitution → Spec → Plan → Tasks の流れで、設計判断がブレにくい
  • 実装速度: 7つのフィーチャーを3日で実装・デプロイまで完了
  • デバッグ効率: Copilot Agent Mode がエラーログを読んで修正案を提示してくれる
  • インフラ変更に強い: OpenShift → EC2 の構成変更も、新しいSpec を書いて /speckit.implement するだけ

注意点

  • /speckit.implement が生成するコードは完璧ではなく、特にインフラ周りは手動調整が必要
  • Keycloak のようなステートフルなサービスとの連携は、AI だけでは解決しにくい場面がある
  • 生成されたテストが不十分な場合があるので、手動での動作確認は必須

まとめ

項目 詳細
開発期間 約3日(コア機能)
コード行数 フロントエンド ~5,000行、バックエンド ~4,000行
コンテナ数 7 (frontend, backend, keycloak, postgres, keycloak-db, redis, minio/caddy)
月額コスト 約 $36/月(EC2 t3.medium)
使用AI GitHub Copilot (Claude Opus 4), OpenAI API (GPT-4o-mini, TTS)

趣味プロジェクトでも、仕様駆動で進めることで「何を作るか」「なぜそう作るか」が明確になり、Copilot との協業がスムーズになります。OpenShift のコスト問題は痛い授業料でしたが、EC2 に切り替えたことでランニングコストを大幅に削減できました。

ぜひ実際に触ってみてください。あらすじを入力するだけで、AIが落語を作ってくれます。

URL: https://app.autostorytellers.net


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?