style-edit について
承認済みの動画カットを、字幕、台詞に合わせた映像、モーションを含む編集に仕上げる Claude スキルです。クリエイターのスタイルと提供素材を使い、納品前に静止画とレンダリングを確認します。
主な機能
- 01カットからタイミング付き字幕を作成
- 02台詞に合わせて映像を計画
- 03クリエイターのスタイルと素材を適用
- 04静止画の確認とレンダリング検証
- 05ローカルまたは設定済み環境でレンダリング
活用シーン
- 01承認済み動画カットのスタイル編集
- 02字幕と映像を台詞に同期
- 03クリエイタープロファイルに沿った編集
- 04完成動画のレンダリングと確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ nextwork-projects/ ai-video-editor-cooked --skill style-editインストール後、Claude Code で/style-editを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/ai-tells.mdcontracts.mdmotion-design.mdmotion.mdplan.mdrender.mdreview.mdshapes.mdvisuals.mdscripts/ai_tells.pycapture.mjschapters.pycheck.pyedit.pyexport_nle.pyface.pymatte.pymodal_render.pyplan.pypreview.pyquality.pyroute.pysfx.pysheet.pysource.pystyle_check.py詳細
スタイル編集
パス:${CLAUDE_SKILL_DIR} はこの SKILL.md を含むフォルダーを、${CLAUDE_PLUGIN_ROOT} はその 2 階層上にあるプラグインフォルダーを指します。
まず ${CLAUDE_PLUGIN_ROOT}/PRINCIPLES.md を読みます。これはすべての動画に適用されるルール(場所、質問、リアルさ、動き、ストーリー、プライバシー、コスト)です。
質問はすべて質問ボックスに入力します。AskUserQuestion ツールを使い、2~4 個の選択肢を提示して、推奨する選択肢を最初にします。このツールを使えないエージェントでのみ、テキストで番号付きの質問をします。回答に Attached images: <paths> とある場合は、それぞれを最初に読み込みます。
承認済みのカットとクリエイターのスタイルを使用します(skill= ジョブではそのスキルを実行し、ステップ 3 から始めます)。
完成した動画を出力します。字幕、ズーム、実際のキャプチャ、モーションシーンを言葉に合わせてタイミング調整し、クリエイターの見た目とユーザーのブランドに合わせます。ユーザーはレビュー画面で静止画を承認し(ステップ 5)、レンダリングを選びます(ステップ 6)。
パスはライブラリ(PRINCIPLES.md)からの相対パスです。Mac と Linux ではスクリプトを python3 で、Windows では py で実行します。S="${CLAUDE_SKILL_DIR}/scripts"、
VPY="${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/run.py" です。python3 "$VPY" は仮想環境の Python です。
edits/<name>/cut.mp4 + cut.transcript.json + words.json (cut)
edits/<name>/style.json (start: the profile's creators blended)
or creator-teardowns/<handle>/style.json (one creator, from creator-teardown)
~/.ai-video-editor/profile.json (start: brand kit, names, assets, avoid, sound)
captions.json -> beats.json -> visuals.json -> images/ + images.json -> plan.json -> stills/sheet.png -> render.mp4
参照資料は、ステップで指示された場合にのみ読みます。references/visuals.md(各形式の詳細)、references/plan.md(plan.py、切り抜き、音声、音楽、チェック)、references/motion.md(テンプレート、トランジション、マーク)、references/render.md(出力先、ライブプレビュー、エクスポート)、references/review.md(レビュー画面)、references/ai-tells.md(禁止されている AI の見た目)。references/contracts.md は人間向けです。絶対に読まないでください。
0. 好みとプロフィールを確認する
python3 "${CLAUDE_PLUGIN_ROOT}/skills/taste/scripts/taste.py" show --edit edits/<name>
python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/profile.py" show
すべての好みのルールに従います。スクリプトが設定を読み込みます。ユーザーが結果に反応したとき(「遅すぎる」「字幕が小さすぎる」など)は、編集をやり直す前に taste スキルで記録します。
1. 入力を確認する
- cut.mp4 がない場合: raw take のスタイル編集はせず、先に cut スキルを実行します。
prep-decisions.jsonがある場合:visual-prepエージェントがステップ 1~3 とシートを完了しています。references/plan.mdの「カットのレビュー中に準備済み」を参照してください。 - style.json がない場合:
python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/profile.py" style edits/<name>を実行します。プロフィールにクリエイターがいない場合(またはプロフィールがない場合)は、デフォルトのスタイルを書き込みます。5 秒ごと以上に滑らかなズーム動作を入れ、字幕は 3 語にします(references/plan.mdの「クリエイターなし」を参照)。no creator style.json foundで停止した場合は、プロフィールに登録されたクリエイターについて creator-teardown の quick mode を実行し、その後もう一度実行します。plan.py も style.json がない場合はデフォルトのスタイルで計画し、その旨を表示します。 - ユーザーの画像: プロフィールの
assets_dir内でセリフに合うものすべてと、ユーザーから渡されたものをedits/<name>/images/とimages.jsonに入れます。[{"src": "images/dashboard.png", "word": "dashboard", "nth": 1}](layout、hold_s、entranceは任意です。透過 PNG と Lottie.jsonが使えます)。 - ユーザーがページで追加したもの(
assets.json、review.pywaitのassets:行):検索する前に、agents/visual-prep.mdのステップ 2 に従い、それぞれのsayの語句に合わせてすべて入れます。まだ images.json または visuals.json にないものは、新規のものです。
2. 字幕テキスト
python3 "${CLAUDE_PLUGIN_ROOT}/skills/cut/scripts/retakes.py" captions edits/<name>
captions.json と captions.txt を作成します。完成したカットで聞こえる語句(検証ステップの cut.transcript.json)をカットに合わせてタイミング調整します。パスの各段階で聞き取りが異なっていた語句(「Jev」ではなく「Jeff」など)は、承認済みカットのテキストどおりに表記し、名前はプロフィールの names に従って表記し、以前の retakes.py fix をすべて適用します。変更した語句はそれぞれ表示されます。どちらの JSON も読まず、字幕の元になる captions.txt を校正します。まだ間違っている語句は、次のコマンド 1 つで修正できます。タイミングは変更せず、captions.json をその場で修正し、後続の字幕生成すべてに適用されるよう fixes.json に保持します。
python3 "${CLAUDE_PLUGIN_ROOT}/skills/cut/scripts/retakes.py" fix edits/<name> cloud=Claude jiv=Jev
ここからは captions.json を使います。
3. ビジュアル
まず references/shapes.md と references/motion-design.md を読んでください:各ピックの形状と plan.py のルールを確認し、次にデフォルトの見た目と動きを確認します(キャプチャより作成したアニメーションを優先し、バンド内では大きく表示し、1ページにつきキャプチャは1つ)。
- 提案:
python3 "$S/route.py" beats edits/<name>で captions.json を文に分割し、名前の挙がったもの(プロフィール、ロゴパック)を beats.json にマークします。各文に対して、ルート(none、capture:shot|browser|sticker、post、logo、logo_cluster、chat、terminal、toasts、side_by_side、video_card)を自分で1つ選びます。 - 実物を優先:
visuals.json(references/shapes.md)を作成します。名前の挙がった製品やドキュメントはcapture(テキストで見つけた箇所をmarksに指定)、引用された投稿はpost、アプリはapp、動画はyoutube、リポジトリはgithub、ついでに言及されたブランドはlogo、専門家の言葉はクリップにします(references/visuals.mdの「Sourced proof」)。 - オーバーレイを埋める: オーバーレイのピックについては、プロパティのみを記述します(
references/shapes.md)。利用可能ならreferences/shapes.mdのフルパスを添えてtemplate-fillerエージェント(haiku)に渡し、そうでなければ自分で記述します。話者が実際に言った言葉と数字だけを使います。タイプカードはありません。 - 取得:
node "$S/capture.mjs" edits/<name>でキャプチャ、ロゴ、投稿をimages/に取得し、マークの位置を測定します。 - モーション: 動きのあるテンプレートのビートは、オリジナルのクリップにします(motion skill)。クリップの作成に失敗した場合は、カードを残します。
ペース配分:コピー元クリエイターのペースを優先します。route.py は、1分あたりのカード数、種類、フレーム内の配置を表示し、その数だけの文に want を付けます(名前が挙がったものを優先)。それぞれに、その人と同じ種類のカードを、その人と同じ位置に box を置いて作成します。頭にかからないようにしてください。ユーザー本人の写真を使い、なければ、その文の対象となる実物(ページ、プロフィール、投稿)のキャプチャを使い、さらにそれもなければ、ユーザー本人のクリップを video_card として使います。作り物やストック画像は使いません。実物がない want は空のままにします。何を表示するかユーザーに尋ねず、実際のキャプチャを選びます(ユーザー自身の製品も同様です)。クリエイターがいない場合、実物の名前が挙がった文にのみカードを表示します。同時に2つ表示することはありません。card_gap_s を超えてカードがない状態を続けないでください(plan.py はその箇所にズームを追加します。references/plan.md の「Pacing」を参照)。縦向きのキャプチャには、スマートフォンで読めるよう find が必要です。カードの編集については shapes.md を参照してください。
4. プラン
まず話者の頭の位置を特定し、顔にボックスが重ならないようにしてから、手順1の style.json を使ってプランを作成します。
python3 "$VPY" "$S/face.py" edits/<name>
python3 "$S/plan.py" edits/<name>/style.json edits/<name>/captions.json [--aspect 9:16|16:9] [--layout overlay|split|letterbox]
edits/<name>/plan.json を書き出します。警告をすべて読みます。最後に style check(style_check.py)が実行されます。各 style: 行には、プランがクリエイターと異なる点が示されます。それぞれ修正し(style.json、visuals.json、images.json)、静止画を作る前にもう一度プランを作成してください。ユーザーが変更した内容が、すでに目標となっています。
- 音楽: ユーザーが指定していない限り、スタイルに合わせます(
references/plan.mdの「Music」を参照。plan.py がクリエイターの音楽を自動で配置します)。その後、plan.py をもう一度実行します。効果音の合図は不要です。plan.py が追加します。 - 話者の背後: プロフィールに
"behind": trueとある場合は、最後の plan.py 実行後にmatte.pyを実行し、その後さらに plan.py を実行した場合も再度実行します(新しいフレームのみを切り抜きます)。最初に--estimateを実行してください(references/plan.mdを参照)。 - プランを確認:
python3 "$S/check.py" plan edits/<name> [--plan plan.json] [--style edits/<name>/style.json]
FAIL をすべて修正し、もう一度プランを作成します。FAIL の内容については references/plan.md を参照してください。
5. 静止画を自分で確認してから、そのままレンダリングへ
ユーザーはカットを承認済みです。その承認は、編集を作成するという意味です。静止画をレビュー用ページに載せたり、2回目の承認を待ったりしないでください(Max、2026-10-15:ユーザーはフレームの手順を好みませんでした)。
python3 "$S/edit.py" stills edits/<name>
初回実行時にレンダラーがインストールされます(数分かかりますが、1回限りです。最初にその旨を伝えてください)。ビートごとに静止画を1枚ずつ作成し、stills/sheet.png に出力します(ビート、時刻、カードの種類をラベル表示)。シートを自分で確認し、拡大する場合にのみ個別の静止画を開いてください。レンダリング前に修正してください。ボックスが顔に重なっている、ズームで頭が切れている、キャプチャの箇所が違う、スマートフォンで読むにはテキストが小さすぎる、デフォルトの AI 風の見た目になっている、といった点を確認します。stills-critic で確認できます。その後、手順6に進んでレンダリングしてください。ユーザーのメモは、レンダリングされた編集に反映されます。カードを手動で動かすのは、ユーザーが頼んだ場合のみです。references/render.md の「The live preview」を参照してください。
6. レンダリング先
python3 "$S/edit.py" estimate edits/<name>
Laptop:、Modal:、この動画の所要時間とコストを示す2行のOther:(GitHub Actions、Lambda)を出力し、その後にRecommended:を表示します。Modalが接続済みで、動画が1分を超え、Modalのほうが速い場合はModalを推奨し、それ以外はラップトップを推奨します。プロファイルでrenderが設定されている場合、またはRecommended: Laptopの場合は、質問せずにそこでレンダリングし、所要時間を1行で伝えます(「ラップトップでレンダリングしています。約14秒です。変更するには『Modalでレンダリング』と言ってください」)。未設定でRecommended: Modalの場合は1回だけ質問し、表示されている番号のとおりに3つの選択肢を提示して、Modalに(推奨)と付けます。その後、profile.py set render='"laptop|modal|github|lambda"'を実行します。
- Laptop:所要時間、無料。
- Modal:所要時間と料金(月30ドル分の無料クレジット)。未接続の場合はModalに接続と表示します。この選択肢が選ばれたら、バックグラウンドで
setup.py modal-connect(セットアップスキルのModalの手順)を実行してから、Modalでレンダリングします。 - その他:GitHub Actions または AWS Lambda:説明にある2つの
Other:行を使います。この選択肢が選ばれたら、2つの選択肢を示して2つ目の質問をします。GitHub Actions:無料ですが、ghでログインする必要があります。映像素材はユーザーのアカウント内の非公開リポジトリにアップロードされます。リポジトリを作成する前に確認してください。Lambda:ユーザー自身のAWSアカウントを使用します。プロファイルにcloud_cleanupが設定されていない場合は、「レンダリング後にアップロードした映像素材を<GitHub|AWS>から削除しますか?」と1回だけ尋ね(はい(推奨)/いいえ、残しておく)、その後profile.py set cloud_cleanup=true|falseを実行します。
Modalが選択されたものの未接続の場合は、まず(上記のとおり)setup.py modal-connectを実行します。Lambdaが選択され、aws sts get-caller-identityが失敗した場合は、まずセットアップスキルのLambdaの項目を実行します。
7. レンダリングして確認
python3 "$S/edit.py" render edits/<name> # laptop
python3 "$S/edit.py" render edits/<name> --modal # Modal
python3 "$S/edit.py" render edits/<name> --lambda # AWS Lambda
python3 "$S/edit.py" render edits/<name> --draft # laptop, 2/3 size, quick look: render-draft.mp4
--draft以外はすべてedits/<name>/render.mp4に書き出します。GitHub Actions(--githubの後にgithub-pushとgithub-fetchを実行)および各レンダリング先の詳細は、references/render.mdを参照してください。その後、ユーザーに見せる前に、次を実行します。
python3 "$VPY" "$S/check.py" render edits/<name> [--plan plan.json] [--style edits/<name>/style.json]
FAILがあればプランまたはカットに戻します。修正は最大2回まで行い、その後、まだ一覧に残っている項目を伝えたうえでレンダリング結果を提示します。字幕のコントラストがFAILの場合は、再度プランを作成してからレンダリングします(plan.pyはチェック結果を読み込み、該当ページを順番に処理します)。すべての項目については、references/plan.mdを参照してください。
loudness ... LUFSまたはテイク自体のtrue peakのWARNは、テイクの音量レベルを示すものであり、編集の不具合ではありません。プロファイルにloudnessが設定されている場合は、質問せずにその設定に従います。未設定の場合は1回だけ質問し、その後profile.py set loudness='"leave|normalize"'を実行します。
動画の音量が、一般的なリールより小さくなっています。InstagramやTikTokで想定される音量に上げますか?(現在の音量が一般的なリールより大きい場合:「動画の音量が、一般的なリールより大きくなっています。想定される音量まで下げますか?」)詳細: LUFS。各アプリは音声を約-14で再生します。
- 音声をそのままにする(推奨)。 何も変更しません。
- アプリで想定される音量にする(または音量を下げる)。音量を1回だけ変更し、ピークが-1 dBを超えないようにします。
数値は詳細行だけに表示します。チェックの出力(FAIL、WARN、「2フレーム不足」)はユーザーに見せません。
2つ目の回答でのみ、python3 "$S/quality.py" normalize edits/<name>/render.mp4を実行します。隣にrender-normalized.mp4が書き出されるので、そのファイルを渡します。
8. 引き渡し
レビュー用ページ(references/review.md)で引き渡します。serveとwaitをバックグラウンドで実行します。
python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/review.py" edits/<name> round --stage edit --video edits/<name>/render.mp4
(ページがない場合:同じフラグを付けてstart)。APPROVEされたら、モーションスキルのsaveを実行します。後からカードやビジュアルを変更する場合は、オーバーレイスキルを使用します(モーションクリップの場合は、モーションスキルのnote)。字幕やズームを変更する場合は、プラン作成、静止画の作成、レンダリング、roundの順に行います。カットを変更する場合は、カットスキルを使用します。
9. 別のエディターに書き出す
ユーザーが手作業で仕上げることを希望した場合に限ります(「Final Cutで開いて」「Premiereに送って」など)。
python3 "$S/export_nle.py" edits/<name> --to fcpxml|premiere|resolve|capcut|edl|srt|all
edits/<name>/export/に書き出します。移動するカードは、まずアルファチャンネル付きでレンダリングします(カード1フレームあたり約0.7秒かかることを伝えてください)。
開くファイルや、16:9用のYouTubeチャプターについては、references/render.mdの「別のエディターに書き出す」を参照してください。
スクリプトが停止した場合
| メッセージ | 対処 |
|---|---|
no cut.mp4 in ... (plan.py、face.py) または cut.mp4 missing (edit.py) | 先にカットスキルを実行します |
no creator style.json found for the profile's creators | creator-teardown のクイックモードを実行してから、profile.py style を再度実行します |
note: ... style.json not found; planning with the default style | クリエイターがいない場合は問題ありません。profile.py style edits/<name> を実行すると、編集内容とともに保持されます |
no cut.transcript.json (retakes.py captions) | カットスキルの検証ステップを実行します |
the split layout is vertical only | --layout overlay を指定して再度プランを作成します |
check.py plan found a FAIL (edit.py stills) | プラン内の FAIL を修正し、再度プランを作成します |
... missing (run matte.py) | matte.py を実行してから、stills または render を再度実行します |
... missing (run sfx.py build, then plan.py) | 指示どおりに実行します |
no Chrome Headless Shell (capture.mjs) | python3 "${CLAUDE_PLUGIN_ROOT}/skills/setup/scripts/setup.py" remotion を実行してから、再度キャプチャします |
capture.mjs failed <kind> '<word>' | 該当するビジュアルを削除するか、別の URL を指定します。残りは保存されています |
Modal is not set up on this computer | セットアップスキルの Modal ステップを実行します |
the GitHub CLI (gh) is missing / ... is public | セットアップの GitHub CLI セクションを確認します/プライベートリポジトリのみ使用します |
the laptop render failed | references/render.md の「レンダリングが停止した場合」を確認します |
the Modal render failed / the render failed. Open <url> | その旨を伝え、ラップトップでのレンダリングを提案します |
ファイル
scripts/:上記の各ステップに対応するスクリプトがあり、それぞれにdemoセルフチェックがあります。${CLAUDE_PLUGIN_ROOT}/agents/template-filler.md(haiku)、stills-critic.md(sonnet):ヘルパーです。${CLAUDE_PLUGIN_ROOT}/remotion/:レンダラーです。実行のたびに~/.ai-video-editor/remotionにコピーされます。