---
name: videocut-clip
description: 执行视频剪辑。根据确认的删除任务执行FFmpeg剪辑，循环直到零口误，生成字幕。触发词：执行剪辑、开始剪、确认剪辑
metadata:
  version: "1.0.0"
  alias: "videocut:剪辑"
---

<!--
input: 删除任务 TodoList（口误+静音）
output: 剪辑后视频、字幕文件
pos: 执行 skill，用户确认删除任务后调用

架构守护者：一旦我被修改，请同步更新：
1. ../README.md 的 Skill 清单
2. /CLAUDE.md 路由表
-->

# 剪辑

> 执行删除 → 重新审查 → 循环直到零口误 → 生成字幕

## 快速使用

```
用户: 确认，执行剪辑
用户: 全删
用户: 保留静音3和5，其他都删
```

## 前置条件

需要先执行 `/videocut:剪口播` 生成删除任务 TodoList

## 流程

```
1. 读取用户确认的删除任务
    ↓
2. 计算保留时间段
    ↓
3. 生成 FFmpeg filter_complex
    ↓
4. 执行剪辑
    ↓
5. 重新转录 + 审查 ←───┐
    ↓                   │
   有口误? ──是─────────┘
    ↓ 否
6. 生成字幕（SRT）
    ↓
7. 完成
```

## 进度 TodoList

启动时创建：

```
- [ ] 确认删除任务
- [ ] 执行 FFmpeg 剪辑
- [ ] 重新转录审查
- [ ] 生成字幕
```

循环时更新版本号（v2→v3→...）

---

## 一、读取删除任务（时间戳驱动）

从 `/videocut:剪口播` 输出的 TodoList 读取。**直接使用时间戳，不要搜索文本**：

```
口误（N处）：
- [x] 1. `(start-end)` 删"错误文本" → 保留"正确文本"  ← 勾选=删除

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

静音（N处）：
- [x] 1. `(start-end)` 静音Xs  ← 勾选=删除
- [ ] 2. `(start-end)` 静音Xs  ← 未勾选=保留
```

### ⚠️ 关键规则

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

---

## 二、FFmpeg 命令

```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 格式

```
[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]
```

---

## 三、重新转录审查

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

---

## 四、输出文件

```
01-xxx-v2.mp4              # 剪辑后视频
01-xxx-v2_transcript.json  # 重新转录（验证用）
01-xxx-v2.srt              # 字幕文件
```

版本递增：v1→v2→v3...

---

## 五、反馈记录

### 2026-01-15
- **语气词删除边界不精确**：删语气词时把前面的字也删了
  - 原因：直接用语气词的时间戳删除
  - 正确：从前一字 end 到后一字 start
- **语气词 + 静音要一起删**：`A [静音] 语气词 B` 要删整段 (A.end - B.start)
- **教训**：删除语气词时，边界是 `前一字.end` 到 `后一字.start`

### 2026-01-14
- 口误文字没删干净，只删了静音段
- 教训：直接从 TodoList 读取时间戳，不要重新查找
- **"拉满新"删成了"会的时候"**：搜索"拉满新"时间戳跨度7秒（含6秒静音），把"拉满"也删了
  - 教训：对于"删前面保后面"的口误，只删差异部分
- **"AI就是AI"出现两次AI**：只删了"就是"，没删第一个"AI"
  - 教训：替换型口误必须删完整的第一个版本
- **系统性解决**：时间戳驱动，审查稿直接标注 `(start-end)`，剪辑脚本不再搜索文本
