- name
- srt-translator
- description
- 字幕翻译助手。将 .srt 字幕文件翻译成指定语言,保持时间轴和格式不变。
当用户提到"翻译字幕"、"translate subtitle"、"srt翻译"、"字幕翻译"、"把字幕转成"时触发此 skill。
适用于视频后期制作、多语言内容发布、播客国际化等场景。
- tags
- ["subtitle","translation","srt","i18n","video-production"]
# SRT 字幕翻译助手
将 SRT 字幕文件翻译成指定语言,保持时间轴、序号和格式不变。
## 何时使用
- 用户要求翻译 .srt 文件
- 需要将字幕转换为其他语言
- 批量翻译多个字幕文件
- 翻译视频字幕用于多语言发布
## 执行步骤
### 1. 读取并解析 SRT 文件
使用 read 工具读取源文件,按以下格式解析:
```
序号
时间轴 (HH:MM:SS,mmm --> HH:MM:SS,mmm)
字幕文本(可有多行)
空行(分隔条目)
```
解析规则:
- **序号行**:纯数字
- **时间轴行**:包含 `-->` 分隔起始和结束时间
- **文本行**:字幕内容,可能包含 `[说话人X]` 标记
- **空行**:表示一个字幕条目结束
### 2. 提取待翻译文本
从每个字幕条目中提取文本内容:
- 跳过序号行和时间轴行
- 提取文本行
- 保留说话人标记(如 `[说话人1]`),只翻译标记后的实际内容
### 3. 术语提取与管理(关键步骤)
在翻译前先提取术语,确保全文术语一致:
**步骤 3a:提取候选术语**
读取全部字幕文本,识别可能的专业术语、人名、产品名、技术名词等。
**步骤 3b:生成术语表**
向 LLM 请求术语翻译:
```
请从以下字幕内容中提取专业术语、技术名词、人名、产品名等,
并给出{目标语言}的标准译法。格式:原文|译文
字幕内容:
[全部字幕文本]
要求:
1. 技术术语优先采用业界通用译法
2. 品牌名/产品名可选择保留原文或音译
3. 缩写词首次出现时给出全称
4. 歧义项列出所有可能译法并标注推荐
5. **中文中已出现的英文术语**(如 AI、GPU、API 等):英文字幕中直接沿用,不重复翻译
```
**步骤 3c:保存术语表**
将术语表保存到项目目录,文件名:`{srt文件名}_glossary_{语言代码}.md`
格式示例:
```markdown
# 术语表:test1 → English
| 原文 | 译文 | 备注 |
|------|------|------|
| 大模型 | AI model | |
| 豆包 | Doubao | 产品名,保留原文 |
| 播客 | podcast | |
| AI | AI | 中文中已出现的英文术语,直接沿用 |
```
**步骤 3d:用户确认术语表(可选但推荐)**
- 如果术语表中有不确定的翻译,展示给用户确认
- 用户可以修改、添加或删除术语条目
- 确认后的术语表用于后续翻译
### 4. 翻译文本
使用 LLM 翻译提取的文本,注入术语表确保一致性:
**高效翻译策略(大文件 >100条必须遵循)**:
1. **脚本预处理合句**:翻译前用脚本计算合并组,减少翻译条目数
```bash
# 基于同说话人+间隙<300ms+语义不完整自动合并
python merge_srt.py video_en.srt _merged_groups.txt
```
合并后条目通常减少 40-60%,大幅降低翻译工作量。
2. **分批并行翻译**:将合并后的条目拆成 3-4 批,每批 40-60 条,并行启动子任务翻译
- 每批任务独立工作,互不依赖
- 翻译完成后用脚本合并为最终 SRT
3. **脚本做数字转换**:翻译时不逐条手工转换数字,翻译完成后用 merge_srt.py 的 `num_to_chinese()` 批量处理
4. **集中翻译,减少来回**:每批一次翻译完直接写入,不用反复 edit 追加
- ✅ 一批 50 条 → 一次 write 写入
- ❌ 一批 50 条 → 5 次 edit 追加
**翻译策略**:
- 分批次翻译(每批 20-30 条,避免超出上下文长度)
- 每次翻译时附带术语表,同时附带上一条和下一条的原文作为上下文
- 保持说话人标记不变
- 处理口语化表达(播客、访谈类)
- 技术术语严格遵循术语表
- ⚠️ **口语化优先**:用中国网民的自然表达,不要直译
例:`extremely bullish` → `涨疯了`,不是 `极度看涨`;`reversed lower` → `反手就跌了`
- ⚠️ **非术语英文不留**:AI/GPU/ETF/MACD 等业界通用缩写保留,但普通英文词("setup"/"anyway")必须翻译
- ⚠️ **字数控时**:根据字幕时间轴控制翻译字数,按中文正常语速约 4 字/秒计算
例:时间轴 3 秒 → 最多 12 字 | 5 秒 → 最多 20 字 | 8 秒 → 最多 32 字
超时必须精简,宁可拆分也不让 TTS 被迫加速
**提示词模板**:
```
请将以下字幕翻译成{目标语言}。
【术语表】(必须严格遵循):
{术语表内容}
【翻译要求】:
1. 保持 [说话人X] 标记不变
2. ⚠️ 口语化优先:用中国网民的日常表达,不要直译。反例:"极度看涨"→正例:"涨疯了"
3. 术语必须严格使用术语表中的译法
4. ⚠️ 字数控时:按中文语速 4 字/秒计算最大字数。时长3秒→最多12字,5秒→20字,超时精简
5. 同一概念在全文中翻译必须一致
6. ⚠️ 数字转文字:所有数字翻译成中文全文字形式。2%→百分之二,2026年→二零二六年,50,000→五万
7. ⚠️ 语义不截断:如果原文一句话被拆到多条字幕中,合并为一条完整语义
8. ⚠️ 同人不截断:同一说话人、间隙<300ms,合并为一条
9. ⚠️ 非术语英文不留:翻译结果中不能有非术语英文单词。金融术语(如 AI、GPU、ETF、MACD)保留,
但普通英文词(如 "setup"、"anyway"、"basically")必须翻译成中文
【字幕列表】:
1. [原文1]
2. [原文2]
...
```
### 5. 重构 SRT 文件
将翻译后的文本替换回原位置:
- 序号 → 不变
- 时间轴 → 不变
- 文本 → 翻译后的内容
- 空行 → 不变
### 6. 配音用字幕后处理(关键步骤)
翻译完成后、输出前,对字幕进行**配音优化**处理。
**为什么要做这一步**:原字幕是给人看的,视觉上可以跨行理解。但配音是给 TTS 引擎听的,每条字幕会被独立克隆——如果一条字幕内容是半句话(如"...发现"),TTS 会用错误的语调收尾,导致配音不自然。
**步骤 6a:识别不完整条目**
遍历所有字幕条目,标记以下情况:
- 文本末尾不是句末标点(。!?…)的条目 → 语义不完整
- 与下一条时间间隙 < 300ms 且文本可自然衔接 → 同人连续说话
- 文本中包含阿拉伯数字(0-9)→ 需要数字转文字
**步骤 6b:合并规则**
| 条件 | 操作 |
|------|------|
| 上条不完整 + 下条可衔接 | 合并为一条,时间轴取上条开始→下条结束 |
| 连续2条都不完整 | 继续向下合并,直到遇到句末标点(最多合并4条) |
| 间隙 < 300ms + 同语义 | 合并,即使上条有句末标点(说话人未停顿) |
**步骤 6c:数字转文字**
合并完成后,将所有阿拉伯数字替换为目标语言的全文字形式:
| 英文 | 中文 |
|------|------|
| 2% | 百分之二 |
| 5.5% | 百分之五点五 |
| 2026 | 二零二六年(年份)/ 两千零二十六(数量) |
| 50,000 | 五万 |
| 1.5 | 一点五 |
| #1 / No.1 | 第一 |
| $100 | 一百美元 |
| 3rd | 第三 |
**步骤 6d:输出合并后的 SRT**
- 重新编号(1, 2, 3... 连续)
- 文件名:`{原文件名}_dub.srt`(如 `video_zh_dub.srt`)
- 同时保留未合并的原版 SRT(给 subburn 烧字幕用)
### 步骤 7:输出文件
### 步骤 7:输出文件
- 生成配音优化版 SRT 文件
- 文件名格式:`原文件名_{语言代码}_dub.srt`(如 `video_zh_dub.srt`)
- 编码:UTF-8 with BOM
- 行尾:保持 LF
> ⚠️ 不输出原版字幕(未合句版),因为后续 align-video 会导致时间戳漂移。
> 烧字幕用的最终字幕在步骤11由 volc-srt 重新生成。
## 语言代码
| 语言 | 代码 |
|------|------|
| 中文 | zh |
| 英文 | en |
| 日文 | ja |
| 韩文 | ko |
| 法文 | fr |
| 德文 | de |
| 西班牙文 | es |
| 俄文 | ru |
| 葡萄牙文 | pt |
| 意大利文 | it |
| 阿拉伯文 | ar |
## 说话人标记处理
**保留标记**:
- 原始:`[说话人1] 欢迎收听`
- 翻译:`[说话人1] Welcome to`
**标记格式**:
- 方括号格式:`[说话人X]`、`[Speaker X]`
- 可根据源语言自动识别
## 口语化翻译指南
### 常见处理
| 中文原文 | 英文翻译建议 |
|---------|------------|
| 咱们 | let's / we |
| 哈喽 | hello / hi |
| 啊 / 呃 | uh / um(或省略) |
| 来看一下 | let's take a look |
| 聊一聊 | let's talk about |
| 挺...的 | quite / pretty |
### 播客/访谈类
- 保留自然流畅的对话感
- 适当省略无意义的填充词
- 保持句子简短(适合字幕阅读)
## 术语管理指南
### 为什么需要术语管理
长字幕文件(如播客、课程)中,同一术语可能出现数十次:
- **无术语表**:第 3 条翻译为"大语言模型",第 50 条翻译为"大规模语言模型",第 120 条又变成"LLM"——前后不一致
- **有术语表**:所有出现统一译为"large language model (LLM)",专业且一致
### 术语提取时机
**自动提取**:翻译前自动扫描全部字幕,生成术语表草案
**用户补充**:用户可以添加术语表中遗漏的条目
**后续复用**:同一项目的多个字幕文件可共享术语表
### 术语表位置
默认保存到与源 SRT 文件同一目录:
```
test/
├── test1.srt # 源文件
├── test1_en.srt # 翻译后文件
└── test1_glossary_en.md # 术语表
```
## 质量检查清单
翻译完成后检查:
- [ ] 时间轴格式正确(`HH:MM:SS,mmm --> HH:MM:SS,mmm`)
- [ ] 序号连续无遗漏
- [ ] 空行分隔每个条目
- [ ] 说话人标记保留
- [ ] **术语一致性**:同一术语在全文中翻译一致
- [ ] 文本长度适中(单行不超过 40 字)
- [ ] 编码正确(UTF-8)
- [ ] 术语表已保存(如适用)
## 示例
### 示例 1:单文件翻译(含术语管理)
**输入**:test/test1.srt
```
1
00:00:01,790 --> 00:00:03,950
[说话人1] 欢迎收听豆包 AI 播客节目。
```
**执行过程**:
1. **读取字幕**:提取全部 8 条字幕文本
2. **提取术语**:
- 豆包 → Doubao(产品名)
- 播客 → podcast
- 大模型 → AI model
- AI → AI(中文中已出现的英文术语,直接沿用)
3. **生成术语表**:保存为 `test1_glossary_en.md`
4. **翻译字幕**:使用术语表统一翻译
5. **输出文件**:保存为 `test1_en.srt`
**术语表**:test/test1_glossary_en.md
```markdown
# 术语表:test1 → English
| 原文 | 译文 | 备注 |
|------|------|------|
| 豆包 | Doubao | 字节跳动产品名,保留拼音 |
| 播客 | podcast | |
| 大模型 | large language model | 首次出现可写全称 |
| 人工智能 | artificial intelligence (AI) | |
| 技术突破 | breakthrough | |
```
**输出**:test/test1_en.srt
```
1
00:00:01,790 --> 00:00:03,950
[Speaker 1] Welcome to the Doubao AI Podcast.
```
### 示例 2:批量翻译
用户请求:"翻译 test 目录下所有 srt 文件到英文"
执行步骤:
1. 扫描目录下所有 .srt 文件
2. 逐个读取、翻译、保存
3. 输出为 `*_en.srt`
## 输出格式
完成翻译后向用户报告:
```
✅ 翻译完成
📄 源文件: {原路径}
💾 输出文件: {新路径}
📖 术语表: {术语表路径}(如适用)
🎯 目标语言: {语言}
📊 翻译条目: {N} 条
📋 术语数量: {N} 个
```
## 注意事项
1. **备份原文件**:翻译前确认原文件已有备份
2. **检查编码**:确保输出为 UTF-8,避免乱码
3. **单行长度**:字幕文本建议每行不超过 40 个字符
4. **时间轴不变**:只翻译文本,绝不修改时间轴
5. **空行保留**:每个字幕条目之间必须有空行
6. **禁止使用 Python 脚本生成翻译输出**:🚨 绝对不要通过 bash + Python 脚本的方式将翻译内容写入 SRT 文件。原因:
- Windows PowerShell 下 Python 字符串中的中文转义极其容易出错
- 会导致大量调试重试,浪费时间
- 正确做法:直接使用 `write` 或 `edit` 工具写入翻译后的 SRT 文件
- 即使是几百条字幕,也直接逐批用 `write` 工具输出,不要绕道 Python
## 大文件翻译指南
当字幕条目超过 100 条时,采用以下策略:
1. **分批写入,而非逐条**:每批 30-50 条,用 `write` 工具追加到目标文件
2. **先写术语表,再翻译正文**:术语表写完后立即用 `write` 保存,不要等全部翻译完
3. **用 `edit` 工具追加**:后续批次用 `edit` 在文件末尾追加新内容
4. **禁止的操作**:
- ❌ `bash` + Python 脚本生成翻译 → PowerShell 转义地狱
- ❌ 一次性翻译 200+ 条而不分批写入 → 丢失进度风险
- ❌ 用 `bash` 的 `echo` 写中文内容 → 编码乱码
---
**版本**: v1.0
**最后更新**: 2026-05-03
**维护者**: Claude Code
Ver no GitHub