Communitygithub.com

anthonytrance/video-editor-skill

FFmpegを使って生の映像から短い動画を編集します。アフターパーティーやギグのリール、シャウトアウト、トーククリップとギグ映像のミックス、旅行やVlogのストーリーなど、あらゆるハイブリッド動画に対応。JSONの編集計画がフレーム単位のカット、16:9から9:16へのリフレーミング、移動、グレーディング、テキスト、ロゴ、音楽、声のダッキングを制御します。

video-editor-skill とは?

このスキルは、AIエージェントが生の動画クリップのフォルダを、完成された短尺動画(リール、ストーリー、TikTok、Shortsなど)に自動編集するためのツールです。エージェント自身が編集者となり、ストーリーを決定してJSON形式の編集計画(edit.json)を作成し、スクリプトが機械的な編集(カット、リフレーミング、グレーディング、テキスト挿入、音楽と声のバランス調整など)をFFmpeg経由で正確に実行します。主な特徴として、Gemini APIを活用した映像のログ記録とレンダリング結果の批評、同一映像の重複使用やレターボックス表示の防止、各プラットフォーム(Reel、Story、YouTubeなど)に最適化されたフォーマット設計が可能です。ユーザーは「この映像からリールを作って」といった漠然とした指示を出すだけで、エージェントが映像を分析し、最適な編集計画を立案・実行します。本スキルは編集工程に特化しており、キャプションの追加や公開は別のソーシャルスキルが担当します。

対応~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/anthonytrance/video-editor-skill/tree/HEAD

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

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

ドキュメント

ビデオエディタ

クリップのフォルダを完成された短尺動画に変換します。エージェントが編集者となり、ストーリーを決定して編集計画を作成します。スクリプトはその機械的な部分を正確に実行するため、カットはビートに合わせて決まり、誤って同じ映像が繰り返されることはなく、レターボックス表示も発生しません。

もし存在すれば、最初に LOCAL.md を読んでください。そこにはこのマシンのPython、ブランドファイル、メディアフォルダの情報が記載されています。所有者、ブランドフォント、ロゴ、デフォルトの見た目はブランドファイル(~/.video-editor/brand.json、references/brand.md 参照)に保存され、スクリプト内には決して記述しません。

トリミングや簡単なクロップのみが必要な単一クリップ、1つのクリップへのキャプション追加、公開作業は、インストール先のソーシャルスキル(XNPの場合は xnp-social)に属します。このスキルは編集を行います。そのスキルがレビュー、キャプション追加、計画、公開を担当します。

動画の種類のリストはありません

すべてのリクエストは混合型です。テンプレートに合うものを探さないでください。代わりに、依頼内容から以下の4つのことを決定します(動画の途中で性質が変わる場合はセクションごとに決定します)。

  1. 背骨:タイミングの原動力
    • 音楽:小節や拍に合わせてカットし、ショットはエネルギーで選び、ドロップがピークになります(len は "2bar"、"1beat")。
    • スピーチ:言葉の長さが長さを決定し、映像はフレーズの終わりで切り替わり、音楽は声の下でダッキングします(ターゲットのショットの audio_db、長さは秒単位)。
    • ストーリーまたは時系列:到着、構築、瞬間、残光。アクションや場所の変化でカットし、音楽は背景として流します。
    • ハイブリッド型:セクションごとに背骨を切り替えます。6秒のシャウトアウトはスピーチ、その後ギグ映像はビートに合わせる。または、旅行ストーリーは時系列で、ギグの部分だけビートカットのモンタージュにする。
  2. 出力先とデザイン。どこに出力するか(Reel、Story、カルーセル、フィード、TikTok、Shorts、YouTube)と、そのスペースをどう使うか:全画面表示、デザインされた背景上のフレーム付き正方形または4:5の画像、またはショットごとに切り替え。習慣ではなく、映像と目的から選択します。9:16のクロップで台無しになるようなワイドな瞬間は、フレーム付きリール、カルーセル、または16:9のまとめ動画が適しているかもしれません。各プラットフォームが画像をどう扱い、各デザインがいつ適切かを references/formats.md で読んでください。長さは出力先と素材に従います。
  3. 必須要素。登場し認識可能でなければならない指名された人物、ロゴ、日付、感謝の言葉、特定の瞬間、キャプション行。依頼内容に本当に余裕がある場合のみ質問してください。
  4. サウンドレイヤー。音楽のみ。音楽に加えて群衆や雰囲気の音がかすかに聞こえるもの。スピーチの下に音楽があるもの。スピーチのみ。スピーチにはキャプションが付きます(以下のキャプションを参照)。

次に、"destination" を設定して計画を記述します。これにより、キャンバス、セーフエリア、長さの制限が決まります。references/examples.md は4つの依頼例(アフターパーティーリール、シャウトアウト、シャウトアウトからギグ映像への移行、旅行ストーリー)を、コピーするタイプとしてではなく、推論として示しています。references/craft.md には、これらすべてに適用される編集ルールがあります。

ワークフロー

スクリプトは scripts/ にあります。LOCAL.md のPython、PYTHONUTF8=1 PYTHONIOENCODING=utf-8、FFmpeg と ffprobe が PATH に含まれていることを確認して実行してください。作業はスキル外のプロジェクトフォルダ(src/、audio/、log/、proxy/、out/、review/、edit.json)で行います。

  1. 依頼内容の確認。映像に誰が何をしているか、各人物の認識方法、イベント、目的、上記4つの決定事項を確認します。brief.txt に書き出します。Geminiがこれを読み取ります。
  2. 映像のログを取る。gemini.py log WORKDIR src/*.mp4 --context brief.txt --ratio 9:16 を実行すると、クリップごとに log/NAME.json が作成されます。各モーメントについて、誰がどこにいるか(クロップ用にx座標を小数で)、アクション、感情、エネルギー、音、スピーチ、品質、9:16のウィンドウに被写体が収まるか、最適なクロップ中心、使用目的(オープナー、ピーク、リアクションなど)が記録されます。1クリップあたり約1セントです。ログは手がかりです。それに基づいて構築する前に、フレーム上で顔、クロップ中心、「ベストモーメント」を確認してください。
  3. 確認する。sheet.py は1回のFFmpeg実行でラベル付きのコンタクトシートを作成します。--every 2 でクリップ全体、--times、a.mp4@3 [email protected] で候補比較、--crop 9:16 --cx 0.4 でフレーミングされた状態のソースを確認、--grid 10 でクロップ計画用。画像は自分で確認してください。所有者に見せるよう依頼しないでください。
  4. 計画を立てる。edit.json(references/edit-format.md 参照)を作成します。各ショットは異なるモーメントを指定します。各ショットに、なぜそこにあるのかのメモを追加します。
  5. チェックする。validate.py edit.json を実行します(render.py もこれを実行し、エラーがある場合は拒否します)。エラー例:同じ映像が2回使用されている、ソースが短すぎる、未知の移動、許可なしのボックス fit、プラットフォームのUIゾーン内のテキスト、ファイルが見つからない、音楽が短すぎる。警告例:同一クリップから2秒未満の間隔のショット、似たようなショット、ビートから外れたカット、フレーム内の黒いエッジ、UIゾーン近くのロゴ。すべての警告を読み、判断してください。単に黙殺しないでください。
  6. ドラフトレンダリング。render.py edit.json --out out/v1-draft.mp4 --draft(半分のサイズ、高速)を実行します。その後、sheet.py out/v1-draft.mp4 --plan edit.json --out review/v1.png で各ショットの開始、中間、終了を表示します。フレーミング、頭の位置、テキスト配置、各ショットがメモ通りの内容かを確認します。
  7. フルレンダリング。render.py edit.json --out out/v1.mp4 を実行します。低速プリセットで、4Kソースの30秒で約5分かかります。render.py はその後、サイズ、長さ、音、各ショットの黒帯、黒フレーム、計画の max_mb をチェックします。
  8. 批評。gemini.py review out/v1.mp4 --context brief.txt --plan edit.json --out review/v1.json(1セント未満)を実行します。各指摘は主張として扱います。何かを変更する前に、フレームや計画と照らし合わせて確認してください。正しいテキストを「安全でない」と判断したり、正しい日付を「タイプミス」と判断したりすることがありました。実際の有用な指摘は、繰り返しのように見えるショット、重要なジェスチャーを遮る手、フレーム内の電話、グリッチのように見えるフラッシュなどでした。
  9. イテレーション。新しいバージョン番号を付けていきます。納品済みのファイルは決して上書きしないでください。バージョンごとに edit.json を保持し(edit-v2.json にコピー)、どのバージョンでも再レンダリングできるようにします。
  10. 納品。LOCAL.md の指示に従い、編集内容を言葉で説明し(ショットごと、テキストの内容、音楽のピーク箇所)、ソーシャルスキルにファイルを渡してレビュー、キャプション追加、公開を依頼します。公開には常に所有者の明示的な承認が必要です。

キャプション

スピーチキャプションはソーシャルスキルの仕事です。最初に編集をレンダリングし、次にそのキャプションヘルパー(XNPの場合は xnp-social/scripts/captions.py transcribe)を完成したレンダリングに対して実行し(これによりワードタイムが編集と一致します)、その必須の承認ステップを経てからバーンインします。最終的なタイムラインに対して承認済みの .srt または .ass がすでに存在する場合、計画の captions.file がレンダリング中にそれをバーンインします。

正直な限界

類似ショットチェックは、画像ハッシュと平均色に基づいています。同じモーメントが2回使用されることは検出しますが、異なるモーメントでの「同じ角度からの同じ人物」は検出しません。その意味的なチェックは、Geminiのログとレビュー、そしてコンタクトシートの読み取りから得られます。自動ビート検出はありません。BPMとダウンビート上の開始点(music.start)を指定すると、グリッドは正確になります。顔追跡はありません。パンとクロップ中心はログとシートから取得します。Geminiのタイムコードは長いクリップでずれる可能性があります。プロキシにはバーンインされたタイムコードが含まれており、正確性を保ちます。log は、モーメントがクリップの長さを超えた場合に警告します。

ファイル

scripts/common.py 計画ローダー、タイミング計算、プローブ、ブランド、グレード。scripts/render.py ワンパスレンダラー。scripts/validate.py チェッカー。scripts/sheet.py コンタクトシート。scripts/gemini.py ログ記録とレビュー。参照: formats.md、edit-format.md、craft.md、examples.md、brand.md。

関連スキル