steal

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Steal

Steal

Someone's edit works and you want it on your own videos. This skill measures their edit, writes it down as a style, and proves it on one of your takes before you use it.
Output:
  • video-agent/styles/<name>.md
    : the style, read by
    /short-editing <take> style <name>
    .
  • video-agent/styles/<name>/
    : its stills, sound effects and stickers.
  • video-agent/edits/<slug>-<name>/final.mp4
    : the test video.
Read references/learnings.md before you start. Each rule in it comes from a copy that got rejected.
某人的剪辑效果很棒,你想把这种风格用到自己的视频中。这个 skill 会量化对方的剪辑效果,将其记录为一种风格,并先在你的一段拍摄素材上进行验证,然后再供你使用。
输出:
  • video-agent/styles/<name>.md
    :风格文件,由
    /short-editing <take> style <name>
    读取。
  • video-agent/styles/<name>/
    :其中的静帧、音效和贴纸。
  • video-agent/edits/<slug>-<name>/final.mp4
    :测试视频。
开始前请阅读 references/learnings.md。其中每条规则都源于一次被否决的复刻尝试。

How to run it

运行方法

  • Preflight:
    ffmpeg -version && yt-dlp --version
    . Missing:
    /studio-setup tools
    .
  • Talk in the creator's language. Say what you do in one line before each long step.
  • <name>
    : the creator's handle in lowercase with dashes, unless the user names the style.
  • Scratch files go in
    video-agent/.tmp/steal-<name>/
    (
    W
    below).
  • 预检:
    ffmpeg -version && yt-dlp --version
    。如有缺失,执行
    /studio-setup tools
    。
  • 使用创作者的语言交流。每个耗时步骤开始前,用一行说明你将做什么。
  • <name>
    :默认使用创作者账号名的小写形式并以连字符分隔,除非用户为该风格命名。
  • 临时文件放在
    video-agent/.tmp/steal-<name>/
    (下文简称
    W
    )。

1. Get the reel

1. 获取 Reel

  • A local file: use it.
  • A YouTube link:
    yt-dlp -o "W/reel.%(ext)s" "<url>"
    .
  • Instagram or TikTok: try
    yt-dlp
    first. If it is blocked (login wall), and Treg is set up (
    treg balance
    answers),
    treg catalog search "download an Instagram reel video file"
    , then
    treg catalog get <id>
    for the price, then
    treg call <id> --query url=<url>
    and download the video URL it returns. Otherwise ask the user to save the video and give you the file.
  • When you can, study 2 or 3 reels of the same format. One reel can be the exception.
  • 本地文件:直接使用。
  • 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 条 Reel。只有一条时可以例外处理。

2. Measure

2. 量化

Do all three passes. A style copied from the frames alone misses half of it: the sound and the rhythm.
Faster with sub-agents. If your agent can run sub-agents (Claude Code, Codex), make the sheets and
cuts.txt
yourself (first block below), then hand Frames, Sound and Zooms to three sub-agents at the same time. Give each one the absolute paths, its section copied whole, and one file to write:
W/notes-frames.md
,
W/notes-sound.md
,
W/notes-zooms.md
, numbers and timestamps only, never playing audio aloud. Look at the sheets yourself while they work: you judge the look, they bring the numbers. Then write the style from their notes. Without sub-agents, do the passes one after the other.
完成全部三轮分析。仅从画面帧复制会漏掉一半风格:声音和节奏。
使用 sub-agent 更快。 如果你的 Agent 可以运行 sub-agent(Claude Code、Codex),则自行生成接触表和
cuts.txt
(下方第一个代码块),然后把 Frames、Sound 和 Zooms 三部分同时交给三个 sub-agent。向每个 sub-agent 提供绝对路径、完整复制的对应章节,以及一个要写入的文件:
W/notes-frames.md
、
W/notes-sound.md
、
W/notes-zooms.md
。只记录数字和时间戳,绝不外放音频。它们工作时,你自行查看接触表:你负责判断视觉风格,它们负责提供数字。然后根据这些笔记编写风格文件。如果没有 sub-agent,则依次完成各轮分析。

Frames and cuts

Frames 和 cuts

bash
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
  • Each sheet holds 24 tiles at 2 per second. Sheet N, tile i (from 0) shows second 12(N-1) + i/2.
  • Seconds per shot = duration / (number of lines in
    cuts.txt
    + 1).
Read EVERY sheet and write down:
  • Layouts: full camera, split screen (where the seam sits), flat color with text, cut-out person on a color, B-roll, screenshots.
  • Captions, per layout: font feel (condensed, rounded, serif), case, weight, size, where they sit on the body, how a word appears, which word gets emphasised and how.
  • Stickers and images: type, border, size, when they land (on the word that names them?), whether they stack.
  • Hook (first 2 s), CTA (last 3 s), color grade (bright and flat, or contrasty and dark).
Save 6 to 10 key stills to
video-agent/styles/<name>/
:
bash
ffmpeg -v error -y -ss <seconds> -i W/reel.mp4 -frames:v 1 video-agent/styles/<name>/t<seconds>.jpg
bash
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
  • 每张接触表包含 24 个图块,采样频率为每秒 2 帧。第 N 张表中从 0 开始计数的第 i 个图块对应第 12(N-1) + i/2 秒。
  • 每个镜头的平均时长 = 总时长 /(
    cuts.txt
    中的行数 + 1)。
务必查看每一张接触表,并记录:
  • 布局:全景镜头、分屏(接缝位置)、纯色背景配文字、抠像人物叠在色块上、B-roll、截图。
  • 字幕(按布局分别记录):字体风格(窄体、圆体、衬线体)、大小写、字重、字号、位于身体的什么位置、单词如何出现、哪个词被强调以及如何强调。
  • 贴纸和图像:类型、边框、尺寸、出现时机(是否落在点明其名称的单词上)、是否叠加。
  • Hook(前 2 秒)、CTA(后 3 秒)、调色(明亮平调,或高对比暗调)。
将 6 到 10 张关键静帧保存到
video-agent/styles/<name>/
:
bash
ffmpeg -v error -y -ss <seconds> -i W/reel.mp4 -frames:v 1 video-agent/styles/<name>/t<seconds>.jpg

Sound

Sound

bash
ffmpeg -v error -y -i W/reel.mp4 -lavfi "showspectrumpic=s=3000x500:legend=0:scale=log:stop=11000" W/spectrum.png
  • The image is 3000 px wide, so a cut at t seconds sits at x = 3000 × t / duration. Read it next to
    cuts.txt
    .
  • A bright thin vertical stroke high up = a click. Wide and low = a boom. A rising smear = a whoosh. A dark gap across the steady music band = the beat drops out.
  • Zoom on one cut to see its hit:
    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
    .
  • Beat: count the regular low strokes over 10 s on the spectrogram (or tap along while it plays): strokes per 10 s × 6 = BPM.
Music level under the voice (optional, needs
ELEVENLABS_API_KEY
in
video-agent/.env
, uses a few credits, say so first):
bash
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"}'
  • These commands measure the level every 20 ms. The music is the full mix in the moments the isolated voice is silent.
  • Music under the voice = the voice level minus the music level.
  • Under 1 s of silence (an edit with every pause cut) is too little to trust: judge it on the spectrogram.
  • Never subtract the isolated voice from the mix: it is not in phase with the original, so the result comes out louder than the voice.
  • Without a key, judge the level on the spectrogram.
Write down where the music starts and which event gets which sound: cut, sticker, zoom, impact.
bash
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 / total duration。将它与
    cuts.txt
    对照查看。
  • 高处的一条明亮细竖线代表 click(点击声);宽而低的竖线代表 boom(低频冲击声);向上延伸的拖影代表 whoosh(呼啸声);稳定音乐频带上的一道暗色间隙表示节拍在此中断。
  • 放大某个剪切点以查看其命中音效:
    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
,会消耗少量 credits,开始前先告知用户):
bash
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 秒(每次停顿都被剪掉的剪辑),则不足以据此判断:应结合频谱图评估。
  • 绝不要从混音中减去分离人声:二者的相位与原片不同相减,结果会比人声更响。
  • 没有 API key 时,根据频谱图判断电平。
记录音乐从哪里开始,以及每个事件对应哪种声音:剪切、贴纸、变焦、冲击。

Zooms

Zooms

On the sheets, measure the face height as a share of the frame height on 10 tiles or so, and list the jumps in face size from one tile to the next:
  • a jump at a cut = a change of framing between two shots
  • a jump inside a shot = a punch-in
  • a slow growth over a shot = a push
Write the range (e.g. face 12 to 25 % of the frame), the punch-ins per 10 s, and whether there is a push. These numbers are the ceiling for your copy.
在接触表上选取约 10 个图块,测量脸部高度占画面高度的比例,并列出相邻图块之间的脸部尺寸跳变:
  • 剪切点处出现跳变 = 两个镜头之间的构图发生变化
  • 镜头内部出现跳变 = punch-in(快速推近)
  • 镜头过程中缓慢增大 = push(缓慢推近)
记录范围(例如,脸部占画面高度的 12% 到 25%)、每 10 秒的快速推近次数,以及是否存在缓慢推近。这些数值是复刻时的上限。

3. Write the style

3. 编写风格

video-agent/styles/<name>.md
, in the user's language, with the same sections as
short-editing
's style.md. Each line gives a value and the measurement behind it:
markdown
undefined
video-agent/styles/<name>.md
应使用用户的语言,并采用与 short-editing 的 style.md 相同的章节。每一行都应给出取值及其测量依据:
markdown
undefined

Style: <name>

Style: <name>

Copied from <link>, measured on <date>. Applied on top of short-editing's style.md: what is not here stays as there.
Copied from <link>, measured on <date>. Applied on top of short-editing's style.md: what is not here stays as there.

Cuts

Cuts

  • hard cut every 1.4 s on average (35 cuts in 50 s); no fade, no transition
  • hard cut every 1.4 s on average (35 cuts in 50 s); no fade, no transition

Framing

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
  • 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

Captions

  • ...
  • ...

Stickers and images

Stickers and images

  • ...
  • ...

Sound

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 (sfx/cut.wav), a pop on each sticker (sfx/pop.wav)
  • 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 (sfx/cut.wav), a pop on each sticker (sfx/pop.wav)

Grade

Grade

  • ffmpeg: eq=contrast=1.08:saturation=0.9,vignette=PI/5,unsharp=5:5:0.4
  • ffmpeg: eq=contrast=1.08:saturation=0.9,vignette=PI/5,unsharp=5:5:0.4

Left out

Left out

  • the AI video clips: replaced by your own footage or a callout
  • the AI video clips: replaced by your own footage or a callout

How short-editing applies it

How short-editing applies it

  • the components to add to the composition and the props they take

**Sound effects** (in `video-agent/styles/<name>/sfx/`):

- With an ElevenLabs key, generate 2 or 3 takes per sound and keep the one closest to the original on the spectrogram:
  ```bash
  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>/sfx/cut-a.mp3
  • Otherwise, use a royalty-free library.
Stickers:
  1. Generate them with
    /codex-images
    . Use the user's REAL photos as the face reference, never a generated face. Ask for a flat #00FF00 background, no shadow, no text.
  2. Key the background out to a transparent PNG:
    bash
    ffmpeg -v error -y -i sticker.png -vf "colorkey=0x00FF00:0.3:0.08,despill=type=green" -pix_fmt rgba sticker-cut.png
Logos: every app named on screen shows its real logo, never a letter in a circle.
  • the components to add to the composition and the props they take

**音效**(位于 `video-agent/styles/<name>/sfx/`):

- 配置 ElevenLabs key 后,为每个音效生成 2 或 3 个版本,并保留频谱图上最接近原声的一版:
  ```bash
  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>/sfx/cut-a.mp3
  • 否则,使用免版税素材库。
贴纸:
  1. 使用
    /codex-images
    生成。必须使用用户的真实照片作为人脸参考,绝不能使用生成的人脸。要求使用纯色 #00FF00 背景,不要阴影,不要文字。
  2. 抠除背景并输出透明 PNG:
    bash
    ffmpeg -v error -y -i sticker.png -vf "colorkey=0x00FF00:0.3:0.08,despill=type=green" -pix_fmt rgba sticker-cut.png
Logo:屏幕上提到的每个 App 都必须显示其真实 Logo,绝不能只用圆圈里的字母代替。

4. Test it

4. 测试

  1. Pick a 10 to 20 s take of the user from
    video-agent/takes/
    .
  2. Run
    /short-editing <take> style <name>
    . It reads the style file and adds what it describes to the composition: stickers on the word that names them, sound effects on the cuts, the grade.
  3. The slug is
    <take slug>-<name>
    .
  1. 从
    video-agent/takes/
    中选择一段 10 到 20 秒的用户拍摄素材。
  2. 运行
    /short-editing <take> style <name>
    。它会读取风格文件,并将其中描述的内容加入合成:在点明名称的单词上添加贴纸、在剪切点添加音效,并应用调色。
  3. slug 为
    <take slug>-<name>
    。

5. Compare before showing

5. 展示前对比

Put the original on top and the copy below, at the same seconds:
bash
ffmpeg -v error -y -i W/reel.mp4 -i video-agent/edits/<slug>/final.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
Go tile by tile:
  • type size and weight
  • sticker and logo size (they fill the space like in the original)
  • grade
  • no fade where the original cuts hard
  • captions off the mouth
  • nothing upside down
Run the spectrogram on the copy too: the hits must land on the cuts, the beat must sit at the same level under the voice. Measure the face size on its sheets: no more zooms than the original, the face never bigger.
With sub-agents, give the compare sheet, the key stills and the list above to a fresh-eyes sub-agent while you check the sound and the zooms: it reports every tile that differs. Fix every gap before showing. The user should never be the one to spot it.
在同一时间点将原片放在上方、复刻视频放在下方:
bash
ffmpeg -v error -y -i W/reel.mp4 -i video-agent/edits/<slug>/final.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
逐图块检查:
  • 字体大小和字重
  • 贴纸和 Logo 的尺寸(占满空间的效果应与原片一致)
  • 调色
  • 原片采用硬切的位置不能出现淡入淡出
  • 字幕不得遮挡嘴部
  • 不得出现上下颠倒的内容
也要对复刻视频运行频谱图分析:音效命中点必须落在剪切点上,节拍在人声下的电平必须与原片一致。在复刻视频的接触表上测量脸部尺寸:变焦次数不得超过原片,脸部不能比原片更大。
使用 sub-agent 时,将对比表、关键静帧和上述检查项交给一个具备全新视角的 sub-agent,同时你检查声音和变焦;由它报告每一个存在差异的图块。展示前修复所有差异,绝不能让用户来发现问题。

6. Deliver

6. 交付

Open
final.mp4
, then tell the user in a few lines:
  • what was measured (seconds per shot, BPM, music level, zooms)
  • what was copied, and what was left out and why
  • where the style lives
From now on,
/short-editing <take> style <name>
uses it. Each time the user rejects something, write it in the style file. When the lesson is general, add it to references/learnings.md.
打开
final.mp4
,然后用几行文字告诉用户:
  • 量化了哪些内容(每个镜头的时长、BPM、音乐电平、变焦)
  • 复制了哪些内容,以及省略了哪些内容和原因
  • 风格文件保存在哪里
从此以后,
/short-editing <take> style <name>
就会使用该风格。每次用户否决某项内容时,都将其写入风格文件。如果某条经验具有普遍性,则将其添加到 references/learnings.md。