← PROJECTS

Media
Analysis
Pack Reusable metadata for audio & video

動画・音声から再利用可能な解析メタデータを抽出し、標準化されたパッケージとして出力する。ローレベル特徴とセマンティック特徴の二層設計により、制御・可視化・同期送出に対応。

View on GitHub media-analysis-pack / 1.0

Overview

目的

入力メディア(動画/音声)から、制作・生成・可視化・同期送出(OSC / MIDI 等)で再利用可能な解析データを抽出する。解析結果はプロジェクト固有の合成・演出ロジックから独立した汎用メタデータ形式として保存される。

入力が何であっても(音声あり動画 / 音声なし動画 / 音楽のみ)、同一の解析パッケージ構造を生成。解析レートは入力ファイルの時間構造に追随し、時刻は常に t (秒)で表現する。

設計原則

  • 二層構造 Low-level(連続制御向き)+ Semantic(イベント / 意味向き)
  • Native / Canonical 入力追随の Native を正とし、Canonical は派生として任意生成
  • 再現性 入力ハッシュ、モデルバージョン、パラメータ、seed を必ず記録
  • ライセンス追跡 ツール+モデル(重みファイル)のライセンスを別管理
Input 01

音声あり動画

video + audio 両方の features を生成。stems 生成はデフォルト ON。

Input 02

音声なし動画

video 系 features のみ生成。audio 系はスキップされ、timeline.json の audio は null。

Input 03

音楽のみ

audio 系をフルで生成。video 系 features は生成しない。

Architecture

Orchestrator + Workers のモジュール分割アーキテクチャ。依存関係の衝突を避けるため、各 Worker は独立した実行環境(venv / コンテナ)で動作する。

Input Media Preprocess FFmpeg Video Analysis Low-level OpenCV / FFmpeg Semantic YOLO / CLIP Audio Analysis Voice librosa / NumPy Beats BeatNet Structure Recurrence Tags essentia-tf Separation audio-sep Pack Writer meta / timeline / features

技術スタック

Python 3.11+ FFmpeg 7.x NumPy / SciPy librosa BeatNet OpenCV YOLO (Ultralytics) CLIP (OpenCLIP) essentia-tensorflow audio-separator PyTorch JSON Schema

Orchestrator

  • 入力受付 ファイルハッシュ計算、ジョブ ID 生成
  • 設定解決 CLI > config ファイル > defaults の順で上書き
  • Worker 管理 サブプロセス起動・監視・終了コード集約
  • 成果物統合 meta.json / timeline.json / features_index の最終組み立て

Workers

  • worker_preprocess FFmpeg 正規化・音声抽出
  • worker_video OpenCV + YOLO + CLIP
  • worker_audio_basic librosa + BeatNet + recurrence
  • worker_separate audio-separator(stems 生成)
  • worker_semantic_audio essentia-tensorflow

Data Schema

パッケージ構造

output/{job_id}/
meta.json ← manifest
timeline.json ← 時間情報
features/
video_lowlevel_native.jsonl
video_semantic_native.jsonl
audio_voice_native.jsonl
audio_beats.json
audio_structure.json
audio_tags.json
artifacts/
normalized_audio.wav
stems/ vocals / instrumental
derived/ control_stream.csv 等
logs/ run.log

JSONL 共通レコード

  • t 秒(number)
  • source "video" | "audio"
  • rate native: { mode, frame_idx | hop_idx }
  • valid 欠損・フォールバックを明示(boolean)
  • data 特徴量本体(object)

ファイル形式

  • 時系列 JSONL(1行 = 1時刻)
  • イベント / 区間 JSON 配列
  • 大容量テンソル NPZ / Parquet
  • 人間が読む派生 CSV

レコード例

{"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}}

Analysis Pipeline

Orchestrator が入力検出からパッケージ生成まで統括し、各 Worker をサブプロセスとして起動する。

01

Preprocess

FFmpeg による音声抽出・正規化・SR 変換・タイムベース収集。入力の多様性を吸収し解析を安定化。

02

Video Low-level

OpenCV / FFmpeg signalstats でフレームごとの brightness, contrast, edge_density, motion_energy を抽出。

03

Video Semantic

YOLO で物体 / 人物検出(people_count, boxes)、CLIP でシーン分類・埋め込み。推論ポリシーは stride 制御。

04

Audio Separation

audio-separator で stem 生成(vocals / instrumental)。後続の Voice Features・Beat 推定の精度を向上。

05

Audio Voice Features

librosa / NumPy で RMS, loudness, F0, spectral centroid, voiced 判定。EMA 平滑化と F0 信頼度フィルタリング。

06

Beat / Structure / Tags

BeatNet でビート・テンポ推定、librosa recurrence で構造解析、essentia-tensorflow でタグ・ムード分類。

07

Pack Assembly

features / artifacts / logs を集約し meta.json, timeline.json, features_index を生成。Viewer Pack (ZIP) を出力。

Features Detail

Video Low-level

  • brightness 0..1
  • contrast 0..1
  • edge_density 0..1
  • motion_energy 0..1
  • color_temp_proxy 0..1(任意)

Video Semantic

  • people_count number
  • people_boxes[] x, y, w, h(正規化 0..1)
  • people_lr_balance -1..1
  • scene_label string
  • cut_score 0..1(任意)

Audio Voice

  • voice_rms number
  • voice_loud_norm 0..1
  • voiced 0 | 1
  • f0_hz number
  • f0_conf 0..1
  • spectral_centroid_hz number
  • spectral_flatness 0..1

Audio Beats / Structure

  • beat_times_sec[] 拍時刻の配列
  • downbeat_times_sec[] ダウンビート時刻
  • tempo_bpm 推定テンポ
  • segments[] { t0, t1, label, confidence }

Viewer

解析済みデータを動画・音声と同期して確認するための Web ベースビューア。Viewer Pack(ZIP)をドラッグ & ドロップで読み込み、再生と同期してオーバーレイ・グラフ・マーカーを表示する。

Player

video / audio 再生。currentTime をマスター時刻として使用。

Overlay

BBox(人物枠)、people_count、scene_label を動画上に合成。正規化座標 0..1 + letterbox 補正。

Line Lane

数値時系列(brightness, motion_energy, voice_loud_norm, f0_hz 等)をグラフ表示。

Marker Lane

beats / downbeats / イベントをマーカー表示。

Segment Lane

audio_structure の区間(A / B / ...)を区間バーで表示。

Heatmap Lane

audio_tags の時間変化をヒートマップで可視化。

Inspector

現在時刻の全特徴値を一覧表示。診断情報(欠損データ、ライセンス注記)。

同期ルール

t_view = t_player + meta.viewer.time_offset_sec

// playback  : requestVideoFrameCallback || requestAnimationFrame
// paused    : seeked / timeupdate events
// JSONL parse : Web Worker (non-blocking)

Usage

解析実行

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 }
  }
}
Exit 0

成功

解析パッケージが正常に生成された。

Exit 1

解析エラー

入力ファイルの問題または実行時エラー。

Exit 2

バリデーションエラー

スキーマ不整合や必須キーの欠落。

Exit 3

設定エラー

config / CLI オプションの不正。

Error Handling

解析が部分的に失敗してもパッケージ全体は生成する。失敗したモジュールは 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" }
  ]
}