動画・音声から再利用可能な解析メタデータを抽出し、標準化されたパッケージとして出力する。ローレベル特徴とセマンティック特徴の二層設計により、制御・可視化・同期送出に対応。
入力メディア(動画/音声)から、制作・生成・可視化・同期送出(OSC / MIDI 等)で再利用可能な解析データを抽出する。解析結果はプロジェクト固有の合成・演出ロジックから独立した汎用メタデータ形式として保存される。
入力が何であっても(音声あり動画 / 音声なし動画 / 音楽のみ)、同一の解析パッケージ構造を生成。解析レートは入力ファイルの時間構造に追随し、時刻は常に
t
(秒)で表現する。
video + audio 両方の features を生成。stems 生成はデフォルト ON。
video 系 features のみ生成。audio 系はスキップされ、timeline.json の audio は null。
audio 系をフルで生成。video 系 features は生成しない。
Orchestrator + Workers のモジュール分割アーキテクチャ。依存関係の衝突を避けるため、各 Worker は独立した実行環境(venv / コンテナ)で動作する。
{"t": 12.345, "source": "video",
"rate": {"mode": "native", "frame_idx": 370},
"valid": true,
"data": {"brightness": 0.42, "contrast": 0.33,
"edge_density": 0.18, "motion_energy": 0.55}}
{"t": 12.340, "source": "audio",
"rate": {"mode": "native", "hop_idx": 617},
"valid": true,
"data": {"voice_loud_norm": 0.61, "voiced": 1,
"f0_hz": 185.3, "f0_conf": 0.92,
"spectral_centroid_hz": 1400.0, "spectral_flatness": 0.12}}
Orchestrator が入力検出からパッケージ生成まで統括し、各 Worker をサブプロセスとして起動する。
FFmpeg による音声抽出・正規化・SR 変換・タイムベース収集。入力の多様性を吸収し解析を安定化。
OpenCV / FFmpeg signalstats でフレームごとの brightness, contrast, edge_density, motion_energy を抽出。
YOLO で物体 / 人物検出(people_count, boxes)、CLIP でシーン分類・埋め込み。推論ポリシーは stride 制御。
audio-separator で stem 生成(vocals / instrumental)。後続の Voice Features・Beat 推定の精度を向上。
librosa / NumPy で RMS, loudness, F0, spectral centroid, voiced 判定。EMA 平滑化と F0 信頼度フィルタリング。
BeatNet でビート・テンポ推定、librosa recurrence で構造解析、essentia-tensorflow でタグ・ムード分類。
features / artifacts / logs を集約し meta.json, timeline.json, features_index を生成。Viewer Pack (ZIP) を出力。
解析済みデータを動画・音声と同期して確認するための Web ベースビューア。Viewer Pack(ZIP)をドラッグ & ドロップで読み込み、再生と同期してオーバーレイ・グラフ・マーカーを表示する。
video / audio 再生。currentTime をマスター時刻として使用。
BBox(人物枠)、people_count、scene_label を動画上に合成。正規化座標 0..1 + letterbox 補正。
数値時系列(brightness, motion_energy, voice_loud_norm, f0_hz 等)をグラフ表示。
beats / downbeats / イベントをマーカー表示。
audio_structure の区間(A / B / ...)を区間バーで表示。
audio_tags の時間変化をヒートマップで可視化。
現在時刻の全特徴値を一覧表示。診断情報(欠損データ、ライセンス注記)。
t_view = t_player + meta.viewer.time_offset_sec // playback : requestVideoFrameCallback || requestAnimationFrame // paused : seeked / timeupdate events // JSONL parse : Web Worker (non-blocking)
media_analyze analyze \ --input input.mp4 \ --outdir output/job_YYYYMMDD_HHMMSS \ --config preset.json \ --enable-separation true \ --enable-audio-semantic true
# validate media_analyze validate --package output/job_id make validate PACKAGE=output/job_demo_5994_v2 # package & serve media_analyze package --input output/job_id --out pack.zip --video input.mp4 make serve PACKAGE=output/job_demo_5994_v2.zip
{
"audio": {
"frame_sec": 0.05,
"hop_sec": 0.02,
"f0_conf_thr": 0.7,
"separation": { "enabled": true, "model": "2stems" },
"semantic": { "enabled": false }
},
"video": {
"semantic_policy": { "mode": "stride", "stride_frames": 5 }
}
}
解析パッケージが正常に生成された。
入力ファイルの問題または実行時エラー。
スキーマ不整合や必須キーの欠落。
config / CLI オプションの不正。
解析が部分的に失敗してもパッケージ全体は生成する。失敗したモジュールは
valid=false
とし、原因を
logs/run.log
と
meta.json.failures[]
に記録する。stems 生成失敗時はミックス音源にフォールバック。
{
"failures": [
{ "module": "audio_separation", "reason": "not implemented", "fallback": "use_mix" },
{ "module": "video_semantic", "reason": "not implemented", "fallback": "skip" }
]
}