videocut-clip

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese
<!-- input: 删除任务 TodoList(口误+静音) output: 剪辑后视频、字幕文件 pos: 执行 skill,用户确认删除任务后调用 架构守护者:一旦我被修改,请同步更新: 1. ../README.md 的 Skill 清单 2. /CLAUDE.md 路由表 -->
<!-- input: Deletion Task TodoList (verbal slips + silent segments) output: Edited video, subtitle file pos: Execute the skill, called after the user confirms the deletion task Architecture Guardian: Once I am modified, please update synchronously: 1. Skill list in ../README.md 2. Routing table in /CLAUDE.md -->

剪辑

Editing

执行删除 → 重新审查 → 循环直到零口误 → 生成字幕
Execute deletion → Re-review → Loop until no verbal slips → Generate subtitles

快速使用

Quick Start

用户: 确认,执行剪辑
用户: 全删
用户: 保留静音3和5,其他都删
User: Confirm, execute editing
User: Delete all
User: Keep silent segments 3 and 5, delete the rest

前置条件

Prerequisites

需要先执行
/videocut:剪口播
生成删除任务 TodoList
You need to first execute
/videocut:edit-voiceover
to generate the Deletion Task TodoList

流程

Workflow

1. 读取用户确认的删除任务
2. 计算保留时间段
3. 生成 FFmpeg filter_complex
4. 执行剪辑
5. 重新转录 + 审查 ←───┐
    ↓                   │
   有口误? ──是─────────┘
    ↓ 否
6. 生成字幕(SRT)
7. 完成
1. Read the user's confirmed deletion tasks
2. Calculate the reserved time segments
3. Generate FFmpeg filter_complex
4. Execute editing
5. Re-transcribe + Review ←───┐
    ↓                   │
   Any verbal slips? ──Yes─────────┘
    ↓ No
6. Generate subtitles (SRT)
7. Complete

进度 TodoList

Progress TodoList

启动时创建:
- [ ] 确认删除任务
- [ ] 执行 FFmpeg 剪辑
- [ ] 重新转录审查
- [ ] 生成字幕
循环时更新版本号(v2→v3→...)

Created at startup:
- [ ] Confirm deletion tasks
- [ ] Execute FFmpeg editing
- [ ] Re-transcribe and review
- [ ] Generate subtitles
Update the version number during loops (v2→v3→...)

一、读取删除任务(时间戳驱动)

I. Read Deletion Tasks (Timestamp-driven)

/videocut:剪口播
输出的 TodoList 读取。直接使用时间戳,不要搜索文本
口误(N处):
- [x] 1. `(start-end)` 删"错误文本" → 保留"正确文本"  ← 勾选=删除

语气词(N处):
- [x] 1. `(前字end-后字start)` 删"嗯"  ← 勾选=删除

静音(N处):
- [x] 1. `(start-end)` 静音Xs  ← 勾选=删除
- [ ] 2. `(start-end)` 静音Xs  ← 未勾选=保留
Read from the TodoList output by
/videocut:edit-voiceover
. Use timestamps directly, do not search for text:
Verbal slips (N instances):
- [x] 1. `(start-end)` Delete "incorrect text" → Keep "correct text"  ← Checked = Delete

Fillers (N instances):
- [x] 1. `(previous word end - next word start)` Delete "um"  ← Checked = Delete

Silent segments (N instances):
- [x] 1. `(start-end)` Delete silent segment of Xs  ← Checked = Delete
- [ ] 2. `(start-end)` Delete silent segment of Xs  ← Unchecked = Keep

⚠️ 关键规则

⚠️ Key Rules

  1. 直接用时间戳:从
    (start-end)
    解析,不要搜索文本
  2. 不要重新搜索:审查稿已经计算好精确时间戳
  3. 勾选 = 删除,未勾选 = 保留

  1. Use timestamps directly: Parse from
    (start-end)
    , do not search for text
  2. Do not re-search: The review draft has already calculated precise timestamps
  3. Checked = Delete, Unchecked = Keep

二、FFmpeg 命令

II. FFmpeg Command

bash
ffmpeg -y -i input.mp4 \
  -filter_complex_script filter.txt \
  -map "[outv]" -map "[outa]" \
  -c:v libx264 -crf 18 -c:a aac \
  output.mp4
bash
ffmpeg -y -i input.mp4 \
  -filter_complex_script filter.txt \
  -map "[outv]" -map "[outa]" \
  -c:v libx264 -crf 18 -c:a aac \
  output.mp4

filter.txt 格式

filter.txt Format

[0:v]trim=start=0:end=1.36,setpts=PTS-STARTPTS[v0];
[0:a]atrim=start=0:end=1.36,asetpts=PTS-STARTPTS[a0];
[0:v]trim=start=2.54:end=10.5,setpts=PTS-STARTPTS[v1];
...
[v0][a0][v1][a1]...concat=n=N:v=1:a=1[outv][outa]

[0:v]trim=start=0:end=1.36,setpts=PTS-STARTPTS[v0];
[0:a]atrim=start=0:end=1.36,asetpts=PTS-STARTPTS[a0];
[0:v]trim=start=2.54:end=10.5,setpts=PTS-STARTPTS[v1];
...
[v0][a0][v1][a1]...concat=n=N:v=1:a=1[outv][outa]

三、重新转录审查

III. Re-transcribe and Review

剪辑后必须:
  1. 用 FunASR 重新转录
  2. 检查是否还有口误
  3. 有 → 回到
    /videocut:剪口播
    重新识别
  4. 无 → 生成字幕

After editing, you must:
  1. Re-transcribe using FunASR
  2. Check for any remaining verbal slips
  3. If yes → Return to
    /videocut:edit-voiceover
    to re-identify
  4. If no → Generate subtitles

四、输出文件

IV. Output Files

01-xxx-v2.mp4              # 剪辑后视频
01-xxx-v2_transcript.json  # 重新转录(验证用)
01-xxx-v2.srt              # 字幕文件
版本递增:v1→v2→v3...

01-xxx-v2.mp4              # Edited video
01-xxx-v2_transcript.json  # Re-transcription (for verification)
01-xxx-v2.srt              # Subtitle file
Version increment: v1→v2→v3...

五、反馈记录

V. Feedback Records

2026-01-15

2026-01-15

  • 语气词删除边界不精确:删语气词时把前面的字也删了
    • 原因:直接用语气词的时间戳删除
    • 正确:从前一字 end 到后一字 start
  • 语气词 + 静音要一起删
    A [静音] 语气词 B
    要删整段 (A.end - B.start)
  • 教训:删除语气词时,边界是
    前一字.end
    后一字.start
  • Inaccurate boundary for filler deletion: Deleted the preceding word along with the filler when deleting fillers
    • Cause: Directly used the filler's timestamp for deletion
    • Correct approach: From the end of the preceding word to the start of the next word
  • Delete fillers + silent segments together: For
    A [silent segment] filler B
    , delete the entire segment (A.end - B.start)
  • Lesson: When deleting fillers, the boundary is from
    preceding word.end
    to
    next word.start

2026-01-14

2026-01-14

  • 口误文字没删干净,只删了静音段
  • 教训:直接从 TodoList 读取时间戳,不要重新查找
  • "拉满新"删成了"会的时候":搜索"拉满新"时间戳跨度7秒(含6秒静音),把"拉满"也删了
    • 教训:对于"删前面保后面"的口误,只删差异部分
  • "AI就是AI"出现两次AI:只删了"就是",没删第一个"AI"
    • 教训:替换型口误必须删完整的第一个版本
  • 系统性解决:时间戳驱动,审查稿直接标注
    (start-end)
    ,剪辑脚本不再搜索文本
  • Verbal slip text was not completely deleted, only the silent segments were deleted
  • Lesson: Read timestamps directly from the TodoList, do not re-search
  • "拉满新" was deleted into "会的时候": The timestamp span for searching "拉满新" was 7 seconds (including 6 seconds of silence), which also deleted "拉满"
    • Lesson: For verbal slips where "delete the front part and keep the back part", only delete the differing segment
  • "AI就是AI" had two instances of "AI": Only deleted "就是", not the first "AI"
    • Lesson: For replacement-type verbal slips, the entire first version must be deleted
  • Systematic solution: Timestamp-driven, the review draft directly marks
    (start-end)
    , and the editing script no longer searches for text