Video Use
原理
- LLMは生のトランスクリプトとオンデマンドのビジュアルから推論する。 唯一、価値のある派生成果物は、パックされたフレーズレベルのトランスクリプト(
takes_packed.md)です。その他すべて(フィラータグ付け、リテイク検出、ショット分類、強調スコアリング)は、判断時に導出します。→ 確認:ステップ出力が期待される結果と一致すること - 音声が優先され、ビジュアルはそれに従う。 カット候補は、発話境界と無音ギャップから得られます。判断ポイントでのみビジュアルにドリルダウンします。→ 確認:ステップ出力が期待される結果と一致すること
- 質問→確認→実行→反復→永続化。 ユーザーがプレーンイングリッシュで戦略を確認するまで、カットに絶対に触れないでください。
- 一般化する。 これがどのような種類の動画かを想定しないでください。素材を見て、ユーザーに尋ね、それから編集します。→ 確認:差分が意図した変更と一致すること
- 芸術的自由がデフォルトです。 このドキュメント内のすべての特定の値、プリセット、フォント、色、時間、ピッチ構造、およびテクニックは、実績のある1つの動画からの実例であり、必須事項ではありません。何が可能で、なぜそれが機能したかを理解するためにそれらを読んでください。その後、素材が実際に何であるか、ユーザーが実際に何を望んでいるかに基づいて、独自のセンスで判断してください。絶対に行わなければならないことは、以下のハードルールセクションにのみ記載されています。 それ以外はすべてあなたの自由です。→ 確認:ファイルの内容が期待される形式と一致すること
- 自由に発明する。 素材がここに記載されていないテクニック(分割画面、ピクチャーインピクチャー、ローワーサードのアイデンティティカード、リアクションカット、スピードランプ、フリーズフレーム、クロスフェード、マッチカット、Lカット、Jカット、ブレスでのスピードランプなど)を必要とする場合は、それを作成してください。ヘルパーはffmpegとPILです。フォーマットがサポートするものは何でもできます。許可を待つ必要はありません。→ 確認:ステップ出力が期待される結果と一致すること
- ユーザーに表示する前に、自分の出力を検証してください。 出荷できる状態でなければ、提示しないでください。
ハードルール(本番品質 — 譲歩不可)
これらは、逸脱すると無音の失敗や壊れた出力を引き起こすものです。センスの問題ではなく、正確性の問題です。これらを記憶してください。
- 字幕はフィルターチェーンの最後に、すべてのオーバーレイの後に適用します。そうしないと、オーバーレイがキャプションを隠してしまいます。無音の失敗。→ 確認:ステップ出力が期待される結果と一致すること
- セグメントごとの抽出→ロスレス
-c copy結合、シングルパスのフィルターグラフは使用しません。そうしないと、オーバーレイが追加されるたびにすべてのセグメントが二重エンコードされます。 - すべてのセグメント境界で30msのオーディオフェード(
afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03)。そうしないと、すべてのカットで可聴のポップノイズが発生します。→ 確認:ステップ出力が期待される結果と一致すること - オーバーレイは
setpts=PTS-STARTPTS+T/TBを使用して、オーバーレイのフレーム0をそのウィンドウの開始位置にシフトします。そうしないと、オーバーレイウィンドウ中にアニメーションの途中が見えてしまいます。→ 確認:ステップ出力が期待される結果と一致すること - マスターSRTは出力タイムラインオフセットを使用します:
output_time = word.start - segment_start + segment_offset。そうしないと、セグメント結合後にキャプションの位置がずれます。→ 確認:ステップ出力が期待される結果と一致すること - 単語の途中でカットしないでください。 すべてのカットエッジを、スクライブトランスクリプトの単語境界にスナップさせてください。→ 確認:ステップ出力が期待される結果と一致すること
- すべてのカットエッジにパディングを追加します。 作業ウィンドウ:30~200ms。スクライブのタイムスタンプは50~100msのずれがあります — パディングがそのずれを吸収します。テンポの速いものでは狭く、シネマティックなものでは広くします。→ 確認:ステップ出力が期待される結果と一致すること
- 単語レベルの逐語的ASRのみ。 SRT/フレーズモードは使用しないでください(サブ秒のギャップデータが失われます)。フィラーを正規化しないでください(編集上のシグナルが失われます)。→ 確認:差分が意図した変更と一致すること
- ソースごとにトランスクリプトをキャッシュします。 ソースファイル自体が変更されない限り、再文字起こしは絶対に行わないでください。→ 確認:ステップ出力が期待される結果と一致すること
- 複数のアニメーションには並列サブエージェントを使用します。 決して逐次的に行わないでください。
Agentツールを使用して一度にN個を起動します。合計ウォールタイムは最遅のものとほぼ同じになります。→ 確認:ステップ出力が期待される結果と一致すること - 実行前に戦略を確認します。 ユーザーがプレーンイングリッシュの計画を承認するまで、カットに絶対に触れないでください。→ 確認:ステップ出力が期待される結果と一致すること
- すべてのセッション出力は
<videos_dir>/edit/に配置します。video-use/プロジェクトディレクトリ内には絶対に書き込まないでください。→ 確認:出力が存在し、エラーなく解析できること
このドキュメントの他のすべては実例です。素材が必要とするときはいつでも逸脱して構いません。
ディレクトリ構成
スキルは video-use/ にあります。ユーザーの映像は、ユーザーがどこに配置したかにあります。すべてのセッション出力は <videos_dir>/edit/ に配置されます。
<videos_dir>/
├── <ソースファイル、未編集>
└── edit/
├── project.md ← メモリ;セッションごとに追記
├── takes_packed.md ← フレーズレベルのトランスクリプト、LLMの主要な読み取りビュー
├── edl.json ← カットの決定
├── transcripts/<name>.json ← キャッシュされた生のスクライブJSON
├── animations/slot_<id>/ ← アニメーションごとのソース + レンダリング + 推論
├── clips_graded/ ← グレーディングとフェードを適用したセグメントごとの抽出
├── master.srt ← 出力タイムラインの字幕
├── downloads/ ← yt-dlpの出力
├── verify/ ← デバッグフレーム / タイムラインPNG
├── preview.mp4
└── final.mp4
セットアップ
ELEVENLABS_API_KEYをプロジェクトルートまたは環境の.envに配置します。不足している場合は尋ね、.envを作成します。ffmpeg+ffprobeがPATHに存在すること。- Python依存関係:
pip install -e .。 yt-dlp、manim、Remotionは最初の使用時のみインストールします。- このスキルは
skills/manim-video/をベンダリングしています。Manimスロットを構築する際は、そのSKILL.mdを読んでください。
ヘルパー
transcribe.py <video>— 単一ファイルのスクライブ呼び出し。--num-speakers Nはオプション。キャッシュされます。transcribe_batch.py <videos_dir>— 4ワーカーの並列文字起こし。マルチテイクに使用します。pack_transcripts.py --edit-dir <dir>—transcripts/*.json→takes_packed.md(フレーズレベル、0.5秒以上の無音で区切る)。timeline_view.py <video> <start> <end>— フィルムストリップ + 波形PNG。オンデマンドのビジュアルドリルダウン。スキャンツールではありません — 常にではなく、判断ポイントで使用します。render.py <edl.json> -o <out>— セグメントごとの抽出 → 結合 → オーバーレイ(PTSシフト) → 字幕(最後)。--previewは720p高速用。--build-subtitlesはインラインでmaster.srtを生成します。grade.py <in> -o <out>— ffmpegフィルターチェーングレーディング。プリセット + カスタム用の--filter '<raw>'。
アニメーションについては、Bashで <edit>/animations/slot_<id>/ を作成し、Agentツールを使用してサブエージェントを起動します。
プロセス
-
インベントリ。 すべてのソースに対して
ffprobeを実行します。ディレクトリに対してtranscribe_batch.pyを実行します。pack_transcripts.pyを実行してtakes_packed.mdを生成します。視覚的な第一印象を得るために、1つか2つのtimeline_viewをサンプリングします。→ 確認:ステップ出力が期待される結果と一致すること -
問題の事前スキャン。
takes_packed.mdを一回スキャンして、言葉の滑り、明らかな言い間違い、避けるべき言い回しをメモします。プレーンなリストにして、編集者ブリーフに提供します。→ 確認:ステップ出力が期待される結果と一致すること -
対話。 見えた内容をプレーンイングリッシュで説明します。素材に合わせた質問をします。収集するもの:コンテンツタイプ、目標の長さ/アスペクト、美的/ブランドの方向性、ペース感、絶対に保持する瞬間、絶対にカットする瞬間、アニメーションとグレーディングの好み、字幕の必要性。固定のチェックリストは使用しないでください — 適切な質問は毎回異なります。→ 確認:すべてのテストに合格すること
-
戦略を提案します。 4~8文で:構造、テイクの選択、カットの方向性、アニメーションプラン、グレーディングの方向性、字幕スタイル、長さの見積もり。確認を待ちます。 → 確認:ステップ出力が期待される結果と一致すること
-
実行します。 編集者サブエージェントのブリーフを通じて
edl.jsonを生成します。曖昧な瞬間にtimeline_viewにドリルダウンします。並列サブエージェントでアニメーションを構築します。セグメントごとにグレーディングを適用します。render.pyで合成します。→ 確認:コマンドの終了コードが0であること -
プレビュー。
render.py --preview。→ 確認:ステップ出力が期待される結果と一致すること -
自己評価(ユーザーに表示する前)。 レンダリングされた出力(ソースではない)に対して、すべてのカット境界(±1.5秒ウィンドウ)で
timeline_viewを実行します。各画像について以下を確認します:→ 確認:コマンドの終了コードが0であること- カット部分での視覚的な不連続性 / フラッシュ / ジャンプ
- 境界での波形スパイク(30msフェードをすり抜けたオーディオポップ)
- オーバーレイの背後に隠れた字幕(ルール1違反)
- オーバーレイの位置ずれ、または間違ったフレームの表示(ルール4違反)
また、最初の2秒、最後の2秒、および2~3か所の中間点をサンプリング — グレーディングの一貫性、字幕の読みやすさ、全体的なまとまりを確認します。出力に対して
ffprobeを実行し、再生時間がEDLの期待値と一致することを確認します。何か問題がある場合:修正 → 再レンダリング → 再評価。自己評価を3回までに制限 — 3回後も問題が残る場合は、無限ループを避けるため、ユーザーに報告します。自己評価に合格した後にのみ、プレビューを提示します。
-
反復 + 永続化。 自然言語によるフィードバック、再計画、再レンダリング。再文字起こしは絶対に行いません。確認後に最終レンダリング。
project.mdに追記します。→ 確認:ステップ出力が期待される結果と一致すること
カットの技術(テクニック)
- オーディオファースト。 単語境界と無音ギャップからカット候補を抽出します。
- ピークを保持します。 笑い、決めゼリフ、強調のビート。決めゼリフの後にはリアクションを含めるために余白を取ります — 笑い自体がビートです。
- 話者の交代は発話間に間隔を設けると効果的です。一般的な値:400~600ms。テンポの速いものでは短く、シネマティックなものでは長く。センスの問題です。
- オーディオイベントをシグナルとして。
(笑い)、(ため息)、(拍手)はビートを示します。それらを超えて拡張します。 - 無音ギャップはカット候補です。 400ms以上の無音は、通常、最もクリーンです。150~400msのフレーズ境界は、視覚的なチェックがあれば使用可能です。150ms未満は安全ではありません(フレーズ途中)。
- カットパディングの例(このスキルにバンドルされている発表動画の場合):保持する最初の単語の前に50ms、最後の単語の後に80ms。モンタージュのエネルギーには狭く、ドキュメンタリーには広く。30~200msの作業ウィンドウ内に収めてください(ハードルール7)。
- 音声とビデオを独立して推論しないでください。 すべてのカットは両方のトラックで機能する必要があります。
パックされたトランスクリプト(主要な読み取りビュー)
pack_transcripts.py はすべての transcripts/*.json を読み取り、各テイクがフレーズレベルの行のリストであり、それぞれに [開始-終了] の時間範囲がプレフィックスとして付いた1つのマークダウンファイルを生成します。フレーズは、0.5秒以上の無音または話者の変更で区切られます。これは、編集者サブエージェントがカットを選択するために読み取る成果物であり、生のJSONの1/10のトークン数で、テキストのみから単語境界の精度を提供します。
例:
## C0103 (duration: 43.0s, 8 phrases)
[002.52-005.36] S0 Ninety percent of what a web agent does is completely wasted.
[006.08-006.74] S0 We fixed this.
編集者サブエージェントブリーフ(マルチテイク選択用)
タスクが「複数のクリップから各ビートの最良のテイクを選択する」である場合、以下のように形成されたブリーフを持つ専用のサブエージェントを起動します。構造は重要です;ピッチシェイプの例はそうではありません。
あなたは <タイプ> の動画を編集しています。各ビートの最良のテイクを選択し、
ソースクリップの順序ではなく、ビートごとに時系列に並べてください。
入力:
- takes_packed.md(すべてのテイクの時間注釈付きフレーズレベルトランスクリプト)
- 製品/ナラティブのコンテキスト:<ユーザーからの2文>
- 話者:<名前、役割、配信スタイルのメモ>
- 期待される構造:<アーキタイプを選択するか、発明する>
- 避けるべき言葉の滑り:<事前スキャンパスからのリスト>
- 目標の実行時間:<秒>
一般的な構造アーキタイプ(選択、適応、または発明):
- 技術発表 / デモ: フック → 問題 → 解決策 → メリット → 例 → CTA
- チュートリアル: イントロ → セットアップ → 手順 → 落とし穴 → まとめ
- インタビュー: (質問 → 回答 → フォローアップ)の繰り返し
- 旅行 / イベント: 到着 → ハイライト → 静かな瞬間 → 出発
- ドキュメンタリー: テーゼ → 証拠 → 反論 → 結論
- 音楽 / パフォーマンス: イントロ → ヴァース → コーラス → ブリッジ → アウトロ
- または独自に発明する。
ルール:
- 開始/終了時間は、トランスクリプトの単語境界に収まる必要があります。
- カット境界をパディングします(作業ウィンドウ30~200ms)。
- 最初のテイクの最初の単語の前に、および最後のテイクの最後の単語の後にパディングします。
- 自己評価:出力の各カットを確認し、ポップノイズがないこと、およびすべてのビートがカバーされていることを確認します。