最近刷到 browser-use 团队开的新坑——video-use(让 Claude Code 帮你剪视频)。我看了一下仓库,11.5k Stars,2 个月前才创建,刚好我手边有个 15 秒的搞笑视频,就拿来实测了一下。
仓库地址:https://github.com/browser-use/video-use
整个流程我从头跑了一遍,有坑有收获,今天一次性写给你看。
一句话:把视频剪辑变成「聊天」。
你把原始素材扔到一个文件夹里,对 Claude Code 说一句"帮我剪",它吐给你 final.mp4。口播视频自动去掉 umm、uh、卡壳,旅行视频自动选最好的镜头,口播 + 画面 + 字幕一条龙。
适用:口播 / 蒙太奇 / 教程 / 旅行 / 采访,不挑内容。
不适合:需要精细时间线的专业剪辑(这种还是用 DaVinci)。
素材:一段 15 秒的搞笑配音(剑仙梗),从 Fabubu 缓存里扒出来的。
00:00-02:76 "你看一表盘有个红色小人背把剑"
03:42-08:60 "那是故障灯 不是剑仙吗 我以为你隐藏技能要启
动了 对 启动后你就得下去推车"
12:16-13:72 "那还是让他继续修仙吧"
中间有 4-5 秒的空白期,按传统剪辑思路,这就是废素材,得剪掉。
git clone https://github.com/browser-use/video-use ~/Developer/video-use
cd ~/Developer/video-use
uv sync
brew install ffmpeg # Windows 上用 choco 或 scoop
依赖就这些:requests / librosa / matplotlib / pillow / numpy,不重。
这是 video-use 的第一个依赖:ElevenLabs Scribe API(视频转写服务)。
transcribe.py 默认用 ElevenLabs 的 Scribe 模型(词级时间戳 + 说话人识别 + 音频事件),输出的 JSON 写到 edit/transcripts/<name>.json。
但 ElevenLabs 要 API Key,免费额度 1 万字符/月。
我没有 ElevenLabs Key,就用本地 faster-whisper 替代了。代码核心就是:
from faster_whisper import WhisperModel
model = WhisperModel("small", device="cpu", compute_type="int8")
segments, info = model.transcribe("audio.wav", word_timestamps=True, language="zh")
# 关键:把 faster-whisper 输出转成 video-use 期望的 Scribe JSON 格式
scribe_format = {
"language_code": info.language,
"text": "...",
"words": [
{"text": "你", "start": 0.56, "end": 0.78, "type": "word", "speaker_id": "speaker_0"},
{"text": " ", "start": 0.78, "end": 0.82, "type": "spacing"},
{"text": "看", "start": 0.82, "end": 1.05, "type": "word", "speaker_id": "speaker_0"},
...
]
}
我的 15 秒素材,small 模型 4.7 秒转完,52 个词,3 个 silence gaps。
这一步是 video-use 最贵的依赖。十一哥实验室内部用 ElevenLabs 主要图省事(说话人识别准 + 中文词级时间戳精确),如果你不想花钱,faster-whisper 完全够用——只是没有说话人自动区分(diarization),所有人会被标成 speaker_0。
takes_packed.mdpython helpers/pack_transcripts.py --edit-dir ./edit
video-use 把转写 JSON 按"短语级别"重新打包:停顿超过 0.5 秒就断成一句,每句前面加 [start-end] 时间戳。
我的素材打包完只有 0.5 KB:
# Packed transcripts
Phrase-level, grouped on silences ≥ 0.5s or speaker change.
Use `[start-end]` ranges to address cuts in the EDL.
## source (duration: 13.2s, 3 phrases)
[000.56-002.76] S0 你看 一 表 盤 有 个 红 色 小 人 背 把 剑
[003.42-008.60] S0 那 是 故 障 灯 不是 剑 仙 吗 我 以 为 你 隐 藏 技 能 要 启 动 了 对 启 动 后 你就 得 下去 推 车
[012.16-013.72] S0 那 还是 让 他 继 续 修 仙 吧
这就是 LLM 真正阅读的"视图"——1 小时素材压成几十 KB 文本。
python helpers/timeline_view.py source.mp4 0 14 \
--transcript edit/transcripts/source.json \
-o edit/timeline_full.png
timeline_view.py 抽 10 帧画面 + 波形 + 词标签 + 静音区间,合成一张 1920×540 的 PNG。

我用的时候这个图是 LLM 在决策点调用的——比如「这里停顿有点长,要不要切?」、「两个 take 哪个更好?」,LLM 会针对具体时间段拉一张图来对比。不是全片都生成,只在决策点按需调用,所以 token 消耗可控。
EDL(Edit Decision List)就是视频版的「剪辑决策表」:
{
"version": 1,
"sources": {
"source": "C:/Users/Administrator/videos/test-demo/source.mp4"
},
"ranges": [
{"source": "source", "start": 0.56, "end": 2.76,
"beat": "HOOK", "quote": "你看 一 表 盤 有 个 红 色 小 人 背 把 剑",
"reason": "开头钩子:识别仪表盘上的红色小人符号"},
{"source": "source", "start": 3.42, "end": 8.60,
"beat": "CONTEXT", "quote": "那 是 故 障 灯 不是 剑 仙 吗",
"reason": "反转澄清:其实是故障灯不是修仙"},
{"source": "source", "start": 12.16, "end": 13.72,
"beat": "OUTRO", "quote": "那 还是 让 他 继 续 修 仙 吧",
"reason": "结尾笑点:让他继续修仙"}
],
"grade": "warm_cinematic",
"overlays": [],
"subtitles": "edit/master.srt",
"total_duration_s": 8.94
}
真实场景里这一步是 Claude Code 自己读 takes_packed.md 然后生成 EDL,我手写只是为了测试渲染管线。
python helpers/render.py edit/edl.json -o edit/final.mp4 --draft
渲染过程分三段:
extracting 3 segment(s) → clips_draft/
[00] source 0.56- 2.76 ( 2.20s) HOOK
[01] source 3.42- 8.60 ( 5.18s) CONTEXT
[02] source 12.16- 13.72 ( 1.56s) OUTRO
concat → base_draft.mp4
loudness normalization → social-ready (-14 LUFS / -1 dBTP / LRA 11)
loudnorm (1-pass preview) → final.mp4
done: edit/final.mp4 (1.5 MB)
渲染结果:
- 原始:15.03 秒、1.7 MB
- 渲染后:9.09 秒、1.5 MB
- 中间 5 秒空白(停顿区)被剪掉了
坑 1:Windows 上的 encoding
跑 pack_transcripts.py 直接报 UnicodeDecodeError: 'gbk' codec can't decode byte。
这是 video-use 的一个 Windows 兼容问题——json_path.read_text() 没指定 encoding,Windows 默认用 GBK,读 UTF-8 的中文就崩。
修法:
python -X utf8 helpers/pack_transcripts.py --edit-dir ./edit
-X utf8 强制 Python 用 UTF-8 模式。
坑 2:字幕字体是 Helvetica
render.py 的字幕样式硬编码了 FontName=Helvetica:
SUB_FORCE_STYLE = (
"FontName=Helvetica,FontSize=18,Bold=1,"
...
)
macOS 上没问题,Windows 上没这个字体,ffmpeg 会报"无法加载字体"。
修法:改 helpers/render.py 里的 SUB_FORCE_STYLE,把 Helvetica 改成系统有的字体。我用的是 SimHei(黑体)。
坑 3:ffmpeg filter 里 Windows 路径转义
带字幕的渲染会失败,因为 ffmpeg filter 里的 : 和 \ 被特殊解析:
Unable to open C:UsersAdministratorvideostest-demoeditmaster.srt
修法:路径里的 \ 变成 \\,: 变成 \::
escaped = path.replace("\\", "\\\\").replace(":", "\\:")
filter_str = f"[0:v]subtitles='{escaped}':force_style='...'"
video-use 的 SKILL.md 里写得很清楚:品味可以自由发挥,但生产正确性不能违反。
我把它翻译成中文:
-c copy 拼接——不要单 filtergraph 跑全程,否则加覆盖层会双重编码afade=t=in/out 防爆音setpts=PTS-STARTPTS+T/TB 重置时间基——否则覆盖窗口里会出现动画中间帧output_time = word.start - segment_start + segment_offsettimeline_view 在每个剪辑边界检查,3 次失败就告诉用户剩下没列的就属于「艺术自由」——字体、颜色、节奏、风格都可以根据素材自己判断。
适合:
- 经常做口播视频、不想学剪辑的人
- 拍了一堆素材想快速出成片的创作者
- 已经用 Claude Code / Codex / Hermes 的 agent 用户
- 想给现有工作流加「AI 编辑入口」的小团队
不适合:
- 需要精细时间线控制的专业剪辑师
- 多轨道合成、复杂调色的项目
- 不想花钱买 ElevenLabs 的项目(虽然可以用 faster-whisper 替代)
互动问题:你剪过最复杂的视频用了多久?想让 AI 帮你处理掉哪 80%?
小创 / 创见 AI 实验室
预加载评论
video-use 和 browser-use 同一个套路——给 LLM 结构化数据而不是原始像素。这思路很妙 | ElevenLabs Scribe 的时间戳精度真的高,词级时间码用在剪辑上很丝滑 | 12KB 的 transcript 喂给 Claude 居然就能剪辑,这是把 LLM 当编辑器用了 | Windows 上跑要改字体和路径转义,希望官方能加个 -–font 参数
💬 评论区