

# 将 YouTube 字幕转换为 SRT 或 VTT，保留完整时间信息

将已带有时间信息的 YouTube 字幕条目导出为 UTF-8 文本文件，再用视频播放器测试，即可将字幕转换为 SRT 或 VTT。这种方法仅适用于已有带时间信息的字幕，且本地视频与在线视频使用相同时间起点的情况。仅凭复制的纯文本或开始时间，无法还原准确的结束时间。

字幕条目是一个带有显示开始时间和结束时间的文本块。SRT（SubRip Text）在毫秒前使用逗号。VTT（WebVTT）以 `WEBVTT` 文件头开头，在毫秒前使用句点。UTF-8 是一种标准文本编码，可完整保留特殊字符。Actor 是采集网络数据的程序，Task 则是为 Actor 保存的一组输入设置。

要提取字幕，请使用 [YouTube Transcript Scraper Actor](https://apify.com/chronometrica/youtube-transcript-scraper)。请求输出 JSON、SRT 和 VTT 格式。原始 JSON 输出包含以下具体的分段字段：`startSeconds`、`endSeconds`、`durationSeconds` 和 `text`。仅将原始字幕字符串保存为 UTF-8 文本文件。不要将整个数据集导出为 CSV，也不要保留含有 `\n` 字符的转义 JSON 字符串。失败的输入会显示在运行结果的 OUTPUT 中，而不会成为数据集中的行。针对 1 条字幕轨的测试运行保存了 61 个字幕条目，用于验证采集过程，但你仍需在自己的播放器中检查播放效果。

如果完全没有带时间信息的字幕，请先查看 [YouTube 字幕提取指南](https://chronometrica.com/zh-Hans/articles/youtube-%E6%96%87%E5%AD%97%E7%A8%BF%E6%8F%90%E5%8F%96%E4%B8%8E%E7%BC%BA%E5%A4%B1%E5%AD%97%E5%B9%95%E6%A3%80%E6%9F%A5/)，再验证文件。

## 转换与验证的完整方法

1. 确认视频和语言：检查视频 URL 和所选语言。保留原始 JSON 字幕条目和来源 URL。
2. 请求输出：请求 JSON、SRT 和 VTT 格式。检查是否有成功的结果行，以及分段是否非空。如果字幕获取失败，请使用链接中的采集指南。不要根据纯文本臆造结束时间。
3. 保存文件：将完整的 `srt` 字段复制到 `lesson.srt`，或将 `vtt` 字段复制到 `lesson.vtt`。使用支持 UTF-8 编码的纯文本编辑器。不要保留 JSON 引号、字面形式的 `\n` 字符或 CSV 单元格，也不要在文件名末尾附加 `.txt` 扩展名。
4. 检查语法：SRT 使用字幕条目编号，并在毫秒前使用逗号。VTT 以 `WEBVTT` 开头，后接一个空行，并在毫秒前使用句点。这 2 种格式都用空行分隔字幕条目，并在起止时间之间使用 `-->`。确认结束时间晚于开始时间，并检查各字幕条目的开始时间没有倒退。时间重叠可能是合理的；请在播放时检查，不要自动删除。
5. 检查视频播放效果：在视频播放器中，对照检查开头、中间和结尾的字幕条目。检查重音符号、换行和过长的文本行。文件即使通过了格式检查，屏幕上仍可能出现时间不准或文本错误。
6. 修正时间偏移：如果所有字幕条目都延迟了相同的固定时长，请检查本地视频副本是否删去了片头。仅针对这个特定副本，将开始时间和结束时间都按该准确偏移量调整。如果时间误差随播放进度不断增大，固定平移无法解决问题。当时间漂移不断增大时，请重新使用时间正确的字幕来源，不要应用未经测试的帧率转换。
7. 保存最终文件：保存源字幕条目，并记录所有已获批准的时间修改。

## 虚构示例文件

下面是一个简单示例，包含 3 个以秒计时的字幕条目：

- 字幕条目 1：`0.250` 至 `2.750` 秒——“打开设置。”
- 字幕条目 2：`3.000` 至 `5.500` 秒——“选择 Français。”
- 字幕条目 3：`6.000` 至 `8.125` 秒——“保存更改。”

### 完整的 SRT 文件

```srt
1
00:00:00,250 --> 00:00:02,750
Open the settings.

2
00:00:03,000 --> 00:00:05,500
Choose Français.

3
00:00:06,000 --> 00:00:08,125
Save the change.
```

虚构示例文件

### 完整的 VTT 文件

```vtt
WEBVTT

00:00:00.250 --> 00:00:02.750
Open the settings.

00:00:03.000 --> 00:00:05.500
Choose Français.

00:00:06.000 --> 00:00:08.125
Save the change.
```

虚构示例文件

请注意，SRT 在每个时间戳中都使用逗号分隔毫秒（`00:00:00,250`），而 VTT 使用句点（`00:00:00.250`）。

### 计算详解

将以小数表示的秒数换算为毫秒时，乘以 1,000。例如，`0.250` 秒换算为 `250` 毫秒，`8.125` 秒则表示为 `00:00:08.125`。

- 各字幕条目的持续时间分别为 2.500 秒、2.500 秒和 2.125 秒。
- 字幕实际显示的总时长为 7.125 秒（`2.500 + 2.500 + 2.125`）。
- 字幕从开始到结束的总跨度为 7.875 秒（`8.125 - 0.250`），其中包含字幕条目之间的间隔。

这两项总时长都不能衡量[文本准确性](/zh-Hans/articles/%E5%87%86%E7%A1%AE%E5%BC%95%E7%94%A8-youtube-%E8%A7%86%E9%A2%91/)或阅读速度。

### 独立的时间偏移示例

假设另有一个独立的视频副本，删去了 1.000 秒的片头。该视频中某个字幕条目的起止时间原为 `10.250–12.750` 秒，减去 1.000 秒后变为 `9.250–11.750` 秒（`10.250 - 1 = 9.250` 和 `12.750 - 1 = 11.750`）。

切勿将这次时间平移应用于前面包含三个字幕条目的示例文件。将首个字幕条目的开始时间（`0.250`）减去 1.000 秒，会得到无效的负开始时间（`-0.750`）。保持原始文件不变，并在使用前通过视频播放器检查经过时间平移的文件。

## 下一步

打开 [youtube-transcript-scraper](https://apify.com/chronometrica/youtube-transcript-scraper)，或启动 [YouTube Subtitles in SRT and VTT Task](https://apify.com/chronometrica/youtube-transcript-scraper/examples/youtube-subtitles-srt-vtt)，用 1 个视频进行测试，同时请求 JSON 和所需的字幕格式，然后将输出字符串保存为文件并预览。

## 来源和延伸阅读

- [WebVTT：网络视频文本轨格式（W3C 候选推荐标准草案）](https://www.w3.org/TR/webvtt1/)
- [SubRip 文件结构与毫秒语法（美国国会图书馆）](https://www.loc.gov/preservation/digital/formats/fdd/fdd000569.shtml)
- [管理视频转写文本和字幕（YouTube 支持）](https://support.google.com/youtube/answer/15930243?hl=en-CA)