---
name: video-edit
description: "剪辑用户【已有的】口播视频——你直接重写成片应该说什么的脚本，系统用文本对齐回原始音频时间戳。

  必备前提：用户已经有视频文件（拍好的、上传的、或给出文件路径）。

  触发：用户上传/给出视频文件 + 说'剪一下'/'去卡顿'/'变流畅'/
  '剪辑'/'剪短点'/'加字幕'/'cut'/'edit'/'trim'/'让视频更紧凑'。"
version: 1.0.0
owner_repo: Optima-Chat/optima-gen
---

# Video-Edit Skill — Descript 模式：你写脚本，系统对齐

用户给原始视频，你交付剪好的成片。

## 用户怎么说，你交付什么

**默认所有剪辑都带字幕**——中文短视频 99% 需要字幕，"剪一下"的潜台词就是"给我能直接发的成片"。

| 用户说 | 你交付 |
|---|---|
| "剪一下" / "去卡顿" / "变流畅" | `<video>_subbed.mp4`（剪 + 字幕） |
| "剪成 X 秒短视频" / "30 秒" | `<video>_subbed.mp4`（压到目标时长 + 字幕） |
| "加字幕"（不需要剪） | `<video>_subbed.mp4`（仅字幕） |
| "剪一下不要字幕" / "无字幕版" | `<video>_edited.mp4` |

只有当用户提到平台但**没说目标时长**时（如"剪成 TikTok"无时长），才追问"目标多长？"。
其他情况**直接动手**，不要废话。

## 核心原则：你直接写最终脚本

剪辑工具有两种模式：
- **旧模式（`cut`）**：在 proposal 里给短语标 `#` 删除——只能删整段
- **新模式（`smart-cut`）✅ 默认用这个**：你直接写"成片应该说什么"，系统找原始音频里对应的位置剪出来

新模式的杀手锏是：你**不受短语边界限制**，可以：
- 跳过填充词（"嗯"/"那个"）
- NG 重拍中只保留你认为最好那遍
- 把同一句话的不同片段拼起来
- 保留某句的前半 + 另一句的后半

**约束**：
- 不能凭空造内容——脚本里的字必须出自原始转写，否则匹配不上
- 不能调换顺序——内容按原片时间顺序保留
- 字面错别字会"匹不上"被丢——必须用转写文本里的原字（whisper 怎么识的就怎么写）

## 你的内部流程

### 默认剪辑（剪 + 字幕，最常见）

```bash
video-edit analyze <video>
```

读 `<video>.work/cut_proposal.md` 了解原片内容（每行是个短语单元，带时间戳和文本）。

然后基于这些短语，**自己写一份最终脚本**到 `<video>.work/final_script.txt`：

**格式**：每个短语段两行——中文一行（带 `**关键词**` 标记，1-2 个），英文翻译一行；段与段之间空行。

```
做**跨境电商**是有**捷径**的
Cross-border e-commerce has shortcuts

我最不缺的
What I lack the least

就是**囤货**
It is just hoarding goods
```

写脚本时的判断：
- 原片每个 phrase，问自己"这句话进成片吗"——进就把内容（用 proposal 里的原文）写进脚本
- 同一意思被讲多遍（NG 重拍）——只写一遍，挑最流畅那遍的措辞
- 填充词/单字口头禅/跑题——直接不写
- 整段废话/犹豫——直接不写
- **中文必须用原文措辞**——不要润色或改写，否则匹配不上
- **每行 ≤ 10 个汉字**——超过会显示挤、可能溢出视频边界
- **`**关键词**` 标记 1-2 个**：挑能传达这句"重点信息"的实词（名词/动词），不要标助词、口头禅；短语里没明显重点就 0 个标记
- **英文翻译要地道、口语化**——给海外用户看的，不是直译。短句即可，可省略主语。

**写完后必做的自查（保存前）**：把 final_script 当成一段**连续口播稿**通读一遍——不是一行行检查，是**整体读**。问自己：

1. **同一件事说了两遍吗?**（NG 重拍最常见的坑：上一段和下一段措辞不同但说的是同一件事，比如"我做这个挺久了" + "做了三四年了"——属于同一意思，只留一段）
2. **逻辑有跳跃/断点吗?**（如果有，缺哪句话补哪句，前提是原片说过）
3. **任何一段是"上一段的翻版"吗?**（删一段）

**这一步不可省略**——`smart-cut` 现在会硬阻断字面 4+ 字重复，但语义级重复（同义不同字）只能靠你这一遍通读发现。

写完自查通过后：

```bash
video-edit smart-cut <video>
```

`smart-cut` 用 difflib 把脚本对齐回原始 word 时间戳。**如果输出 `[FAIL] 检测到字面重复`**：

1. 看报错指出的"第 X 段 vs 第 Y 段"
2. 打开 final_script.txt 删掉重复的那段（一般留措辞更流畅的那遍）
3. 重跑 `smart-cut`
4. 直到不再 FAIL 才能继续

**剪完之后必跑 review**（语义级 NG 兜底检测）：

```bash
video-edit review <video>
```

如果报告里有 `HARD: repeated-content`：删 `final_script.txt` 里对应的重复段，重跑 `smart-cut` + `review`，直到 HARD = 0。

review 通过后再烧字幕：

```bash
video-edit subtitle <video>
```

### 用户要求调整时

用户看完成片说某段不对：
1. 编辑 `<video>.work/final_script.txt`（加/删内容）
2. 删 `<video>.work/subs.ass`
3. 重跑 `smart-cut` + `subtitle`

### 限时长精剪（用户给了目标时长）

写 final_script 时**额外做这些**：
- 估算字数：中文口播 ~3-4 字/秒，30 秒约 90-120 字
- 找钩子句放最前面（脚本开头那段）
- 压到目标时长（更激进地删）

### 仅字幕（用户明确说不剪）

```bash
video-edit subtitle <video>
```

没有 `_edited.mp4` 时，命令直接对原片烧字幕。

### 无字幕版（用户明确说不要字幕）

```bash
video-edit analyze <video>
# 写 final_script.txt
video-edit smart-cut <video>
```

不跑 subtitle，交付 `<原片>_edited.mp4`。

## 写脚本的心法

读 proposal 时**逐 phrase 判断**：
1. 这句进成片吗？进 → 把 phrase 文本贴到 final_script
2. 这句和前后哪句重复？只留一遍
3. 这句是填充词/口头禅？跳过
4. 这句跑题？跳过

**关键纪律**：脚本里的字**必须**来自原始转写——直接复制 proposal 里的 phrase 文本最稳。
你想怎么润色都不行（系统按字符匹配，改了字就匹不上）。

**追求"看着不卡"，宁可激进**。删多了用户能要求加回来，删少了用户体验差。

## 交付怎么说

简洁，**只说结果**：

- ✅ "剪好了，xxx_subbed.mp4，时长 23 秒"
- ❌ "我用了 video-edit smart-cut，写了 final_script.txt..."

## 不要做的事

- ❌ 跳过 final_script 直接 smart-cut——会失败（找不到脚本文件）
- ❌ 在脚本里写转写以外的字——匹配不上，那部分会被丢
- ❌ 用 `both` 或 `cut`——已弃用，质量差
- ❌ 把命令名/路径暴露给用户——内部细节
- ❌ 用户说"剪掉前 X 秒"/"剪掉中间一段"——定点裁剪不是去卡顿，告诉用户"我擅长去卡顿停顿，定点裁剪请用别的方式"
- ❌ **跳过通读自查直接 smart-cut**——重复内容是用户最反感的问题，省这一步省不出去
- ❌ **跳过 review 直接 subtitle**——subtitle 烧完字幕的成片重复不可逆，必须先通过 review

## 命令参考（你内部用）

| 命令 | 用途 |
|---|---|
| `video-edit analyze <video>` | 转写 + 静音检测 + 生成 proposal（**默认入口**）|
| `video-edit smart-cut <video>` | 按 final_script.txt 对齐剪辑（**默认主力**）|
| `video-edit subtitle <video>` | 对成片重新转写 + 烧字幕，输出 `<原片>_subbed.mp4` |
| `video-edit cut <video>` | 旧模式：按 proposal 的 `#` 标记剪辑（弃用，质量差）|
| `video-edit both <video>` | 旧模式：analyze + cut 一步到位（弃用，跳过审片）|
| `video-edit review <video>` | 诊断用：检查 `_edited.mp4` |
