creator-search 簡易仕様書
目的
配信者の配信・動画内の発言を対象に検索できるシステムを構築する
全文検索と意味検索(ベクトル検索)の両方を提供する
検索結果は「該当発言の時間範囲」を返し、その位置から再生できることを重視する
対象プラットフォーム
YouTube
Twitch
検索要件
検索の主単位は人(Creator)
例:葛葉の過去の全動画・全配信が横断検索対象
特定の配信・動画1本に絞った検索も可能
検索方式
全文検索(BM25相当)
ベクトル検索(埋め込み)
将来的にハイブリッド検索を想定
検索結果の最小単位
発言セグメント(segment / chunk)
content ID
start / end 時刻
text
話者ラベル(任意)
データモデル方針
creators
人(VTuber本人)
creator_accounts
人とプラットフォームアカウントの紐付け
source(youtube / twitch)
プラットフォーム固有ID(channel_id / user_id 等)
contents
動画・配信・VOD
source
source_content_id(YouTube videoId / Twitch vodId)
creator_id
title
published_at
duration
url
transcripts
文字起こし成果物の管理
provider(openai / gcp / whisper 等)
version
has_diarization
実データはオブジェクトストレージに保存し、DBは参照のみ持つ
segments
検索インデックスの基本単位
content_id
creator_id(検索効率のため冗長に保持)
start / end(ms 単位)
text
normalized_text
speaker_label(任意)
embeddings
segment 単位のベクトル
model_name
vector
jobs
非同期処理の管理
job_type
status
attempt
error
対象(content_id 等)
アプリケーション構成
リポジトリ方針
1つのモノレポで管理する
API
Hono を使用
取り込み指示受付
データベース更新
検索 API
ジョブ起動・状態参照
Worker
バッチ処理実行
ジョブ種別を引数やサブコマンドで切り替える
Frontend
React を想定(Next.js は使用しない)
ユーザー用検索 UI
管理 UI
初期は同一アプリ内でルーティング分割しても良い
処理パイプライン
content 単位で段階的に実行する
部分再処理が可能な設計とする
ingest / sync
Creator アカウントからコンテンツ一覧を同期
contents を作成
fetch_media
動画・字幕の取得
プラットフォーム別に実装を切り替える
extract_audio
音声抽出(ffmpeg)
transcribe
音声から文字起こし
provider は差し替え可能
chunk
正規化とチャンク化
segments を生成
embed
segments から埋め込み生成
index
全文検索エンジンへ segments を投入
インフラ方針
バッチ実行基盤は Google Cloud を前提とする
GCP から外部 API(OpenAI / Azure OpenAI 等)を利用することは問題ない
ストレージ構成
オブジェクトストレージ
音声データ
transcript JSON
RDB
PostgreSQL を想定
全文検索
OpenSearch / Elasticsearch を想定
ベクトル検索
pgvector または検索エンジンの kNN
初期は運用が単純な構成を優先する
話者分離
専業ベンダー(Deepgram / AssemblyAI)は必須ではない
OpenAI や GCP Speech-to-Text の話者分離機能を選択肢とする
初期要件
Speaker 1 / Speaker 2 などのラベルが付けば十分
話者名の特定は将来課題とする
API 方針
Creator 管理
登録
アカウント紐付け
コンテンツ同期
Content 管理
一覧取得
再処理トリガ
検索
creator_id を必須フィルタとする
optional
content_id
source
日付範囲