iArt.ai
AI motion graphics software — the After Effects alternative anyone can use. Create animations and explainer videos from a text prompt in minutes.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
記事テキストを投入すると、AI が自動で対話形式のポッドキャスト音声と RSS フィードを生成するシステム。 • 台本: Gemini 2.5 Flash で Host / CoHost の掛け合い形式(日本語) • 音声: Gemini TTS のマルチスピーカー合成(WAV 形式) • 配信: Supabase Storage の公開バケット(グローバル CDN) 本番環境では pgflow migration が作成する pgflow_ensure_workers cron が craft-episode-worker の死活監視と再起動を行います。Read the full README ↗
記事テキストを投入すると、AI が自動で対話形式のポッドキャスト音声と RSS フィードを生成するシステム。
スタック: TypeScript / Deno · Supabase Edge Functions · Supabase Storage · Supabase Postgres · Gemini API
外部トリガー(curl / Capture / queued CI / TUI)
│
│ POST /functions/v1/ingest {title, content, content_path?}
▼
┌─────────────────────┐
│ ingest │ domain_events に ArticleRegistered / EpisodeCreated 等を append
└────────┬────────────┘
│
▼
┌─────────────────────┐
│ domain-subscriber │ production-policy がイベントを読み jobs を enqueue
└────────┬────────────┘
▼
┌─────────────────────┐
│ job-worker │ generateScript → generateAudio → generateEpisodeImage …
└────────┬────────────┘
▼
┌─────────────────────┐
│ publish (Edge) │ EpisodePublished → feed.xml を Storage に upload
└─────────────────────┘
│
▼
Supabase Storage (公開バケット `podcast`)
├── feed.xml ← RSS フィード(CDN 配信)
├── episodes/… ← エピソードカバー
└── …/audio ← 音声(WAV)
読み取りは podcast.*_overview ビューと jobs.attempt_log(実行ログ)。番組メタデータは podcast.shows。
本番では cron / Edge が domain-subscriber と job-worker を定期的に起動します。TUI の Pipeline 画面は event_subscription_failures を表示します。
podcaster/
├── apps/
│ └── web/ # Next.js + Keystatic (local admin; Vercel は GitHub storage)
├── content/
│ ├── docs/ # Wiki Markdoc(公開サイト /podcast の入力)
│ └── web-clips/ # クリップ & メモ(/podcast/web-clips、要ログイン)
├── chugaku-juken/ # 中学受験の物語(公開サイト /juken)
│ └── sapix/grade5-japanese-history/
│ ├── course.yml
│ └── weeks/<月曜YYYY-MM-DD>/
├── public/
│ └── cover.png # ポッドキャストカバー画像
├── scripts/
│ ├── lib/
│ │ ├── supabase-detect.ts # ローカル / リモート Supabase 接続情報の自動検出
│ │ └── table.ts # CLI 用テーブル表示ヘルパー
│ ├── deploy.ts # pnpm deploy の実体
│ ├── gemini-mock-server.ts # Gemini API 最小 mock サーバー
│ ├── ingest.ts # Git 上の mdoc/md を ingest
│ ├── podcast-cli.ts # パイプライン状態確認 CLI
│ ├── post-test-article.ts # ローカル動作確認用テスト記事投入
│ └── seed-config.ts # cover.png アップロード + podcast_config 初期化
├── supabase/
│ ├── config.toml # Supabase CLI 設定(ポート等)
│ ├── migrations/
│ │ ├── 20260423000001_initial.sql # articles / episodes / Storage バケット
│ │ ├── ...
│ │ ├── 20260507031725_..._pgflow_initial.sql
│ │ └── 20260507031744_..._pgflow_step_conditions.sql
│ ├── flows/
│ │ ├── index.ts # pgflow フローのエクスポート
│ │ ├── craft-episode-submit.ts # 台本生成 + 音声バッチ submit
│ │ └── craft-episode-download.ts # 音声ダウンロード + RSS 更新
│ └── functions/
│ ├── _shared/
│ │ ├── db.ts # Supabase クライアント
│ │ ├── pipeline-stages.ts # 各ステージ共通実装
│ │ ├── config.ts # podcast_config ローダー
│ │ └── types.ts # 共有型定義
│ ├── ingest/ # Webhook 受信
│ ├── craft-episode-worker/ # pgflow 実行ワーカー
│ └── pgflow/ # pgflow ControlPlane(フロー定義配信/管理)
├── .env.example
├── package.json
└── tsconfig.json
| ツール | インストール |
|---|---|
| Docker Desktop | https://www.docker.com/products/docker-desktop/ |
| Supabase CLI | brew install supabase/tap/supabase |
| pnpm | npm install -g pnpm |
| Gemini API キー | https://aistudio.google.com/apikey |
# 1. 依存関係インストール
pnpm install
# 2. pgflow のセットアップ(初回または更新時)
pnpm pgflow:install
# 3. 環境変数ファイルを作成し API キーを記入
cp .env.example .env.local
# → GEMINI_API_KEY を設定
# 4. Supabase ローカルスタックを起動(Docker が必要)
supabase start
# 5. マイグレーション適用
supabase db reset
# 6. カバー画像をアップロードし podcast_config を初期化
# (supabase status から接続情報を自動取得)
pnpm seed:config
# 7. Edge Functions をローカルで起動
pnpm functions:serve &
起動後のアクセス先:
| サービス | URL |
|---|---|
| Supabase Studio | http://localhost:54333 |
| Edge Functions | http://localhost:54331/functions/v1/ |
| RSS フィード | http://localhost:54331/storage/v1/object/public/podcast/feed.xml |
別ターミナルで:
pnpm test:post
(SUPABASE_SERVICE_ROLE_KEY は supabase status から自動取得)
202 が返ったら成功。あとは worker を起動すればフローが進行します。
本番では pgflow_ensure_workers が自動実行しますが、ローカルでは手動で呼べます。
# service_role key を取得
KEY=$(supabase status --json | python3 -c "import sys,json; print(json.load(sys.stdin)['SERVICE_ROLE_KEY'])")
# craft episode submit worker(script + batch submit)
curl -s http://localhost:54331/functions/v1/craft-episode-worker \
-H "Authorization: Bearer $KEY"
# craft episode download worker(download + rss)
curl -s http://localhost:54331/functions/v1/craft-episode-download-worker \
-H "Authorization: Bearer $KEY"
進捗は Studio の Table Editor (episodes テーブルの status 列) か、
Storage の podcast バケットで確認できます。
supabase start
pnpm functions:serve
gemini-provider のモック分岐は廃止し、Gemini API 互換の mock サーバーを scripts/ 配下で起動する方式になりました。
# 1. config.toml の Gemini API 設定を mock に切り替える
# [gemini]
# api_root = "http://127.0.0.1:8099"
# api_path = "/v1beta"
# 2. podcast_config に反映(local 対象)
TARGET=local pnpm seed:config
# 3. mock サーバー + Edge Functions を同時起動
pnpm functions:serve:mock
dev.gemini.mock.toml を編集すると、台本・音声・遅延・token usage を調整できます。
mock サーバーだけ起動する場合は pnpm gemini:mock:serve を使ってください。
pnpm cli でパイプラインの状態をローカルから確認できます。
# ローカル Supabase に接続(supabase start が必要)
TARGET=local pnpm cli <command>
# 本番に接続(デフォルト)
pnpm cli <command>
接続情報は SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY 環境変数か、
Supabase CLI (supabase status / supabase projects api-keys) から自動取得します。
list episodes最新 N 件のエピソードを一覧表示します。
This is the beginning of the README. Read the rest at the original. Read the full README ↗