HANAKIN配信システムの技術構成
2026年7月31日、この記事は、
▶ 本編:コードが書けないアイドルが、AIと一緒に10時間配信のシステムを全部作った話https://ameblo.jp/miyamotokarin-official/entry-12974432505.html
先に正直に書いておくと、
実装はすべてClaude Codeに投げていて、
用語は、AIに教えてもらいながら
全体構成
構成はざっくりこうなっています。配信画面と管理画面
スマホ / PC
↓
管理画面(/admin)
↓
Cloudflare Workers
↓
Cloudflare KV
↓
配信用アカウントのOBSブラウザソース
↓
/obs(HUD)を表示
Xの投稿数を取得する流れ
RapidAPI
↓
X検索API
↓
Cloudflare Workers
↓
Cloudflare KVにカウントを保存
↓
OBSのHUDに反映
AI判定アプリの流れ
開発用アカウント
↓
AI判定アプリ
↓
Node.js + Express
↓
localhost:3000で動作
↓
同じMac内の配信用アカウントからアクセス
↓
OBSブラウザソースに表示
表示用の画面は
localhost:3000/obs.html
カメラや画面キャプチャも、
技術選定の方針は最初から一貫していて、
バックエンド:Cloudflare Workers + KV
サーバーサイドはCloudflare Workers(TypeScript)で書き、状態はWorkers KVに持たせました。KVに置いているキー
supply_total
SUPPLYの表示件数
hype_total
HYPEの表示件数
now_text
「今やってること」テロップ
ai_score
AI判定の再現率
telop_list
ローテーションテロップ(配列)
unlock_supply
次の解放アイテム名・必要件数
unlock_hype
HYPE側の次の解放アイテム名・必要件数
stream_start_at
配信開始時刻(タイマー用)
last_poll
X取得の最終実行時刻
用意したAPI
GET /api/state
全状態を返すAPIです。HUDが5秒ごとに取得します。
POST /api/manual/supply
SUPPLYを手動で増減します。
POST /api/manual/hype
HYPEを手動で増減します。
POST /api/text
テロップ・AI判定スコアを更新します。
POST /api/config
解放アイテム名・閾値を更新します。
POST /api/poll
X検索を実行してKVを更新します。
書き込み系は全部
KVに状態を集約したのが、
HUDと管理画面のHTMLも、
CORSでハマった話
最初に踏んだのがこれ。Request header field authorization is not allowed by
Access-Control-Allow-Headers in preflight response
Authorizationヘッダーを付けたことでプリフライト(OPTIONS)が飛び、
X(Twitter)の投稿数カウント
ここが一番難しかったところです。X公式APIは個人で持つには高額なので、
叩いているのは検索エンドポイントです。
検索エンドポイント
指定している内容
type
Latest
count
20
query
エンコード済みハッシュタグ
送っているヘッダー
X-RapidAPI-Key
キー
X-RapidAPI-Host
twitter241.p.rapidapi.com
レスポンスからツイートのエントリだけを抽出して件数を数えています。
当初は10分ごとのCron Triggerで自動ポーリングする設計でした。が、ここで壁にぶつかります。
Cronは有料プラン(月5ドル)が必要でした。
結果的にこれは悪くない判断でした。
取得処理はエラーを握りつぶして、
なお count=20 は上限に張り付きやすく、
フェイルセーフ設計
生配信は一発勝負なので、X APIでの件数取得
管理画面から手動で増減・直接上書き
AI採点
スコアとコメントを手入力してHUDに反映
解放アイテムの段階管理
「次の解放」だけを管理画面から都度書き換え
特に3つ目は運用上かなり効きました。
フロントエンド(HUD / 管理画面)
HUDは1920×240程度の横長レイアウトで、(ここに画像:配信画面全体。HUDが下部に組み込まれた状態)
実装した表示要素はこのあたり。
・SUPPLY / HYPE のセグメント式ゲージ
・次の解放アイテム名と残り件数
・AI判定の再現率
・配信タイマーと現在時刻
・ローテーションテロップ(8秒ごとにフェード切り替え)
・閾値超過時の解放演出(全画面フラッシュ+バナー)
(ここに画像:管理画面のテロップ管理セクション)
テロップは文字数によって溢れるので、
AI判定アプリ(ローカル)
MV再現度の採点だけは、処理の流れはこう。
1.
本家MVと再現MV(MP4)をアップロード
2.
ffmpegで両方から一定間隔のフレームを静止画として抽出
3.
同じタイムコードのフレームをペアにしてVision APIに送信
4.
「構図 / ポーズ / 衣装 / 背景 / 照明 / 雰囲気」の6項目+総合点+コメントをJSONで返させる
5.
SSEで採点結果を1シーンずつストリーミングして画面に描画
SSEにしたのは配信映えのためです。
(ここに画像:審査中の待機画面)
ローカルに置いた理由は、
このアプリには画面を2つ用意しました。
操作用画面
http://localhost:3000
動画を読み込んで判定を実行する画面
表示用画面
http://localhost:3000/obs.html
最新の総合点とコメントだけを出す画面
操作画面
判定画面
操作画面をそのままOBSに映すと、
ここでも例のアカウント分離問題が出ましたが、
AIプロバイダを乗り換えた話
当初はClaude APIで実装していました。が、・請求先住所を漢字からローマ字に修正しても失敗
・同じカードでRapidAPIの決済は通る
つまりカード側の海外決済ブロックではなく、
残り日数を考えて見切りをつけ、
この乗り換え判断は、
開発の進め方
実装はほぼ全てClaude Codeに投げています。やったのは、
事前に仕様書を用意して、
まとめ
設計のいちばんの肝は、「複数の端末・アカウントから共有したい状態はクラウドのKVに、重いデータを扱う処理はローカルに」という役割分担でした。そのうえで、
1. 全ての自動処理に手動フォールバックを用意したこと。
生配信は一発勝負なので、
2. 制約にぶつかったら設計ごと変えたこと。
CronがFreeプランで使えないと分かった時点で自動ポーリングを諦め、
3. 解決に固執せず乗り換えたこと。
決済が通らないことに時間を溶かさず、
今後の課題
投稿数取得の精度上限に張り付きやすく、
Cronによる自動ポーリング
有料プランに乗れば実装済みのコードがそのまま動きます。
AI採点のプロンプト調整
点数が全体的に高めに出る傾向があり、
作りながら学んだことのほうが多い10日間でした。同じようにコードが書けないけど何か作りたい人の参考になれば嬉しいです。










18
こんなの言語と言うんかと思っていた。
その後ホームページビルダーなどが出てきて、text入力しなくてよくなった。
カエルまんじゅう
2026-08-01 20:59:06
返信する