steal について
steal は、参考リールの編集スタイルを再現したい動画クリエイター向けの video-agent スキルです。映像、音声、テンポを測定して再利用可能なスタイルファイルを作り、撮影素材でテストします。
主な機能
- 01フレーム、カット、レイアウトの測定
- 02効果音とビートの分析
- 03顔の大きさとズームの記録
- 04再利用可能なスタイルファイルの作成
- 05テスト編集のレンダリングと比較
活用シーン
- 01参考リールの見た目を取り入れる
- 02撮影素材でスタイルをテストする
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ melvynx/ video-agent-skills --skill stealインストール後、Claude Code で/stealを入力して読み込まれたか確認します。
同梱ファイルreferences/learnings.md
詳細
盗用
誰かの編集スタイルがうまくいっていて、それを自分の動画にも使いたいと思ったら。このスキルでは、その編集を分析してスタイルとして書き出し、自分の素材で試してから使えるようにします。
出力:
video-agent/styles/<name>/style.json:エンジンが読み込むスタイルです。/short-editing <take> style <name>で使用します。video-agent/styles/<name>/STYLE.md:分析した内容と、エンジンでは保持できないルールを記録します。video-agent/styles/<name>/stills/(元動画のキーフレーム)とassets/(効果音とロゴ。スタイルを使うすべてのショート動画にコピーします)。video-agent/edits/short-<slug>-<name>/output/short-<slug>-<name>.mp4:テスト動画です。
始める前に references/learnings.md を読んでください。ここにあるルールはどれも、コピーが却下された事例から得られたものです。
実行方法
- 事前確認:
ffmpeg -version && yt-dlp --versionを実行します。不足している場合は/studio-setup toolsを実行してください。 - クリエイターの言語で話してください。各長い手順の前に、何をするかを1行で伝えてください。
<name>:ユーザーがスタイル名を指定しない限り、クリエイターのハンドルを小文字にし、ハイフンでつなげます。- 作業ファイルは
video-agent/.tmp/steal-<name>/(以下W)に保存します。
1. リールを取得する
- ローカルファイルの場合:そのまま使います。
- YouTube のリンクの場合:
yt-dlp -o "W/reel.%(ext)s" "<url>"を実行します。 - Instagram または TikTok の場合:まず
yt-dlpを試します。ブロックされている場合(ログイン画面が表示される場合)で、Treg がセットアップ済み(treg balanceが応答する)のときは、treg catalog search "download an Instagram reel video file"、次に料金を調べるためtreg catalog get <id>、続いてtreg call <id> --query url=<url>を実行し、返された動画 URL からダウンロードします。それ以外の場合は、動画を保存してファイルを渡すようユーザーに依頼してください。 - 可能であれば、同じ形式のリールを2〜3本調べてください。1本だけでは例外の可能性があります。
2. 分析する
3つの分析をすべて行います。フレームだけからスタイルをコピーすると、サウンドとリズムの半分を見落とします。
サブエージェントを使うと効率的です。 エージェントがサブエージェントを実行できる場合(Claude Code、Codex)、最初のブロックに従ってシートと cuts.txt を自分で作成し、Frames、Sound、Zooms を3つのサブエージェントに同時に割り当ててください。それぞれに絶対パスと該当セクション全文を渡し、書き込み先ファイルを1つ指定します:W/notes-frames.md、W/notes-sound.md、W/notes-zooms.md。数値とタイムスタンプだけを記録し、音声を大きな音で再生しないよう指示してください。作業中は自分でシートを確認します。見た目の判断は自分で行い、数値の記録はサブエージェントに任せます。その後、サブエージェントのメモを基にスタイルを書きます。サブエージェントを使えない場合は、各分析を順番に行います。
フレームとカット
ffmpeg -v error -y -i W/reel.mp4 -vf "fps=2,scale=270:480,tile=8x3:padding=4:color=black" W/sheet-%02d.jpg
ffmpeg -hide_banner -i W/reel.mp4 -vf "scdet=threshold=12" -an -f null - 2>&1 | grep -o "scd.time: [0-9.]*" | cut -d' ' -f2 > W/cuts.txt
ffprobe -v error -show_entries format=duration -of csv=p=0 W/reel.mp4
- 各シートには、1秒あたり2枚のペースで24枚のタイルが並びます。シートNのタイルi(0から開始)には、12(N-1) + i/2 秒のフレームが表示されます。
- 1カットあたりの秒数 = 動画の長さ / (
cuts.txtの行数 + 1)。
すべてのシートを読み込み、以下を書き留めます:
- レイアウト:カメラの全画面表示、分割画面(境界線の位置)、テキスト付きの単色背景、単色背景上の人物の切り抜き、Bロール、スクリーンショット。
- レイアウトごとの字幕:フォントの印象(幅狭、丸み、セリフ体)、大文字・小文字、ウェイト、サイズ、人物のどこに表示されるか、単語の表示方法、どの単語をどのように強調するか。
- ボードと画像:種類、境界線、サイズ、表示されるタイミング(名称が語られたときかどうか)、重ねて表示されるか。
- フック(最初の2秒)、CTA(最後の3秒)、カラーグレーディング(明るくフラット、またはコントラストが強く暗め)。
キーフレームを6〜10枚、video-agent/styles/<name>/stills/ に保存します:
ffmpeg -v error -y -ss <seconds> -i W/reel.mp4 -frames:v 1 video-agent/styles/<name>/stills/t<seconds>.jpg
サウンド
ffmpeg -v error -y -i W/reel.mp4 -lavfi "showspectrumpic=s=3000x500:legend=0:scale=log:stop=11000" W/spectrum.png
- 画像の幅は 3000 px です。そのため、t 秒地点のカットは x = 3000 × t / duration にあります。
cuts.txtと照らし合わせて確認します。 - 上のほうに現れる明るく細い縦線はクリック音、幅広で下のほうにあるものは爆発音です。右肩上がりのにじみはヒュッという音、一定の音楽帯を横切る暗い空白はビートが途切れている箇所です。
- カットを 1 つ拡大して、そのヒット音を確認します:
ffmpeg -v error -y -ss <cut - 1> -t 2 -i W/reel.mp4 -lavfi "showspectrumpic=s=1000x500:legend=0:scale=log:stop=11000" W/cut-<n>.png。 - ビート:スペクトログラムで 10 秒間の規則的な低い波形の数を数えるか、再生しながら一緒に数えます:10 秒あたりの波形数 × 6 = BPM。
音声の下に流れる音楽の音量(任意です。video-agent/.env に ELEVENLABS_API_KEY が必要で、クレジットを少し消費します。まずその旨を伝えてください):
set -a; . video-agent/.env; set +a
ffmpeg -v error -y -i W/reel.mp4 -vn -ac 1 -ar 44100 W/full.wav
curl -s -X POST https://api.elevenlabs.io/v1/audio-isolation -H "xi-api-key: $ELEVENLABS_API_KEY" -F audio=@W/full.wav -o W/voice.mp3
ffmpeg -v error -y -i W/voice.mp3 -ac 1 -ar 44100 W/voice.wav
for f in full voice; do ffmpeg -v error -i W/$f.wav -af "asetnsamples=882,astats=metadata=1:reset=1,ametadata=print:key=lavfi.astats.Overall.RMS_level:file=-" -f null - | grep -o "RMS_level=.*" | cut -d= -f2 > W/rms-$f.txt; done
paste W/rms-voice.txt W/rms-full.txt | awk '$1<-40{print $2}' | sort -n | awk '{a[NR]=$1}END{print "music while the voice is silent:", a[int(NR/2)+1], "dB over", NR/50, "s"}'
awk '$1>-30' W/rms-voice.txt | sort -n | awk '{a[NR]=$1}END{print "voice while talking:", a[int(NR/2)+1], "dB"}'
- これらのコマンドでは、20 ms ごとに音量を測定します。音声が分離された無音区間では、音楽はフルミックスに含まれています。
- 音声の下に流れる音楽の音量 = 音声の音量 − 音楽の音量です。
- 無音が 1 秒未満(間をすべてカットした編集)の場合、信頼できる測定には短すぎます。スペクトログラムで判断してください。
- 分離した音声をフルミックスから決して差し引かないでください。元の音声とは位相が合わないため、結果の音量が音声より大きくなります。
- キーがない場合は、スペクトログラムで音量を判断してください。
音楽が始まる箇所と、各イベントに割り当てられているサウンド(カット、ボード、ズーム、インパクト)を記録します。
ズーム
シート上で、10 枚ほどのタイルを対象に、顔の高さがフレームの高さに占める割合を測定し、タイルごとの顔の大きさの変化を記録します。
- カット時の変化 = 2 つのショット間のフレーミングの変化
- ショット内の変化 = パンチイン
- ショット全体でゆっくり大きくなる = プッシュ
範囲(例:顔がフレームの 12〜25%)と、10 秒あたりのパンチイン回数、プッシュの有無を記載します。これらの数値がコピーの上限です。
3. スタイルを書く
ユーザーの言語で video-agent/styles/<name>/STYLE.md を作成し、short-editing の style.md と同じセクションを使います。各行には、値とその測定根拠を記載します。
# Style: <name>
Copied from <link>, measured on <date>. Applied on top of short-editing's style.md: what is not here stays as there.
## Cuts
- hard cut every 1.4 s on average (35 cuts in 50 s); no fade, no transition
## Framing
- face 12 to 25 % of the frame; punch-in 1.1 at most, about every 4 s, held until the next cut; slow push 0.6 %/s
## Captions
- ...
## Boards and images
- ...
## Sound
- boom bap beat ~90 BPM from the hook impact, 12 dB under the voice, drops out 0.3 s on punch-ins
- a dry high click on most cuts (assets/sfx/cut.mp3), a pop on each board (assets/sfx/pop.mp3)
## Grade
- ffmpeg: eq=contrast=1.08:saturation=0.9,vignette=PI/5,unsharp=5:5:0.4
## Left out
- the AI video clips: replaced by your own footage or a board
## How short-editing applies it
- what goes in each spec by hand (an HTML component, a layout key, a B-roll moment)
次に video-agent/styles/<name>/style.json を作成し、エンジンが対応する最も近い値を設定します。short-editing の style-schema.md にあるすべてのキーを含めます:colors、font / display、captions(26 種類の見た目:カメラ映像に重ねる大きく幅の狭い単語用の stack、band、dim、rise、hard など)、paper(単色の背景には bg: 'flat')、layout.seam、cuts: 'hard'、zoom.drift、pace.speed、grade(ffmpeg チェーン)、sfx.kit(assets/sfx/ のカット、ポップ、パンチの各ファイル)、music.dropOn、そしてエンジンでは扱えないルールを notes に記載します。assets/looks.json のポスタールックは、ハードカットを使うクリエイターの測定に基づくコピーです。リールがハードカットなら、これをベースにします。リールに表示されるロゴは assets/logos/ に入れます。
効果音(video-agent/styles/<name>/assets/sfx/ 内):short-editing に同梱されているライブラリから選び、デフォルトでは生成しないでください。
<short-editing>/assets/sfx/から最も近いファイルを選びます(一覧と用途は short-editing の references/sfx.md を参照):zhhh、impact-boom、riser、glass-shatter、pop-backは、フックの切り替え、リビール、ペイオフに使えます。これらをスタイルのassets/sfx/にコピーし、sfx.kit/sfx.files/ notes から参照します。- エンジン内蔵のサウンド(
sfx.extra内のthud、pop、tap、bell、tom)は、ファイルを使わないソフトなヒットをカバーします。 - 元の映像に、これらのどれも近くないサウンドがあり、クリエイターも同意した場合に限り(クリエイターのクレジットを使用します)、ElevenLabs で 2〜3 テイクを生成して最も近いものを残します:
curl -s -X POST https://api.elevenlabs.io/v1/sound-generation -H "xi-api-key: $ELEVENLABS_API_KEY" -H "content-type: application/json" -d '{"text":"single dry short high click, tight transient, no reverb","duration_seconds":0.5}' -o video-agent/styles/<name>/assets/sfx/cut-a.mp3
画像:クリエイターが画面に表示する画像(商品やスクリーンショット)は、ボード上の img アイテムにします。画像がない場合に限り /codex-images で生成し、顔は決して生成しないでください。
ロゴ:画面に表示されるアプリはすべて、文字を円で囲んだものではなく、実際のロゴを表示します。
4. テストする
video-agent/takes/から、ユーザーが映っている10〜20秒のテイクを選びます。/short-editing <take> style <name>を実行します。initはスタイルをスナップショットし、そのassets/をコピーします。仕様では、各ショート動画について STYLE.md の指示にある要素(レイアウトキー、パンチイン、名前が出た箇所でのボード表示)を追加します。- スラッグは
<take slug>-<name>です。
5. 見せる前に比較する
元動画を上、コピーを下に、同じ秒数で配置します。
ffmpeg -v error -y -i W/reel.mp4 -i video-agent/edits/short-<slug>/output/short-<slug>.mp4 -filter_complex "[0:v]fps=1,scale=216:384,trim=end_frame=15,tile=15x1[a];[1:v]fps=1,scale=216:384,trim=end_frame=15,tile=15x1[b];[a][b]vstack" -frames:v 1 W/compare.jpg
タイルごとに確認します。
- 文字のサイズと太さ
- ボードとロゴのサイズ(元動画と同じように画面いっぱいに表示されていること)
- 色調
- 元動画でハードカットしている箇所にフェードがないこと
- 字幕が口に重なっていないこと
- 上下が逆になっていないこと
コピーのスペクトログラムも確認します。ヒット音がカットに合っていること、ビートが声の下で同じ音量になっていることを確認します。シート上で顔のサイズを測定します。ズームの回数が元動画より多くないこと、顔が元動画より大きくなっていないことを確認します。
サブエージェントを使う場合は、比較シート、キーとなる静止画、上記のリストを初見チェック用のサブエージェントに渡し、その間に音声とズームを確認します。サブエージェントは異なるタイルをすべて報告します。見せる前に、すべての差を修正します。ユーザーに差を見つけさせてはいけません。
6. 納品する
テスト動画を開き、以下の内容を数行でユーザーに伝えます。
- 測定した内容(ショットごとの秒数、BPM、音楽の音量、ズーム)
- コピーしたものと、コピーしなかったもの、およびその理由
- スタイルの保存場所
今後は、/short-editing <take> style <name> でこのスタイルを使用します。ユーザーが何かを却下するたびに、STYLE.md と style.json の notes に記録します。汎用的な教訓であれば、references/learnings.md に追加します。