clips について
clips は、長尺動画やポッドキャストから、ユーザーのスタイルに合わせた縦型クリップを作る編集スキルです。文字起こしに基づく候補選定から、カット、リフレーム、スタイル調整、確認までを案内します。
主な機能
- 01文字起こしに基づく候補作成
- 02候補リストと選択ページ
- 03横長映像の縦型リフレーム
- 04カットとスタイル編集の手順
- 05確認とレンダリングのレビュー
活用シーン
- 01長尺動画から短いクリップを作成
- 02重複しないポッドキャスト部分の選定
- 03SNS向け縦型動画の編集
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ nextwork-projects/ ai-video-editor-cooked --skill clipsインストール後、Claude Code で/clipsを入力して読み込まれたか確認します。
同梱ファイルscripts/clips.py
詳細
Clips
パス:${CLAUDE_SKILL_DIR} はこの SKILL.md を含むフォルダーを指し、${CLAUDE_PLUGIN_ROOT} はその2階層上にあるプラグインフォルダーを指します。
まず ${CLAUDE_PLUGIN_ROOT}/PRINCIPLES.md を読んでください。このプラグインのすべての動画に適用されるルール(質問、リアルさ、動き、ストーリーとフレーミング、プライバシー、コスト)が記載されています。
ユーザーへの質問はすべて質問ボックスで行ってください。AskUserQuestion ツールを呼び出します(選択肢は2~4個で、おすすめを最初にします)。このツールが使えないエージェントの場合に限り、テキストで番号付きの質問をしてください。
長い動画を1本。ユーザーのスタイルに合わせて完成させた縦型編集動画の中から、特に良い短いクリップをいくつか作成します。
clips/<name>/
source.mp4 the long video (a symlink for a local file; never modify the original)
source.mp3, cover.jpg instead, for an audio-only podcast: its audio and the show's artwork
words.raw.json one transcript of the whole thing (never read it)
candidates.json every candidate with its features (never read it)
shortlist.md the top 8 that do not overlap, about 1,500 tokens: the only file you read
shortlist.json the same, for the page
picks.html the page the user picks from
edits/<name>-clip<N>/ one edit per chosen clip: source.mp4, words.raw.json (re-timed), clip.json
Mac と Linux では python3、Windows では py を使ってスクリプトを実行します。
PY="${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/run.py";以下の python3 "$PY" はエディターの venv Python を実行します(Windows では py "$PY")。
ファイルがない場合は、先に setup スキルを実行してください。K="${CLAUDE_SKILL_DIR}/scripts/clips.py"、
C="${CLAUDE_PLUGIN_ROOT}/skills/cut/scripts"、S="${CLAUDE_PLUGIN_ROOT}/skills/style-edit/scripts" です。
0. 一度だけ質問する
まずプロフィールと好みを確認します(python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/profile.py" show、
python3 "${CLAUDE_PLUGIN_ROOT}/skills/taste/scripts/taste.py" show)。プロフィールがまだない場合は、
まず start スキルのスタイル確認を実行し、クリップがユーザーの見た目に合うようにします。
次に質問ボックスを一度呼び出します。おすすめを最初にしてください。
| 質問 | 選択肢 |
|---|---|
| クリップはいくつ作りますか? | 3(おすすめ)/5/1 |
| それぞれの長さはどのくらいにしますか? | 20~40 s(おすすめ)/40~60 s/60~90 s |
| 話す人は何人ですか? | 1人(おすすめ)/2人(ポッドキャストまたはインタビュー) |
ユーザーがすでに回答した項目は省略してください。これらの質問は、カットスキルの「最初にカットするか、すべて一度に行うか」という質問の代わりです。クリップ作成は続けて進め、候補と静止画シートはユーザーの承認を受けます。
1. 動画
ローカルファイル(同じドライブ上にハードリンクを作成し、それができない場合はシンボリックリンクを作成します。コピーは最後の手段です):
python3 "${CLAUDE_PLUGIN_ROOT}/skills/clips/scripts/clips.py" link "<absolute path>" clips/<name>
リンク:
python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/links.py" fetch "<url>" clips/<name> --max-height 1080
venv の yt-dlp を使います(setup がここにインストールします。PATH 上にはインストールしません)。ダウンロード上限は 1080p です(1080x1920 のクリップに 4K は不要です。4K で20分のトークをダウンロードすると数 GB になります)。ファイルパス clips/<name>/source.mp4 を出力します。終了コード 3:サイトでログインを求められています(YouTube の「ボットではないことを確認してください」など)。
--cookies-from-browser chrome(またはユーザーのブラウザー)を指定して再実行する前に、質問ボックスで確認してください。
ポッドキャスト(RSS フィードまたは Apple Podcasts の番組リンク)の場合:route は最新のエピソードを ask の選択肢として一覧表示します。質問ボックスでどれにするか尋ね(新しいものを先に表示)、その後 fetch "<option url>" clips/<option name> --direct --cover "<option image>" を実行します。
音声は source.mp3(または音声ファイル固有の拡張子)として保存され、番組のアートワークは cover.jpg として保存されます。
ユーザーに再利用する権利があるものだけをダウンロードしてください。ユーザー自身の動画、または使用許可を得た動画に限ります。他人のリンクの場合は、そのことを一度伝えてください。
2. 一度だけ文字起こしする
python3 "$PY" "$C/transcribe.py" clips/<name>/source.mp4 clips/<name>/words.raw.json # the file fetch printed: source.mp3 for audio
まず所要時間を伝えてください。ノート PC では Whisper は動画3分あたり1~4分かかります(無料)。Scribe は13分の動画で約20秒です。カットスキルと同じエンジンを使います。Scribe は笑い声などの音声イベントも追加し、スコアの計算に使います。 各クリップでこの文字起こしを再利用し、二度文字起こしすることはありません。
3. 候補とショートリスト
python3 "$K" candidates clips/<name> --min 20 --max 40 [--speakers 2] [--style creator-teardowns/<handle>/style.json]
ユーザーが選んだ長さを渡します。--style はプロフィールの最初のクリエイターです。そこで測定された「効果的な要素」の動きがショートリストに記載されています。コードは文字起こしを文に分割し、指定された長さに収まる文のまとまりをすべて候補にします(「Mm-hmm」で始まるものや、単語の途中で終わるものは対象外です)。それぞれを測定し、特徴に基づいて順位付けして、shortlist.md に書き込みます。
shortlist.md だけを読んでください。各項目には、フック、すべての中間文の冒頭の言葉、最後の文、測定された特徴が記載されています。各項目を次の4つの観点で判断してください。フック単独で効果があるか、初めて見る人が内容を理解できるか、期待に応えているか、具体的な主張・数字・ストーリーがあるか。
words.raw.json や candidates.json は絶対に読まないでください。ショートリストから、ユーザーが指定した数のクリップを上位から選びます。スコアにかかわらず、以下は除外してください。
- 広告の読み上げ、スポンサーセグメント、イントロ、締めくくり。
- 「さっき言ったように」「だから」「これ」のように、以前の文脈に頼るフック。
- 主張が時期に左右され(「これを録画している時点で、40位です」など)、その後状況が変わっているクリップ。今日のページをライブでキャプチャすると、その主張と矛盾する場合があります。
4. 選択ページ、続いて質問ボックス
python3 "$K" page clips/<name> --recommend c12,c40,c7
open clips/<name>/picks.html # Windows: start "" ..., Linux: xdg-open ...
1ページに、ショートリスト内のすべてのクリップを表示します。各クリップには、幅360 pxのプレビュー、文字起こし(フックは太字)、スコアの内訳、測定された特徴を含め、選択したものに印を付けます。その後、質問ボックスで(複数選択形式)質問します。最初に選択したクリップを並べ、それぞれに時間とフックを付け、さらに「ページから別のもの」を選択肢に加えます。回答を待ちます。
5. 選択した各クリップ
python3 "$K" trim clips/<name> c12 c40 c7 # -> edits/<name>-clip1, -clip2, -clip3
各編集フォルダーには、フレーム単位で正確にトリミングされ、次の単語が入り込まないように余白を加えた source.mp4 と、それに合わせてタイミングを調整した words.raw.json が作成されます。音声のみのソース(source.mp3)には映像がありません。トリミングすると、各クリップの source.mp4 はポッドキャスト自体のカバー画像に音声を重ねたものになります(カバー画像をぼかして暗くし、1080x1920を埋めるように配置し、その上に鮮明なカバー画像を字幕の上に表示します。アートワークがない場合は黒)。また、clip.json には audio_only と記録されます。カバー画像がある場合は、レンダリング時にその画像を動かします。カバー画像をゆっくりズームし、地面はそれに対して流れるように動き、各文の冒頭で小さくパンチインします。こうしたクリップではレイアウトを尋ねず、オーバーレイ、リフレームなし、切り抜きなし、字幕オン(profile.py style でオンのまま)にします。各クリップは番組のカバー画像に音声を重ね、話者の言葉を字幕として表示するものだと一度だけ伝えます。クリップの再生を始める前に、すべてのクリップに適用する音楽を一度決めます(style-editの references/plan.md の「Music」を参照。ユーザーが sound.music を設定していない限り、スタイルに従います)。
すべてのクリップを同時に処理する場合(Claude Code、またはサブエージェントを使えるエージェント):クリップごとに clip-editor エージェント(ai-editor:clip-editor)を1つ起動し、すべてを1つのメッセージで送って同時に実行します。それぞれに EDIT(該当クリップの絶対パスのフォルダー)、ROOT(${CLAUDE_PLUGIN_ROOT})、PY の行と、アスペクト比、レイアウト、音楽、文字起こしエンジン、リフレームの要否(横長のソースなら「はい」。ただしプラットフォームがYouTubeの場合を除く)、ソースに字幕が焼き込まれているかどうかの回答を渡します。各エージェントはクリップをカットし、style-editでスチルシートまで作業して、短いJSON(status、cut_s、verify、cut_page、sheet、error)を返します。これらをまとめます。クリップの文字起こしやペーパー編集は決して開かないでください。次に、ready のクリップすべてのスチルシートについて stills-critic エージェントを実行します。この場合もすべてを1つのメッセージで送ります。問題として指摘された箇所を修正し、そのクリップのプラン作成とスチルの作成をやり直します。failed のクリップは、以下の手順で手動処理します。
1つずつ処理する場合(サブエージェントなし)、各クリップを順番に処理します。
- 横長の動画から縦型動画を作成する:
python3 "$PY" "$K" reframe edits/<name>-clip<N>を実行すると、ショットごとに話者の顔を追いながら9:16にクロップします(ffmpegでカメラのカットを検出します)。プロファイルのプラットフォームがYouTubeの場合、またはソースがすでに縦型の場合はスキップします。 - カット: ステップ2のカットスキル(
retakes.py propose)を使います。文字起こしはすでに作成されています。そのスキルの説明に従って、ビルド、レンダリング、検証を行い、カットページを作成します。音声の下に敷く音楽はファイルごとに計測されます。build_timeline.pyはそのファイル内で単語と単語の間だけをトリミングします。 - スタイル:
python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/profile.py" style edits/<name>-clip<N>を実行してから、ステップ2のstyle-editスキルに従います。ソースに字幕がすでに焼き込まれている場合は、その編集のstyle.jsonで"captions": {"present": false}に設定してください。設定しないと字幕が重なって表示されます。
どちらの方法でも、各クリップの cut-check.html を開き、すべてのスチルシートをまとめて表示して、一度に承認を求めます。レンダリングについても全クリップ分をまとめて一度だけ尋ねてから、レンダリングします。承認後、各クリップのフォルダーで python3 "${CLAUDE_PLUGIN_ROOT}/skills/cut/scripts/judge_cut.py" score を実行します(カットの references/judge.md を参照)。レンダリング結果は1つのレビューページにまとめて引き渡し、各クリップをタブにします(クリップ1は start、残りは alt、フォルダーは clips/<name>。${CLAUDE_PLUGIN_ROOT}/skills/style-edit/references/review.md を参照)。その後、バックグラウンドで serve と wait を実行します。
スクリプトが停止した場合
| メッセージ | 対応 |
|---|---|
no run of whole sentences lasts <lo>-<hi> s | 質問ボックスで長さの範囲を広げるよう依頼し、candidates を再実行します |
no candidate <id> | shortlist.md にあるIDを使います |
links.py fetch が終了コード3(ログイン、または「ボットではないことの確認」) | --cookies-from-browser <browser> を付けて再実行する前に確認します |
| カットまたはstyle-editに関するメッセージ | 該当スキルの「If a script stops」テーブルに従います |
ルール
- 画面に表示される単語、数字、名前はすべて、そのクリップ内で実際に話されたものに限ります。動画のほかの部分から持ち込んだり、話者が言っていない内容を加えたりしないでください。
- AIっぽく見える表現は禁止です。すべてのクリップに
${CLAUDE_PLUGIN_ROOT}/skills/style-edit/references/ai-tells.mdを適用してください。 - ポッドキャストのクローズアップ映像に余白はありません。人物の頭にカードやロゴを重ねないでください。ビジュアルは少ないほうが適切です。字幕とズームで伝えます。
- 文の途中でクリップを切らないでください。指定より短くても長くても、話の途中で切るより適切です。
長尺動画1本あたりのコスト
2人で話す13分間のポッドキャストと、12分間のトーク動画(2026-10)で計測:
- 文字起こし:Scribeは16〜18秒、Whisperは無料ですが、より時間がかかります。長尺動画1本につき1回です。
- 候補と特徴量:コード実行に4〜6秒、$0です。
- Claudeは
shortlist.md(約1,500トークン)を読み、トランスクリプト(約20,000トークン)は読みません。 - ピック一覧ページ:8本のプレビューを作成するのにffmpegで30〜40秒、7〜9 MBです。
- 各クリップのコストは、カット1回とスタイル編集1回分です。
セルフチェック
python3 "$K" demo
ファイル
scripts/clips.py:候補作成、ページ作成、トリミング、リフレーム、オフラインデモ(合成トランスクリプト)。reframe(venv経由のOpenCV)を除き、標準ライブラリのみを使用します。${CLAUDE_PLUGIN_ROOT}/agents/clip-editor.md:1本のクリップをカットとスタイル編集に通し、スチル画像一覧を作成します。