Communitygithub.com

ビデオBロール追加

トーキングヘッド、インタビュー、ドキュメンタリー、説明動画において、ローカルメディアまたはPexelsから、トランスクリプトに同期したビジュアルカットアウェイを意図的に追加するスキル。

ビデオBロール追加 とは?

このスキルは、トーキングヘッドやインタビュー形式の動画に対して、トランスクリプト(文字起こし)の特定の瞬間に合わせて、意味のあるビジュアルカットアウェイ(Bロール)を追加するためのものです。Claude Codeや類似のAIエージェントが、PexelsのAPIやローカルメディアファイルから適切な映像を検索・取得し、エディトリアルな意図に基づいて配置するワークフローを自動化します。このスキルは、まず`broll-rules.md`に定義された厳格なルールに従い、トランスクリプトの検証済みタイムラインを活用します。次に、動画制作の後工程(カット、カラーグレード)が完了した後に実行され、Bロールプランを作成し、候補映像の分析・ランク付けを行い、最終的にタイムラインに適用します。重要なのは、一切のランダムなフォールバックや未承認のメディアを使用せず、取得失敗や品質不足の候補はスキップするという厳格な契約を守ることです。また、Pexels APIキーの安全な管理や、エージェントによる誠実なレビュー証明の生成など、運用上のルールも徹底します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/WhiteTowerAI/cut-as-code/tree/main/skills/video-add-b-roll

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

ビデオBロール追加 は何をしますか?

理解されている正規のプロジェクトプロトコルシーケンスに対して、少数のエビデンスに基づくビジュアルカットアウェイを追加します。メディアの計画または取得の前に、broll-rules.mdを読んでください。プランの形状のリファレンスとしてexample-broll-plan.jsonを使用してください。

非交渉契約

broll-rules.mdのすべての編集、出典、静止画、レビュー、復旧、配信ルールに従ってください。運用上:

  • 提供されたスクリプトを、取得、検証、正規化、レシート適用、および検証に使用します。生のダウンロードパスを使用したり、他のストックソースを代用したりしないでください。
  • 人間の権限を偽造しないでください。エージェントのレビューには明示的な委任と真実のエージェントレシートが必要です。
  • 欠落している、弱い、またはダウンローダーに拒否されたメディアはskippedになります。ランダムまたは静止画のフォールバックメディアを使用しないでください。

要件と入力

Python、ffmpeg、ffprobe、およびPillowが必要です。Pexelsの場合、最初に環境変数PEXELS_API_KEYを使用し、次にskills/video-add-b-roll/.envを探します。両方が欠落しているか空の場合は、停止してユーザーにそのファイルにPEXELS_API_KEY=<key>を追加するよう依頼し、ユーザーが確認した後に再試行してください。キーはローカルの.envファイルを介して提供するよう依頼し、チャットを介して決して提供しないでください。コマンド引数、プラン、URL、ログ、レビューアーティファクト、または応答にキーを配置または表示しないでください。

/video-understandは前提条件です。最初にこれを実行して、Bロールが検証済みの単語レベルのトランスクリプトと正規のタイムラインを使用できるようにしてください。 開始する前に、それがインストールされていることを確認してください。インストールされていない場合は、この前提条件が欠落していることをユーザーに警告し、メディアを処理する前に停止してください。

リポジトリルートから実行し、個別のプロジェクトルートを解決します:

$RepoRoot = (Resolve-Path '.').Path
$ProjectRoot = (Resolve-Path 'path/to/video-project').Path
$BrollEnv = Join-Path $RepoRoot 'skills/video-add-b-roll/.env'
if ([string]::IsNullOrWhiteSpace($env:PEXELS_API_KEY) -and (Test-Path -LiteralPath $BrollEnv)) {
  $PexelsKeyLine = Get-Content -LiteralPath $BrollEnv | Where-Object { $_ -match '^\s*PEXELS_API_KEY\s*=' } | Select-Object -Last 1
  if ($PexelsKeyLine) { $env:PEXELS_API_KEY = ($PexelsKeyLine -split '=', 2)[1].Trim().Trim('"').Trim("'") }
}
$BrollScripts = Join-Path $RepoRoot 'skills/video-add-b-roll/scripts'
$ProjectLib = Join-Path $RepoRoot 'skills/video-understand/scripts'
$ReviewVideo = & python -c "import sys; from pathlib import Path; sys.path.insert(0,sys.argv[2]); import projectlib; root=Path(sys.argv[1]); project=projectlib.load_json(root/'work/project.json'); assert project.get('render',{}).get('status') == 'verified', 'current upstream delivery is not verified'; path=projectlib.resolve_project_path(root,project['render']['output']); assert path.is_file(), 'current upstream delivery is missing'; print(path)" $ProjectRoot $ProjectLib
if ($LASTEXITCODE -ne 0) { throw 'Complete the active upstream delivery before B-roll review.' }
$ReviewVideo = (Resolve-Path -LiteralPath $ReviewVideo).Path

再トランスクリプションや再分析の代わりに、これらの正規の入力を使用してください:

  • work/project.json
  • work/timeline.json
  • work/understand/transcript.json
  • work/understand/understanding.json
  • アクティブなカットとカラーグレード作業を含む現在のプログラムタイムレビュービデオ

$ReviewVideoは、その既存の検証済み上流配信であり、発明するファイル名や新しいBロールレンダリングではありません。アクティブなタイムラインの長さ、寸法、およびFPSと既に一致している必要があります。存在しないか古い場合は、最初に上流のカット/カラーグレード配信を完了し、それを解決してハッシュ化してから続行してください。

この操作は常にunderstandingに依存し、さらにターゲットシーケンスでこれらの操作がアクティブな場合はcutとcolor-gradeにも依存します。それらの現在の正の整数リビジョンをbased_onにコピーします。カラーグレードがアクティブな場合は、グレードプランと選択されたLUTの両方のハッシュを記録します。正規化はその正確な選択されたLUTを受け取り、選択されたすべてのBロールショットに事前適用する必要があります。

正規のシーケンス順序は次のとおりです:

cut -> color-grade -> b-roll -> captions -> content-cards -> graphic-motion

登録された操作はchanges_video_pixels: trueを持ち、b-rollトラックを追加し、タイムライン、ジオメトリ、およびオーディオを変更しないままにする必要があります。broll_plan.register_operation()がこの契約を書き込みます。操作を手動で構築しないでください。

永続ファイルと使い捨てファイル

work/b-roll/broll-plan.json                         # 永続的なドメインプラン
work/b-roll/presentation-decision.json               # 永続的なエージェントチャットルート決定
work/b-roll/broll-interaction.json                  # 永続的な適用済みレシート
work/b-roll/broll-selection.json                    # 永続的な承認済み正確な選択と消費ページバインディング
work/b-roll/speaker-inset-analysis.json             # 永続的なシーン/エビデンスパケット
work/b-roll/speaker-inset-agent-input.json          # 永続的なエージェントROI決定
work/b-roll/speaker-inset-preview.json              # 永続的な正確なプレビューバインディング
work/b-roll/speaker-inset-clearance.json            # 永続的なエージェント障害物チェック
work/b-roll/broll-revision-request-<UUID>.json      # 永続的な未承認リクエストバイト
work/b-roll/candidate-search.json                   # 永続的なクエリとプロバイダー順序
work/b-roll/candidate-analysis.json                 # 永続的な決定論的エビデンス
work/b-roll/candidate-ranking.json                  # 永続的なエージェントランキングとトップ3
work/cache/b-roll/candidate-analysis/media/         # 使い捨ての分析バリアント
work/cache/b-roll/candidate-analysis/frames/        # 再現可能なサンプルとクロップ
work/cache/b-roll/candidates/                       # 凍結された取得済みメディア
work/cache/b-roll/speaker-inset/                    # 再現可能なエビデンスとプレビュー
work/cache/b-roll/normalized/                       # 再現可能なサイレントオーバーレイ
review/03-b-roll/candidate-analysis-<UUID>/          # 不変の分析パケット
review/03-b-roll/candidate-analysis-<UUID>.md        # 分析とベースラインサマリー
review/03-b-roll/candidate-analysis-<UUID>/candidate-index.html
review/03-b-roll/b-roll-review-<UUID>.html          # 不変の候補レビュー
review/03-b-roll/b-roll-review.html                 # 最新の便利エイリアス
review/03-b-roll/stills/                            # 最初/中央/最後の検証フレーム
review/03-b-roll/contact-sheet.jpg
review/03-b-roll/boundary-reel.mp4
review/03-b-roll/b-roll-summary.md

プランとレシートはwork/cache/の外に保管してください。候補ファイルと正規化ファイルは再現可能ですが、ハッシュにバインドされた入力として扱ってください。

ワークフロー

1. 現在の依存関係を確立する

アクティブなシーケンス、操作リビジョン、タイムライン、トランスクリプト、理解、アクティブなグレードプラン、および選択されたLUTを読み取ります。レビュービデオがアクティブなタイムラインの長さ、寸法、および有理FPSと一致することを確認します。トランスクリプト、タイムライン、レビュービデオ、およびアクティブなグレード入力をinput_hashesにハッシュ化します。

broll_plan.active_dependencies(project)を使用して正確な依存関係リストを導出します。タイムライン、トランスクリプト、依存関係リビジョン、グレードプラン、LUT、レビュービデオ、候補マニフェスト、またはレビュー済みアセットが変更されると、下流の作業が古くなります。古いレシートを引き継ぐのではなく、プランを更新してレビューを繰り返します。

2. 動的ソーシャルプランを作成する

work/b-roll/broll-plan.jsonを手動で作成します。スクリプトは精度を実行し、編集判断は行いません。提案された各ショットについて:

  • 時系列順に、正の、半開で、重複しないプログラム範囲を選択します。
  • work/timeline.jsonを介してそれを正確なsource_rangesにマッピングします。
  • ソースとプログラムの範囲およびクリップIDを含む、少なくとも1つの正確にマッピングされたトランスクリプト単語を保持します。
  • 具体的なeditorial_reasonとvisual_intentを述べます。
  • brief.search_contextに具体的なtopic、visual_direction、および1〜12のユニークなキーワードを設定します。
  • 各semantic_roleをdirect、supportive、またはatmosphericに設定します。
  • 2つまたは3つの階層化されたリテラル英語クエリを作成します: direct subject/actionクエリ、defensible context/processクエリ、そして3番目のクエリが有用な場合はtheme-enhancing variant。
  • plannedで開始し、取得後にcandidates_readyに移行するか、関連する候補が存在しない場合はskippedを使用します。

brief.densityをdynamic-socialのままにします。計画されたカバレッジは、マッピングされたトランスクリプトとタイムラインの完全なAロールスキャンで始まり、その後、手動で作成された時系列順、重複なし、編集的に有効な範囲が続きます。0.40から0.70をソフトターゲットとして扱います。0.40未満の場合は、1秒パスを取り、防御可能な範囲のみを追加または拡張します。0.70を超える場合は、内部でAロールの隠蔽をレビューします。ターゲットを達成するために、無関係なフィラーを追加したり、関連性、権利、品質、または別の適格性ゲートを弱めたりしないでください。techやentertainmentなどの一般的なトピック用語はクエリを洗練するためにのみ使用されます。これらが、候補とトランスクリプトの主張との間のショットごとの可視的な関係を置き換えることはありません。どの瞬間もBロールに値しない場合、承認されたすべてスキップのプランは有効なノーオペレーションです。

ドラフト作成中はspeaker_inset_styleを追加しないでください。候補取得後、明示的なエージェントチャットプレゼンテーション決定が、通常ルートかスピーカーインセットルートかを選択します。後者は自動的に厳密なプロジェクトレベルの角丸長方形スタイルをインストールします: width_ratio: 0.39、灰色の境界線、アスペクト比、コーナー半径、マージン、および字幕セーフボトムエリア。プリセットとアンカーはスタイルに属しません。エージェントは、正確に選択されたメディアを検査した後、project_layout_strategyと各ショットごとに1つのlayout_recommendationを記録します。顔検出器、セグメンテーションモデル、クロスカットアイデンティティトラッカー、または推測されたROIを導入しないでください。スピーカーROIピクセルをアスペクト比を維持したカバースケーリングでウィンドウに収めます。構成されたアスペクト比に引き伸ばさないでください。クロップを水平方向に中央揃えし、上部にアンカーして、完全な頭と顔が下半身のカバレッジよりも優先されるようにします。

重要な編集のたびにドラフトを検証します:

python -c "import sys; from pathlib import Path; root=Path(sys.argv[1]); sys.path.insert(0,sys.argv[2]); import broll_plan,projectlib; plan=projectlib.load_json(root/'work/b-roll/broll-plan.json'); timeline=projectlib.load_json(root/'work/timeline.json'); transcript=projectlib.load_json(root/'work/understand/transcript.json'); project=projectlib.load_json(root/'work/project.json'); errors=broll_plan.validate_plan(plan,timeline,transcript,project=project,project_root=root,verify_files=True); print('\n'.join(errors) if errors else 'B-roll plan valid'); raise SystemExit(bool(errors))" $ProjectRoot $BrollScripts

3. 候補を分析、ランク付け、凍結する

候補分析は、candidates_readyの前のアドバイザリーエビデンスです。メディアを選択したり、ショットを承認したり、レシートを追加したり、ライフサイクルを変更したりしません。すべてのショットに対して既存の2つまたは3つのリテラルクエリを保持します。

ローカルビデオの場合、真実の出典を書き込み、既存の取得パスを通じてインポートします:

python "$BrollScripts/pexels.py" import-local `
  "$ProjectRoot/input/example-owned-footage.mp4" `
  "$ProjectRoot/work/cache/b-roll/candidates/example-owned-footage.mp4" `
  "$ProjectRoot/work/b-roll/example-local-provenance.json"

返されたレコードをショットのcandidatesにコピーします。候補分析はその正確な凍結されたキャッシュファイルを読み取ります。それを別のプロバイダーまたは分析システムにコピーしません。プランがPexelsをクエリすべきでない場合は--local-onlyを使用します。

ラウンドロビンクエリマージ、プロバイダーID重複排除、およびショットごとに最大8つのユニークなプロバイダービデオでPexels結果を収集します。タイムラインに一致する向きを選択します:

$CandidateAnalysis = Join-Path $BrollScripts 'candidate_analysis.py'
python $CandidateAnalysis search `
  $ProjectRoot `
  "$ProjectRoot/work/b-roll/broll-plan.json" `
  "$ProjectRoot/work/b-roll/candidate-search.json" `
  --orientation portrait `
  --per-page 8

ローカルのみの分析には--local-onlyを追加します。検索レコードは、すべてのリテラルクエリ、その元のプロバイダー順序、ラウンドロビン順序、および両方のPexelsバリアントを保持します。分析バリアントは、短辺が少なくとも480ピクセルの最小の向き一致ファイル、または適格なファイルがない場合は最大の有効な一致ファイルです。配信バリアントは、最高解像度の向き一致ファイルのままです。

分析バリアントのみをダウンロードして完全にデコードし、10/30/50/70/90パーセントでサンプリングし、決定論的なマシンエビデンスを書き込みます:

python $CandidateAnalysis analyze `
  $ProjectRoot `
  "$ProjectRoot/work/b-roll/broll-plan.json" `
  "$ProjectRoot/work/b-roll/candidate-search.json" `
  "$ProjectRoot/work/timeline.json" `
  "$ProjectRoot/work/b-roll/candidate-analysis.json"

分析には、ハードチェック、客観的な警告、サンプリングされたフレームとセンタークロップのハッシュ、コンタクトシート、ルマ/クリッピング/エッジ/モーションエビデンス、および重複エビデンスが含まれます。ショットローカルの正確な拒否と厳格な知覚しきい値を保持し、次にプロジェクト全体の正確な同一性、厳格な知覚グループ、および抑制しないpossible_seriesヒントを追加します。ハード拒否はreference/broll-rules.mdの客観的な失敗に限定されます。

正確なトランスクリプトエビデンス、5フレーム、クロップシミュレーション、警告、および重複エビデンスを検査します。次の形状でwork/cache/b-roll/candidate-ranking-input.jsonを書き込みます:

{
  "schema_version": 1,
  "analysis_sha256": "<canonical SHA-256 of candidate-analysis.json>",
  "mode": "agent",
  "actor": "<real Agent name>",
  "timestamp": "<timezone-aware timestamp>",
  "overall_rationale": "<non-empty rationale>",
  "near_duplicate_groups": [{
    "group_id": "<stable group id>",
    "match_type": "same_series",
    "actor": "<real Agent name>",
    "timestamp": "<timezone-aware timestamp>",
    "members": [
      {"shot_id": "<shot id>", "candidate_id": "<candidate id>"},
      {"shot_id": "<other shot id>", "candidate_id": "<other candidate id>"}
    ],
    "rationale": "<specific visible repetition across the two transcript moments>"
  }],
  "shots": [{
    "shot_id": "<shot id>",
    "candidates": [{

…

[翻訳のため省略]

Individual skills in this repo

This repo contains 8 individual skills — each has its own dedicated page.

関連スキル