overlays について
レンダリング済み動画の指定したビジュアル要素を変更し、承認済みの他の部分を維持する編集スキルです。ビジュアル計画を更新して静止画と出力を確認し、変更区間だけを再レンダリングしてレビューに回します。
主な機能
- 01時刻や内容によるビート特定
- 02ビジュアルの移動・拡大縮小・交換・削除
- 03新しいビジュアルビートの追加
- 04静止画と出力の確認
- 05変更区間のみのパッチレンダリング
活用シーン
- 01ロゴを字幕から離して配置
- 02指定箇所のビジュアルを差し替え
- 03追加したアニメーションや図の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ nextwork-projects/ ai-video-editor-cooked --skill overlaysインストール後、Claude Code で/overlaysを入力して読み込まれたか確認します。
同梱ファイルreferences/changes.md
詳細
オーバーレイ
パス:${CLAUDE_SKILL_DIR} はこの SKILL.md が含まれるフォルダー、${CLAUDE_PLUGIN_ROOT} はその 2 階層上にあるプラグインフォルダーを指します。
まず ${CLAUDE_PLUGIN_ROOT}/PRINCIPLES.md を読んでください。実在するものが各ビートを担い、AI らしい見た目にしないこと。多様さより滑らかさを優先し、各要素は話された言葉にぴったり合わせ、顔とセーフゾーンを決して覆わないこと。
ユーザーへの質問はすべて質問ボックスで行います。AskUserQuestion ツールを呼び出してください(選択肢は 2~4 個とし、推奨するものを最初にします)。そのツールがないエージェントに限り、テキストで番号付きの質問をします。
style-edit がすでにレンダリングした編集フォルダーです。同じ編集を、指定されたビートだけ変更して出力します。変更した箇所は再計画、確認、再レンダリングを行います。それ以外は、ユーザーが承認した状態から一切変更しません。このスキルはレンダラーのコードを書き換えません。変更するのは visuals.json と images.json で、残りは style-edit のスクリプトと Remotion のテンプレートが処理します。ある場面の新しいカードでは、まずユーザーが追加したものを使います(edits/<name>/assets.json:assets/ 内の画像、または site で指定したリンク。style-edit のステップ 1 と同じです)。その後に何かを探します。
Mac と Linux では python3、Windows では py でスクリプトを実行します。パスはライブラリからの相対パスです(PRINCIPLES.md の「Where」を参照)。S="${CLAUDE_PLUGIN_ROOT}/skills/style-edit/scripts"、
VPY="${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/run.py"。python3 "$VPY" は仮想環境の Python です。
edits/<name>/plan.json + render.mp4 (+ render.plan.json, the plan it was made from)
visuals.json / images.json -> plan.py -> stills-at/sheet.png -> edit.py patch -> check.py render -> review page
references/changes.md には、あらゆる変更の種類と正確なコマンド、図解の手順、確認に失敗した場合の対応が記載されています。各ステップで指定されたセクションを読んでください。
0. 好みと編集内容を確認する
python3 "${CLAUDE_PLUGIN_ROOT}/skills/taste/scripts/taste.py" show --edit edits/<name>
python3 "$S/plan.py" cards edits/<name>
cards はカードごとに 1 行を出力します。card:N、時間、種類、単語、ボックス、レイヤー、および元になった visuals.json または images.json のビートが表示されます。card:N はレビュー画面の [card N ...] に対応します。スチル一覧シートの「card N」は card:N-1 に対応します。plan.json 自体は決して読まないでください。
- render.mp4 または plan.json がない場合: 初回の処理です。style-edit を使ってください。
- メモがカットについてのものの場合(単語が途中で切れている、一時停止など):カットスキルを使います。すべての動画に関する字幕のサイズ、フォント、色についてのものの場合: まず好みのスキルを使い、その後 style-edit を使います。
- すべての動画に適用する好みについてのメモの場合(「ロゴは常に小さめに」「全画面の図解はなし」など):ここで修正し、好みのスキルでもルールを保存します。
1. ビートを特定する
ユーザーの言葉をカードに照らし合わせます。時間(「0:15 のところ」)、単語(「Duolingo のもの」)、レビューのメモ([card 1 logo 'Duolingo'])などを使います。明確に一致するものが 1 つなら続行します。2 つ以上、または一致するものがない場合は、質問ボックスで尋ねます。候補カードごとに 1 つの選択肢を提示し(時間、種類、単語を含めます)、最も近いものを推奨します。
ユーザーが指定したビートだけを変更します。途中で別のカードを選び直したり、移動したり、スタイルを変更したりしてはいけません。「カードを減らして」とだけ指定され、対象の名前がない場合は、登場頻度が最も低いカード(ちらっと映るロゴ、同じ画像の 2 回目の登場など)を列挙し、削除するものを尋ねます。最も弱いカードを推奨します。
2. 変更する
1つのビートにつき1つのコマンドを実行します。ビートは、card:N、時刻(0:15、15.4s、その時点で表示されているカード、または1.5秒以内に始まるカード)、もしくは単語(Duolingo、2回目に発話された場合はDuolingo@2)で指定します。
python3 "$S/plan.py" beat edits/<name> card:1 'box=[40,17,20,11]' # move or resize (x, y, w, h in % of the frame)
python3 "$S/plan.py" beat edits/<name> 0:20 brand=Notion domain=notion.so # swap the logo
python3 "$S/plan.py" beat edits/<name> YouTube@1 --drop # fewer cards
python3 "$S/plan.py" beat edits/<name> --add edits/<name>/visuals.fill-1.json # new beats, in spoken order
値はJSON(またはプレーンテキスト)です。props.label=xはビート内に設定し、key=nullはキーを削除します。キャプチャのビートはvisuals.jsonとimages.jsonの両方にあります。beatを変更すると、両方が変更されます。各リクエスト(移動、大きくする、顔から離す、字幕から離す、実際のページにする、スクリーンショットをアニメーション化する、滑らかにする、遅れて表示する)の内容については、references/changes.mdの「Requests」を参照してください。
新しいビジュアル(アニメーション、図、実際のページ)の場合:style-editの${CLAUDE_PLUGIN_ROOT}/skills/style-edit/references/motion-design.md(デフォルトの見た目と動き:静止画のキャプチャより作成したアニメーションを優先し、バンド内に大きく表示し、ページごとにキャプチャを1つにする)を読みます。そのうえで、発話内容に基づいて形式を選びます。選択の順序はstyle-editの${CLAUDE_PLUGIN_ROOT}/skills/style-edit/references/shapes.mdに従います(ユーザー自身の素材、実物をキャプチャしたもの、実物のパーツから再構築したUI、実際のロゴ)。図は、発話で言及された実際のロゴやキャプチャを使ったflowにし、各パーツを発話された単語に合わせて点灯させ、頭の横または上にオーバーレイとして表示します。話者は画面に残します(references/changes.mdの「A diagram」)。テキストパネル、文字だけのカード、ストックアイコン、またはユーザーが求めていない全画面のシーンは使用しません。新しいビートが複数ある場合は、処理を分担します。ビートごとにtemplate-fillerエージェントを1つ割り当て、全員に1つのメッセージで指示します。各エージェントには、編集フォルダー、そのビートの文、選択した形式、表示タイミングとなる単語、style-editのreferences/shapes.mdの完全なパス、および個別の出力ファイルedits/<name>/visuals.fill-<n>.jsonを渡します。その後、すべてのファイルを指定して1回のbeat --addを実行します。新しいビートが1つだけの場合は、自分で作成します。
3. 取得してから、再度計画する
node "$S/capture.mjs" edits/<name> # only when a beat needs a new capture, logo or post; keeps files already fetched
python3 "$S/plan.py" edits/<name>/style.json edits/<name>/captions.json [--aspect ...] [--layout ...]
編集の直近の計画時と同じフラグを指定して計画します(2つ目のシェイプでは同じ--outを指定し、その後の各コマンドでは--plan plan-16x9.jsonを指定します)。plan.pyは決定的です。変更していないビートは同じ結果になります。plan.jsonを上書きする前に、レンダリング済みの計画をrender.plan.jsonとして保持します。自分のビートに関する警告をすべて読みます。プロファイルのbehindが有効で、背面カードを移動または追加した場合は、python3 "$VPY" "$S/matte.py" edits/<name>を実行します(新しいフレームのみを切り出します。カードが数秒より多い場合は、まず--estimateを指定して所要時間を確認します)。
python3 "$S/check.py" plan edits/<name>
自分のビートに関するFAILをすべて修正してから、再度計画します。
4. その瞬間だけの静止画
python3 "$S/edit.py" stills edits/<name> --at 15.4 --at 12.9-15.3
時刻を指定すると静止画が1枚、範囲を指定すると5枚(登場、定着、中間、後半、退出)が生成されます。これらのフレームで動くカードを評価します。変更したカードごとに、plan.py cardsで確認できる範囲と、そのカードの直前と直後の瞬間を指定します。stills-at/とstills-at/sheet.pngに出力され、各タイルには時刻と表示中のカードがラベル付けされます。シートを確認し、stills-criticエージェントにも渡して、そのブラインド評価のreads_asと、ビートで表示すべき内容を比較します。先に進む前に修正します。カードが顔に重なっている、字幕やアプリのボタンの下に隠れている、スマートフォンでは文字が小さすぎる、ページの間違った部分が表示されている、AIらしい見た目になっている、話者がフレームから消えている(誰も求めていない全画面のシーン)といった問題を解消します。
- 修正(移動、サイズ変更、差し替え、削除)の場合は、ステップ5に進みます。
- 新しいビジュアル(アニメーション、図、新しいページ)の場合は、シートを表示し、質問ボックスで次の選択肢を提示します: レンダリングする(推奨)/変更する。回答を受け取る前にレンダリングしないでください。
5. 差分レンダリング
python3 "$S/edit.py" patch edits/<name>
plan.jsonとrender.plan.jsonを比較し、変更された範囲のみをノートパソコン上で再レンダリングします(退出とサウンドの余韻のため、各範囲を0.5秒延長します)。その後、サンプル単位でサウンドをカットして、render.mp4に結合します。範囲とフレーム数が表示されます。動画の大部分が変更されている場合は全体をレンダリングします。また、変更が局所的でない場合(サイズ、見た目、動きの特性、字幕スタイル)は処理を停止します。その場合は、style-editのステップ6に従ってレンダリング先を尋ね、ステップ7に従ってレンダリングします。--range 13-15.5を指定すると、手動で範囲を再レンダリングできます(render.plan.jsonがない古いレンダリングの場合)。
6. レンダリングを確認する
python3 "$VPY" "$S/check.py" render edits/<name>
変更した箇所で FAIL になったら、ステップ 2 または 3 に戻ってください。修正は最大 2 回までです。その後、まだ一覧に残っている内容とともに引き継ぎます。変更した箇所から離れた箇所の FAIL は、変更前からあったものです。そう伝え、ここでは追いかけないでください。各 FAIL の意味については、style-edit references/plan.md「What the checks FAIL and WARN」を参照してください。
7. レビューページで引き継ぐ
R="${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/review.py"
python3 "$R" edits/<name> resolve <note> fixed --reply "moved the Duolingo logo above the caption" --new-t 15.4
python3 "$R" edits/<name> round --stage edit --video edits/<name>/render.mp4 --plan edits/<name>/plan.json
まだページがない場合は、同じフラグを指定して start してください。その後、バックグラウンドで serve と wait を実行します(style-edit references/review.md)。変更内容と場所を、ユーザーに 1 行で伝えてください。カードについての新しいメモはここに戻し、カットについてのメモはカットスキルに送ってください。
スクリプトが停止した場合
| メッセージ | 対応 |
|---|---|
no beat matches ... | plan.py cards を実行し、card:N でカードを選びます |
no render.plan.json ...(edit.py patch) | 変更したカードを含む --range A-B を指定するか、全体をレンダリングします |
the change is not local (<key> changed) | 全体をレンダリングします。style-edit のステップ 6 と 7 を参照してください |
the plan is WxH, N frames; render.mp4 is ... | カットまたは形状が変わっています。全体をレンダリングします |
warning: '<word>' ... never said | そのビートの word/nth は、captions.json にある表記と一致させる必要があります |
capture.mjs failed <kind> '<word>' | 別の URL を使うか、代わりにロゴを使います |
check.py plan found a FAIL(静止画) | 自分のビートの FAIL を修正し、再度プランを作成します |
... missing (run matte.py) | matte.py を実行してから、静止画またはパッチを再度実行します |
ファイル
references/changes.md:各リクエストのビート変更、図のレシピ、失敗したチェック。- style-edit の
scripts/:plan.py cards|beat(1 つのビートを検索・変更)、edit.py stills --at(各場面の静止画)、edit.py patch(変更箇所を再レンダリング)、capture.mjs、matte.py、check.py。 ${CLAUDE_PLUGIN_ROOT}/agents/template-filler.md(俳句、新しいビートごとに 1 つ)、stills-critic.md(sonnet)、render-watcher.md(時間のかかる全体レンダリング)。