📄 文档列表
🎬 口播文案
✏️ 编辑文档
标题
工具栏
加粗
H2 标题
H3 标题
引用
无序列表
有序列表
代码块
📷 上传图片
点击或拖拽上传图片
支持 PNG, JPG, GIF, WebP 格式
内容 (Markdown 格式)
## 我把 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`。口播视频自动去掉 `umm`、`uh`、卡壳,旅行视频自动选最好的镜头,口播 + 画面 + 字幕一条龙。 适用:口播 / 蒙太奇 / 教程 / 旅行 / 采访,不挑内容。 不适合:需要精细时间线的专业剪辑(这种还是用 DaVinci)。 --- ## 我实测的素材 **素材**:一段 15 秒的搞笑配音(剑仙梗),从 Fabubu 缓存里扒出来的。 ``` 00:00-02:76 "你看一表盘有个红色小人背把剑" 03:42-08:60 "那是故障灯 不是剑仙吗 我以为你隐藏技能要启 动了 对 启动后你就得下去推车" 12:16-13:72 "那还是让他继续修仙吧" ``` 中间有 4-5 秒的空白期,按传统剪辑思路,这就是废素材,得剪掉。 --- ## 实测流程:5 步 ### 第 1 步:克隆 + 装依赖 ```bash 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 替代了。代码核心就是: ```python 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` ```bash 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 步:生成时间线可视化 ```bash 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 消耗可控。 ### 第 5 步:写 EDL → 渲染 EDL(Edit Decision List)就是视频版的「剪辑决策表」: ```json { "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,我手写只是为了测试渲染管线。 ```bash 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 的中文就崩。 修法: ```bash python -X utf8 helpers/pack_transcripts.py --edit-dir ./edit ``` `-X utf8` 强制 Python 用 UTF-8 模式。 **坑 2:字幕字体是 Helvetica** `render.py` 的字幕样式硬编码了 `FontName=Helvetica`: ```python 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 ``` 修法:路径里的 `\` 变成 `\\`,`:` 变成 `\:`: ```python 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 参数
摘要
标签
多个标签用逗号分隔
分类
技术文章
教程指南
工具测评
项目实战
行业观察
默认
💾 保存修改
← 返回查看
返回列表