← 返回 我把 15 秒的"剑仙"视频喂给 video-use,3 句话剪成 9 秒成品
主题:

我把 15 秒的"剑仙"视频喂给 video-use,3 句话剪成 9 秒成品

最近刷到 browser-use 团队开的新坑——video-use(让 Claude Code 帮你剪视频)。我看了一下仓库,11.5k Stars,2 个月前才创建,刚好我手边有个 15 秒的搞笑视频,就拿来实测了一下。

仓库地址:https://github.com/browser-use/video-use

整个流程我从头跑了一遍,有坑有收获,今天一次性写给你看。


video-use 是干啥的

一句话:把视频剪辑变成「聊天」。

你把原始素材扔到一个文件夹里,对 Claude Code 说一句"帮我剪",它吐给你 final.mp4。口播视频自动去掉 ummuh、卡壳,旅行视频自动选最好的镜头,口播 + 画面 + 字幕一条龙。

适用:口播 / 蒙太奇 / 教程 / 旅行 / 采访,不挑内容。

不适合:需要精细时间线的专业剪辑(这种还是用 DaVinci)。


我实测的素材

素材:一段 15 秒的搞笑配音(剑仙梗),从 Fabubu 缓存里扒出来的。

00:00-02:76  "你看一表盘有个红色小人背把剑"
03:42-08:60  "那是故障灯 不是剑仙吗 我以为你隐藏技能要启
              动了  启动后你就得下去推车"
12:16-13:72  "那还是让他继续修仙吧"

中间有 4-5 秒的空白期,按传统剪辑思路,这就是废素材,得剪掉。


实测流程:5 步

第 1 步:克隆 + 装依赖

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,不重。

第 2 步:转写音频

这是 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

第 3 步:打包成 takes_packed.md

python 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 文本。

第 4 步:生成时间线可视化

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。

timeline full

我用的时候这个图是 LLM 在决策点调用的——比如「这里停顿有点长,要不要切?」、「两个 take 哪个更好?」,LLM 会针对具体时间段拉一张图来对比。不是全片都生成,只在决策点按需调用,所以 token 消耗可控。

第 5 步:写 EDL → 渲染

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 秒空白(停顿区)被剪掉了


我踩到的 3 个真实坑

坑 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 的 12 条硬规则

video-use 的 SKILL.md 里写得很清楚:品味可以自由发挥,但生产正确性不能违反

我把它翻译成中文:

  1. 字幕必须最后加——加在 filter chain 末尾,否则会被其他覆盖层挡住
  2. 分段提取后无损 -c copy 拼接——不要单 filtergraph 跑全程,否则加覆盖层会双重编码
  3. 每个分段边界加 30ms 音频淡入淡出——afade=t=in/out 防爆音
  4. 覆盖层用 setpts=PTS-STARTPTS+T/TB 重置时间基——否则覆盖窗口里会出现动画中间帧
  5. 主 SRT 用输出时间线偏移——output_time = word.start - segment_start + segment_offset
  6. 永远不要在词中间切——所有剪辑点对齐到 word 边界
  7. 每个剪辑边界要 pad——工作窗口 30-200ms(Scribe 时间戳有 50-100ms 漂移,pad 吸收掉)
  8. 只接受词级 ASR——不接受 SRT/phrase 模式(丢失亚秒级停顿信息)
  9. 每个素材的转写缓存——没改源文件就不要重新转写
  10. 多个动画用并行 sub-agents——一个动画一个 agent
  11. 永远不要重新转写——缓存优先
  12. 预览前先自评——渲染完跑 timeline_view 在每个剪辑边界检查,3 次失败就告诉用户

剩下没列的就属于「艺术自由」——字体、颜色、节奏、风格都可以根据素材自己判断。


它适合谁

适合
- 经常做口播视频、不想学剪辑的人
- 拍了一堆素材想快速出成片的创作者
- 已经用 Claude Code / Codex / Hermes 的 agent 用户
- 想给现有工作流加「AI 编辑入口」的小团队

不适合
- 需要精细时间线控制的专业剪辑师
- 多轨道合成、复杂调色的项目
- 不想花钱买 ElevenLabs 的项目(虽然可以用 faster-whisper 替代)


我的使用建议

  1. Windows 用户:先准备好改字体(SimHei)和路径转义
  2. 没有 ElevenLabs Key:用 faster-whisper 替代,自己写个 Scribe 格式转换器
  3. 第一次跑通流程后:把 prompt 和 patch 存到自己的 agent 技能里,下次直接调

互动问题:你剪过最复杂的视频用了多久?想让 AI 帮你处理掉哪 80%?

小创 / 创见 AI 实验室

预加载评论
video-use 和 browser-use 同一个套路——给 LLM 结构化数据而不是原始像素。这思路很妙 | ElevenLabs Scribe 的时间戳精度真的高,词级时间码用在剪辑上很丝滑 | 12KB 的 transcript 喂给 Claude 居然就能剪辑,这是把 LLM 当编辑器用了 | Windows 上跑要改字体和路径转义,希望官方能加个 -–font 参数

已复制到剪贴板!