# Videocut:字幕

> 字幕生成与烧录。火山引擎转录 + 词典纠错 + 审核 + 烧录。

- Skill: `hwj123hwj/videocut-2` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add hwj123hwj/videocut-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/hwj123hwj/videocut-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: hwj123hwj (https://skillmd.com/u/hwj123hwj)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/hwj123hwj/videocut-2

---


# 字幕

> 转录 → Agent校对 → 人工审核 → 烧录

## 流程

```
0. 自动查找视频（优先用剪口播产出的 _cut.mp4）
    ↓
1. 提取音频 + 上传
    ↓
2. 火山引擎转录（带热词）
    ↓
3. Agent 自动校对
    ↓
4. 人工审核确认
    ↓
5. 烧录字幕
```

## Step 0: 自动查找视频

**优先级**（从高到低）：
1. 用户传入的视频路径
2. 当前 output 目录下的 `剪口播/3_审核/*_cut.mp4`
3. 字幕烧录后的 `字幕/3_输出/*_字幕.mp4`

```bash
# 优先找剪辑后视频
CUT_VIDEO=$(find "$OUTPUT_DIR/剪口播/3_审核" -name "*_cut.mp4" -type f 2>/dev/null | head -1)
```

**关键**：字幕应该基于**剪辑后的视频**生成，而不是原始视频。

## Step 1-2: 转录

```bash
# 提取音频
ffmpeg -i "$VIDEO_PATH" -vn -acodec libmp3lame -y audio.mp3

# 上传到 uguu.se
curl -s -F "files[]=@audio.mp3" https://uguu.se/upload

# 转录（带热词）
bash ../剪口播/scripts/volcengine_transcribe.sh "https://o.uguu.se/xxxxx.mp3"
```

## Step 3: Agent 自动校对

### 3.1 生成带时间戳的字幕

```javascript
const result = JSON.parse(fs.readFileSync('volcengine_result.json'));
const subtitles = result.utterances.map((u, i) => ({
  id: i + 1,
  text: u.text,
  start: u.start_time / 1000,
  end: u.end_time / 1000
}));
fs.writeFileSync('subtitles_with_time.json', JSON.stringify(subtitles, null, 2));
```

### 3.2 Agent 校对

**转录后，Agent 必须逐条阅读全部字幕，手动校对以下问题：**

### 校对原则

1. **只改不加**：校对只能修正识别错误，绝不能往字幕里添加视频中没说的话
2. **人名必查**：词典里的人名即使加了热词，火山引擎仍可能识别错
3. **碎片合并**：被拆成两条的字幕要合并
4. **不要自作主张**：发现可疑内容时标记留给人工审核

### 常见误识别

| 误识别 | 正确 | 类型 |
|--------|------|------|
| 成风 | 成峰 | 同音字 |
| 正特/整特 | Agent | 误识别 |
| IT就 | Agent就 | 发音相似 |
| edge的叉100 | Agentx100 | 误识别 |
| cloud code | Claude Code | 发音相似 |
| Schill/skill | skills | 发音相似 |
| 剪口拨/剪口波 | 剪口播 | 同音字 |
| 自净化/资金化 | 自进化 | 同音字 |
| 减口播 | 剪口播 | 同音字 |
| 录剪 | 漏剪 | 同音字 |
| 作为这个 | 做这个 | 同音字 |
| 斜杠V1/斜杠v | /v | 口语描述 |
| 斜杠v点口拨 | /v.口播 | 口语+同音 |
| a p i t/APIK | API Key | 误识别 |
| excuse | skills | 误识别 |
| 移完了 | 剪完了 | 同音字 |

### 常见漏字问题

| 原文 | 修正 | 说明 |
|------|------|------|
| 步呢是配置 | 第二步呢是配置 | 漏"第二" |
| 4步就是 | 第4步就是 | 漏"第" |
| 别省时间 | 特别省时间 | 漏"特" |
| 这个我们的 | 这个是我们的 | 漏"是" |
| 在里面看到 | 可以在里面看到 | 漏"可以" |
| 跟大家处理完 | 跟大家讲完 | 用词不当 |
| 剪辑了逻辑 | 剪辑的逻辑 | 语法错误 |

## Step 4: 审核

```bash
node ../字幕/scripts/subtitle_server.js 8898 "video.mp4"
```

访问 http://localhost:8898

功能：视频播放、字幕编辑、倍速播放、导出 SRT、烧录

## Step 5: 烧录

**默认样式**：22号金黄粗体、黑色描边2px、底部居中

```bash
ffmpeg -i "video.mp4" \
  -vf "subtitles='video.srt':force_style='FontSize=22,FontName=PingFang SC,Bold=1,PrimaryColour=&H0000deff,OutlineColour=&H00000000,Outline=2,Alignment=2,MarginV=30'" \
  -c:a copy \
  -y "video_字幕.mp4"
```

| 参数 | 值 | 说明 |
|------|------|------|
| FontSize | 22 | 字体大小 |
| PrimaryColour | &H0000deff | 金黄色 |
| Alignment | 2 | 底部居中 |

## 字幕规范

| 规则 | 说明 |
|------|------|
| 一屏一行 | 不换行，不堆叠 |
| 句尾无标点 | `你好` 不是 `你好。` |
| 句中保留标点 | `先点这里，再点那里` |

---

## 对照原稿校对（如有原稿）

如果有原稿/脚本，可以辅助校对，但**不要用脚本自动匹配**（文字差异会导致时间戳累积错误）。

#### ⚠️ 原稿校对的关键规则

- **原稿没有 = 必须删除**：字幕基于 _cut.mp4（剪辑后视频），原稿里没有的内容说明在剪口播阶段已经被剪掉了，转录出现是火山引擎的幻觉或错误识别，必须删除
- **绝不能从原稿往字幕里"补"内容**：原稿里有但转录没有的话，说明视频里确实没说，不能硬加进去
- **校对方向是单向的**：只能用原稿来验证转录是否正确，不能用原稿来"补充"转录
- **产品名以原稿为准**：如原稿要求用英文名（如 Kling 而非可灵），所有字幕统一替换

---

## 反馈记录

### 2026-02-10
- **重要**：字幕必须基于剪辑后的视频（`*_cut.mp4`），不能用原始视频
- **严重教训：校对只改不加**：火山引擎转录没有的内容，绝不能从原稿里"补"进字幕。案例：转录是"已经算领先了"，Agent 错误地从原稿补了一条"已经遥遥领先"，实际上视频已经剪掉了这段
- **严重教训：原稿没有 = 删除**：原稿里没有的内容，说明剪口播阶段已经剪掉，必须删除
- **人名必查**：词典热词不保证 100% 识别。案例："成峰"在词典里，火山引擎仍识别成"乘风"，Agent 校对时漏掉了

### 2026-01-31
- 火山引擎支持热词，已集成到转录脚本
- Agent 转录后需要自动校对，不能直接交给用户
- **重要**：Agent 校对必须手动逐条阅读，不能用脚本自动匹配
- 漏字问题比误识别更难发现，需要特别注意

