

# 將 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 中，而非資料集的資料列。一項針對單一字幕軌的測試執行儲存了 61 個字幕段，以驗證擷取過程，但你仍須在自己的播放器中檢查播放效果。

如果完全沒有附有時間資訊的字幕，請先參閱 [YouTube 字幕擷取指南](https://chronometrica.com/zh-Hant/articles/%E5%8F%96%E5%BE%97-youtube-%E9%80%90%E5%AD%97%E7%A8%BF-%E6%AA%A2%E6%9F%A5%E7%BC%BA%E5%B0%91%E5%AD%97%E5%B9%95/)，再驗證檔案。

## 轉換及驗證的完整方法

1. 確認影片及語言：檢查影片網址及所選語言。保留原始 JSON 字幕段及來源網址。
2. 要求輸出：要求輸出 JSON、SRT 及 VTT 格式。檢查是否有成功的資料列，以及字幕段是否非空。如果字幕擷取失敗，請使用連結中的擷取指南。不要憑純文字編造結束時間。
3. 儲存檔案：將完整的 `srt` 欄位複製到 `lesson.srt`，或將 `vtt` 欄位複製到 `lesson.vtt`。使用支援 UTF-8 編碼的純文字編輯器。不要保留 JSON 引號、字面上的 `\n` 字元或 CSV 儲存格，也不要在檔名後附加 `.txt` 副檔名。
4. 檢查語法：SRT 使用字幕段編號，並在毫秒前使用逗號。VTT 以 `WEBVTT` 開頭，接着是空白行，並在毫秒前使用句點。兩種格式都以空白行分隔字幕段，並在開始與結束時間之間使用 `-->`。確認結束時間晚於開始時間，並檢查字幕段的開始時間是否按先後排列，沒有倒退。時間重疊可能是正確的；請播放影片檢查，不要自動刪除重疊的字幕段。
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-Hant/articles/%E6%BA%96%E7%A2%BA%E5%BC%95%E7%94%A8-youtube-%E5%BD%B1%E7%89%87/)或閱讀速度。

### 另一個獨立的時間偏移範例

假設另有一份獨立的影片副本，刪除了長達 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)