プロジェクト概要
Calliopeは、YouTube動画を即公開可能なブログ記事に変換するために構築されたコンテンツ再利用プラットフォームです。クリエイターやライター、マーケターが動画を手作業で書き起こして記事を一から執筆する代わりに、Calliopeがパイプライン全体を自動化します。動画字幕の取得、タイムスタンプの解析、検索コンテキストによるプロンプトの補強、構造化されたブログ下書きのリアルタイムストリーミングを行います。
私はフルスタック開発者としてエンドツーエンドで本アプリケーションを構築し、ブラウザUI、FastAPI RESTエンドポイント、Celeryバックグラウンドワーカー、マルチモデルLLMチェーン、管理者向けトークン分析機能を設計しました。
プロダクトへのリンク: Calliope

使用技術スタック
flowchart LR
subgraph Client ["フロントエンド"]
UI["React 19 / TypeScript UI"]
Editor["Markdown エディタ & ストリーム"]
end
subgraph Backend ["FastAPI & ワーカー"]
API["FastAPI REST API"]
Worker["Celery バックグラウンドワーカー"]
YT["YouTube 字幕パイプライン"]
SERP["SERP コンテキストエンジン"]
LLM["LangChain オーケストレーション"]
end
subgraph Storage ["データ & メッセージング"]
Redis[("Redis ブローカー")]
DB[("PostgreSQL")]
end
UI <-->|HTTP / JSON| API
API -->|タスクエンキュー| Redis
Redis --> Worker
Worker --> YT
Worker --> SERP
Worker --> LLM
Worker <--> DB
API <--> DB
sequenceDiagram
actor User
participant UI as React UI
participant API as FastAPI
participant DB as PostgreSQL
participant YT as YouTube
participant Redis as Redis
participant Worker as Celery Worker
participant LLM as LLM Provider
participant SERP as SERP API
User->>UI: YouTube URLを貼り付け
UI->>API: POST /videos/transcribe
API->>DB: yt_id でブログを検索
alt トランスクリプトが未キャッシュの場合
API->>YT: yt-dlp 経由で字幕抽出
YT-->>API: 字幕トラック
opt yt-dlp が失敗した場合
API->>YT: Google YouTube Data API でフォールバック
YT-->>API: トランスクリプトテキスト
end
API->>DB: Blog + トランスクリプトメタデータを更新保存
end
API->>DB: UserBlog ドラフトを作成・紐付け
API->>Redis: generate_blog タスクをエンキュー
API-->>UI: draft_id + ステータス
loop 2秒ごとのポーリング
UI->>API: GET /drafts/{id}
API->>DB: ドラフト内容 + ステータスを取得
API-->>UI: 一部または最終コンテンツ
end
Redis->>Worker: generate_blog をデキュー
Worker->>DB: Blog からトランスクリプトを読み込み
Worker->>LLM: コンテンツタイプとトピックを分類
LLM-->>Worker: content_type, topic
Worker->>LLM: ナレッジドキュメントを抽出
LLM-->>Worker: 構造化ナレッジドキュメント
opt SERP が有効な場合
Worker->>SERP: トピックキーワードを調査
SERP-->>Worker: 上位ランキングのスニペット
end
Worker->>LLM: ブログ下書きをストリーミング
loop トークンストリーム
LLM-->>Worker: トークンチャンク
Worker->>Redis: ステータスとトークンイベントを発行
Worker->>DB: 一部コンテンツをフラッシュ
end
Worker->>DB: 最終ドラフト + トークン使用量を保存
Worker->>Redis: 完了イベントを発行
- フロントエンド: React 19, TypeScript, Vite, Tailwind CSS v4, Base UI / Shadcn, Recharts, Zustand
- バックエンド: Python, FastAPI, Celery, SQLAlchemy, Alembic, Pydantic
- AIオーケストレーション: LangChain, LangChain-Google-GenAI, LangChain-OpenAI (DeepSeek, Gemini, GPT モデルをサポート)
- 動画 & SERP 処理:
yt-dlp, YouTube Data API v3, SerpApi, DataForSEO - ストレージ & インフラ: PostgreSQL, Redis, Docker Compose
- 認証 & サービス: Google OAuth2, JWT セッション, Resend メール配信, FingerprintJS 訪問者追跡
プロダクトの背景
長尺のYouTube動画には豊富な専門知識が含まれていますが、話し言葉の動画コンテンツを検索上位を狙える読みやすい記事に仕立てるには、文字起こし、構成作成、編集に何時間もかかります。生のトランスクリプトをそのまま出力するだけでは、話し言葉特有の雑多さ、見出しの欠如、検索意図との不一致により失敗します。
Calliopeは音声コンテンツと構造化された出版物をつなぐために開発されました。字幕を抽出し、会話のフィラー(相づち等)を除去し、核心となるトピックの切り口を特定し、有効化されている場合は検索上位結果と照合して、タイトル、見出し、要点、フロントメタデータ(Frontmatter)を含む記事を生成します。
実装内容

- YouTube抽出エンジン: 最初に
yt-dlpで字幕トラックを取得し、スクレイピングに失敗した場合は Google YouTube Data API にフォールバックする2層構造の字幕パーサー - 非同期タスクパイプライン: Web API リクエストをブロックすることなく、長時間のトランスクリプト処理とLLM合成を処理するCeleryおよびRedisワーカーキュー
- マルチモデルLLMオーケストレーション: DeepSeek v4 Pro、Google Gemini 2.5/3.0、OpenAI GPT-4o などのモデルをサポートする柔軟な LangChain 抽象化
- SERPリサーチ統合: SerpApi および DataForSEO を介したオプショナルの Google SERP 検索機能により、競合の切り口や検索者の意図をプロンプトに注入
- インタラクティブMarkdownエディタ: リアルタイムの下書きストリーミング、Markdownプレビュー、ハイライトメモ、カスタムテーマ、およびフロントメタデータ(タイトル、メタ記述、OG画像、タグ)を含むワンクリックコピー機能
- 履歴 & 保存ドラフト: ドラフト履歴、タイトル検索、ピン留め機能、元動画への属性表示を備えたユーザーワークスペース
- 管理者分析ダッシュボード: ユーザー登録数、累積成長、LLMプロバイダーごとの正確なプロンプト/完了トークン消費量を追跡するリアルタイムメトリクス
主な技術的決定
1. 同期APIルートから字幕抽出をデカップリング
40分の動画から字幕を取得し、2,000文字の記事を生成するには数十秒かかります。これを同期HTTPハンドラー内で実行するとタイムアウトが発生し、サーバーのスループットが低下します。RedisでバックアップされたCeleryワーカーキューにジョブを投入することで、APIの応答性を維持しながら中間タスク状態をPostgreSQLに保存します。
2. 堅牢な字幕フォールバックチェーンの実装
YouTubeの字幕エンドポイントは頻繁に変更されたりレート制限がかかったりします。Calliopeは堅牢なパイプラインを使用しています。まず yt-dlp で字幕トラックを抽出し、失敗した場合は Google YouTube Data API にフォールバックします。この順序により、主経路の高速性と信頼性を保ちつつ、スクレイピングが壊れた際のエッジケースも公式APIでカバーできます。
3. SERPの意図コンテキストによるプロンプトの補強
動画のトランスクリプトだけでは、読者が期待するキー用語や関連質問を見落とす可能性があります。SERPリサーチが有効な場合、Calliopeは動画の主要トピックに関するGoogle検索上位結果をクエリし、それらの検索スニペットをオプションのコンテキストとしてLLMに渡します。これにより、動画のコアコンテンツから脱線することなく、検索者の意図に合致した記事を生成できます。
4. リクエストごとのトークン使用量とコスト境界の追跡
運用コストを予測可能に保つため、データベースにはすべてのLLM呼び出しについてモデルプロバイダーのメタデータとともに正確な入力・出力トークン数を記録します。管理者ダッシュボードはこれらのメトリクスを集計し、モデルコストとユーザーアクティビティを即座に可視化します。
成果
Calliopeは calliope.ekky.dev でライブデプロイされています。30分以上のYouTube動画を30秒未満で1,500文字以上の整形されたブログ記事に変換し、クリエイターやマーケターにマルチチャネルなコンテンツ展開の手段を提供しています。
得られた知見
- サードパーティの文字起こしAPIは壊れやすいため、
yt-dlpを主要な抽出パスとし、スクレイピングが失敗した際のフォールバックとして Google YouTube Data API を配置するのが最適です。 - 動画のトランスクリプトデータと検索上位結果を組み合わせることで、トランスクリプト単体よりも格段に包括的な記事が作成できます。
- トークンメトリクスの管理者分析は、トラフィックの増大に伴う透明性の高いコスト追跡を保証するため、初日からスキーマに組み込んで設計すべきです。
添付資料
ランディングページ

ログイン画面

アカウント作成画面

メインダッシュボードとナビゲーション

生成履歴

管理者分析とトークンメトリクス

トランスクリプトとハイライトワークスペース

ブログドラフトエディタ

