ビデオエディタ
クリップのフォルダを完成された短尺動画に変換します。エージェントが編集者となり、ストーリーを決定して編集計画を作成します。スクリプトはその機械的な部分を正確に実行するため、カットはビートに合わせて決まり、誤って同じ映像が繰り返されることはなく、レターボックス表示も発生しません。
もし存在すれば、最初に LOCAL.md を読んでください。そこにはこのマシンのPython、ブランドファイル、メディアフォルダの情報が記載されています。所有者、ブランドフォント、ロゴ、デフォルトの見た目はブランドファイル(~/.video-editor/brand.json、references/brand.md 参照)に保存され、スクリプト内には決して記述しません。
トリミングや簡単なクロップのみが必要な単一クリップ、1つのクリップへのキャプション追加、公開作業は、インストール先のソーシャルスキル(XNPの場合は xnp-social)に属します。このスキルは編集を行います。そのスキルがレビュー、キャプション追加、計画、公開を担当します。
動画の種類のリストはありません
すべてのリクエストは混合型です。テンプレートに合うものを探さないでください。代わりに、依頼内容から以下の4つのことを決定します(動画の途中で性質が変わる場合はセクションごとに決定します)。
- 背骨:タイミングの原動力
- 音楽:小節や拍に合わせてカットし、ショットはエネルギーで選び、ドロップがピークになります(
lenは"2bar"、"1beat")。 - スピーチ:言葉の長さが長さを決定し、映像はフレーズの終わりで切り替わり、音楽は声の下でダッキングします(ターゲットのショットの
audio_db、長さは秒単位)。 - ストーリーまたは時系列:到着、構築、瞬間、残光。アクションや場所の変化でカットし、音楽は背景として流します。
- ハイブリッド型:セクションごとに背骨を切り替えます。6秒のシャウトアウトはスピーチ、その後ギグ映像はビートに合わせる。または、旅行ストーリーは時系列で、ギグの部分だけビートカットのモンタージュにする。
- 音楽:小節や拍に合わせてカットし、ショットはエネルギーで選び、ドロップがピークになります(
- 出力先とデザイン。どこに出力するか(Reel、Story、カルーセル、フィード、TikTok、Shorts、YouTube)と、そのスペースをどう使うか:全画面表示、デザインされた背景上のフレーム付き正方形または4:5の画像、またはショットごとに切り替え。習慣ではなく、映像と目的から選択します。9:16のクロップで台無しになるようなワイドな瞬間は、フレーム付きリール、カルーセル、または16:9のまとめ動画が適しているかもしれません。各プラットフォームが画像をどう扱い、各デザインがいつ適切かを references/formats.md で読んでください。長さは出力先と素材に従います。
- 必須要素。登場し認識可能でなければならない指名された人物、ロゴ、日付、感謝の言葉、特定の瞬間、キャプション行。依頼内容に本当に余裕がある場合のみ質問してください。
- サウンドレイヤー。音楽のみ。音楽に加えて群衆や雰囲気の音がかすかに聞こえるもの。スピーチの下に音楽があるもの。スピーチのみ。スピーチにはキャプションが付きます(以下のキャプションを参照)。
次に、"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)で行います。
- 依頼内容の確認。映像に誰が何をしているか、各人物の認識方法、イベント、目的、上記4つの決定事項を確認します。
brief.txtに書き出します。Geminiがこれを読み取ります。 - 映像のログを取る。
gemini.py log WORKDIR src/*.mp4 --context brief.txt --ratio 9:16を実行すると、クリップごとにlog/NAME.jsonが作成されます。各モーメントについて、誰がどこにいるか(クロップ用にx座標を小数で)、アクション、感情、エネルギー、音、スピーチ、品質、9:16のウィンドウに被写体が収まるか、最適なクロップ中心、使用目的(オープナー、ピーク、リアクションなど)が記録されます。1クリップあたり約1セントです。ログは手がかりです。それに基づいて構築する前に、フレーム上で顔、クロップ中心、「ベストモーメント」を確認してください。 - 確認する。
sheet.pyは1回のFFmpeg実行でラベル付きのコンタクトシートを作成します。--every 2でクリップ全体、--times、a.mp4@3 [email protected]で候補比較、--crop 9:16 --cx 0.4でフレーミングされた状態のソースを確認、--grid 10でクロップ計画用。画像は自分で確認してください。所有者に見せるよう依頼しないでください。 - 計画を立てる。
edit.json(references/edit-format.md 参照)を作成します。各ショットは異なるモーメントを指定します。各ショットに、なぜそこにあるのかのメモを追加します。 - チェックする。
validate.py edit.jsonを実行します(render.py もこれを実行し、エラーがある場合は拒否します)。エラー例:同じ映像が2回使用されている、ソースが短すぎる、未知の移動、許可なしのボックスfit、プラットフォームのUIゾーン内のテキスト、ファイルが見つからない、音楽が短すぎる。警告例:同一クリップから2秒未満の間隔のショット、似たようなショット、ビートから外れたカット、フレーム内の黒いエッジ、UIゾーン近くのロゴ。すべての警告を読み、判断してください。単に黙殺しないでください。 - ドラフトレンダリング。
render.py edit.json --out out/v1-draft.mp4 --draft(半分のサイズ、高速)を実行します。その後、sheet.py out/v1-draft.mp4 --plan edit.json --out review/v1.pngで各ショットの開始、中間、終了を表示します。フレーミング、頭の位置、テキスト配置、各ショットがメモ通りの内容かを確認します。 - フルレンダリング。
render.py edit.json --out out/v1.mp4を実行します。低速プリセットで、4Kソースの30秒で約5分かかります。render.py はその後、サイズ、長さ、音、各ショットの黒帯、黒フレーム、計画のmax_mbをチェックします。 - 批評。
gemini.py review out/v1.mp4 --context brief.txt --plan edit.json --out review/v1.json(1セント未満)を実行します。各指摘は主張として扱います。何かを変更する前に、フレームや計画と照らし合わせて確認してください。正しいテキストを「安全でない」と判断したり、正しい日付を「タイプミス」と判断したりすることがありました。実際の有用な指摘は、繰り返しのように見えるショット、重要なジェスチャーを遮る手、フレーム内の電話、グリッチのように見えるフラッシュなどでした。 - イテレーション。新しいバージョン番号を付けていきます。納品済みのファイルは決して上書きしないでください。バージョンごとに
edit.jsonを保持し(edit-v2.jsonにコピー)、どのバージョンでも再レンダリングできるようにします。 - 納品。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。