

# 如何在長篇 YouTube 課堂影片中找到某個概念

利用字幕時間，建立一份小型概念索引。然後觀看影片中每個候選時段。找到相符字詞，只能表示影片曾提及該概念，不能證明影片有作解釋。

這份索引是你自己製作的導覽工具。它不是影片作者編寫的章節清單，不是剪輯片段，不是整段影片的摘要，也不是搜尋內容分塊的規劃。

## 1. 先寫下學習問題

瀏覽逐字稿前，先寫下一句話。指明要找的概念，補上老師可能使用的其他用詞，並指明你需要哪一類答案。

使用以下答案類型：

- 定義：說明概念的意思，或如何操作。
- 解題示例：逐步完成一個案例。
- 步驟流程：按次序列出操作。
- 比較：將兩個概念並列比較。
- 限制：說明概念的適用界限。

必須分清一點：「提及量度」不等於「解釋如何量度」。你寫下的句子應說明你需要哪一種。

## 2. 取得一條字幕軌

字幕是影片已儲存、附有時間資料的文字。逐字稿是同一段影片的全部字幕。字幕片段是其中一行附有時間資料的文字。每個字幕片段都有文字、開始時間和持續時間。持續時間是指該行字幕顯示多久。

時段是你為某個概念選定的開始和結束範圍。閱讀字幕片段後，你才選定這個範圍。

Actor 是託管在平台上、用來收集來源資料列的程式。每個來源資料列代表一段影片的結果。Task 是已儲存的輸入預設。Actor 只負責收集資料列。概念分析工作由你根據這些資料列完成。

使用 YouTube Transcript 0.1.43 版本。Actor 是 [YouTube Transcript Scraper](https://apify.com/chronometrica/youtube-transcript-scraper)。公開 Task 是 [用於產生影片章節的 YouTube 逐字稿資料](https://apify.com/chronometrica/youtube-transcript-scraper/examples/youtube-chapters)。

這個 Task 提供起始輸入設定，不會替你標註概念。它儲存的清單是示範影片，不是你的課程。請將整份清單替換為一段你已熟悉的公開課堂影片。不要研究示範清單，也不要從中複製字詞。

Actor 接受公開影片網址，也接受由 11 個字元組成的影片 ID。ID 是影片的簡短識別碼。你最多可以提交 1,000 項輸入。這項工作只需提交 1 段影片。重複的影片 ID 只會處理 1 次。

起始網址可以是一般觀看連結、youtu.be 連結、Shorts 連結、直播連結或嵌入連結。嵌入連結用於在另一個網頁上放置播放器。Actor 不會從頻道、播放清單或搜尋頁面尋找影片。

它只讀取[現有的公開字幕](/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/)，不會將語音轉成新的文字，不會翻譯，也不會編寫章節、標籤或摘要。

如需英文字幕軌，請使用以下輸入：

```json
{
  "startUrls": ["https://www.youtube.com/watch?v=YOUR_PUBLIC_VIDEO"],
  "preferredLanguages": ["en"],
  "outputFormats": ["json"],
  "includeFailedInputDetails": true
}
```

2. 取得一條字幕軌

將 YOUR_PUBLIC_VIDEO 替換為你已熟悉的公開影片。`outputFormats` 必須設為 `["json"]`，讓每個字幕片段保留時間資料。將 `preferredLanguages` 設為 `["en"]`，即要求英文字幕。如果沒有英文字幕，結果會指出所需語言無法提供，不會在未作提示的情況下傳回其他語言。

如需現有字幕軌中最合適的一條，請使用空白語言清單：

```json
{
  "startUrls": ["https://www.youtube.com/watch?v=YOUR_PUBLIC_VIDEO"],
  "preferredLanguages": [],
  "outputFormats": ["json"],
  "includeFailedInputDetails": true
}
```

2. 取得一條字幕軌

空白清單不保證取得英文字幕。執行後，你必須查看 `transcriptLanguageCode`。請將 `includeFailedInputDetails` 保持為 true，讓失敗的輸入仍可見。

## 3. 搜尋前先核對結果

查看來源資料列中以下名稱的欄位。欄位是一個有名稱的值。

- `videoId`
- `videoUrl`
- `transcriptLanguageCode`
- `isAutoGenerated`
- `segments`，其中每個片段都包含 `text`、`startSeconds`、`endSeconds` 和 `durationSeconds`
- `segmentCount`
- `status`
- `statusReason`
- `scrapedAt`

`videoDurationSeconds` 可能缺失。缺失表示未知。不要將未知記成 0。

`isAutoGenerated` 表示字幕軌的製作方式。True 表示字幕是自動產生的。False 表示字幕軌由人員提供。人工字幕軌仍可能有錯字。你仍須觀看影片。

`status` 表示該次字幕讀取是否成功。`statusReason` 說明原因。`scrapedAt` 是觀察時間。請在筆記中保留影片 ID、網址、語言、自動或人工字幕標記，以及 `scrapedAt`。

然後查看名為 OUTPUT 的執行摘要：

- `successfulTranscriptRows`
- `rowsWritten`
- `failedInputs`
- `statusCounts`
- `errorCodeCounts`
- `failedInputDetails`

失敗的輸入不會成為逐字稿資料列。如果 `status` 並非成功，請停止。如果你要求的語言無法提供，請將搜尋保留為未解決。找不到相符文字，不能證明影片沒有該概念。字詞可能只出現在畫面上。所需語言的字幕軌可能缺失。字幕讀取也可能失敗。這個限制只適用於已核對的字幕軌，不適用於整段影片。

0.1.43 版本的一次測試使用了 1 個確切的公開影片 ID。它傳回了 1 份逐字稿。字幕軌是英文人工字幕，共有 4,530 個附有時間資料的字幕片段。OUTPUT 顯示執行成功，沒有失敗輸入。這證明該單一來源有附時間資料的字幕片段，不能證明概念標籤正確，不能證明字幕文字完全無誤，也不能證明每段影片都會有相同結果。請對照影片核對每個時段。

`transcriptSpanSeconds`，以及首個和最後一個時間值，只描述字幕軌，不能證明某個概念已獲完整解釋。

## 4. 保留每個原始字幕片段

保留每個原始字幕片段。不要將字幕中的每個字詞各自當作一個概念。搜尋你的概念和你列出的其他用詞。然後閱讀相符位置前後的字幕片段。

關鍵字搜尋可以找出候選時段。候選時段是可能適用、但尚未確認的時段。搜尋不會產生經核實的標籤。你必須在觀看後才寫下標籤。

## 5. 標示候選時段

以首個開始解釋概念的字幕片段作為時段起點，以最後一個仍在回答問題的字幕片段作為終點。

優先使用最後一個字幕片段傳回的 `endSeconds`。若已知 `durationSeconds`，請交叉核對 `endSeconds` 是否等於 `startSeconds` 加 `durationSeconds`。即使 `endSeconds` 已知，`durationSeconds` 仍可能是 null。請保留 null。絕不要猜成 0。不要用下一個字幕片段的開始時間作為終點。字幕片段可能重疊，也可能有空隙。最後一行字幕的結束時間，不等於影片的結束時間。

如果較早的字幕片段定義了你需要理解的字詞，也要將它們包括在內。這個經定義的字詞可能是某個數值的名稱。老師重新講解較早的概念時，時段可以重疊。你不必將整段影片劃分成一組連續的時段。

## 6. 觀看影片，為答案加上標籤

在原始影片中開啟候選時段。聆聽講解，同時查看圖表、畫面上的程式碼和參考資料。字幕可能沒有涵蓋這些內容。

從以下簡單分類中選用 1 個標籤：

- `mention_only` 表示只提及概念名稱，沒有作解釋。
- `explains_definition` 表示該時段解釋了意思或方法。
- `worked_example` 表示該時段逐步完成了 1 個案例。
- `comparison` 表示該時段有作比較。
- `unresolved` 表示你無法透過這次觀看確認答案。

這些標籤是你自己加上的內容標記，不是 Actor 的輸出。請寫下該時段為何能回答學習問題，或為何不能。

## 7. 儲存 1 列索引記錄

每列索引記錄，是你為 1 個已核對時段寫下的記錄。請包括：

- 概念標籤
- 學習問題
- 影片 ID 和網址
- 字幕語言
- 以秒表示的開始時間和結束時間
- 以分、秒表示的開始時間
- 解釋類型
- `checked_at`
- 證據備註
- 信心程度

也要保留結束時間。信心程度是你自行給出的核對評級，不是模型分數。如果某個時段界線未知，請保留為未知。

## 8. 開啟起始時間連結，學習該時段的內容

在電腦上開啟「分享」，再選擇「開始時間」。輸入開始時間，然後複製連結。開啟複製的連結，確認影片是否在正確內容附近開始播放。YouTube 在[分享影片和頻道](https://support.google.com/youtube/answer/57741?hl=en&ref_topic=9257102)中說明了這項控制功能。

起始時間連結不會強制影片在指定時間停止。請將結束時間保留在索引中。不要將虛構的示範網址當作已核對、可播放的影片。

利用已核對的時段學習。如果無法確認有相關解釋，請標記為 `no_confirmed_explanation_in_checked_track`。加上範圍備註，指明核對的是哪條字幕軌，然後查閱另一個來源。不要因為一次有不確定性的字幕搜尋失敗，就判定整段影片無法回答問題。

## 虛構課程：量度花圃

以下例子是原創的虛構內容，用來教授時段計算。它不是 Actor 的結果，也沒有真實影片網址。不要將任何指向這個例子的連結當作可播放的連結。

這個虛構課程的標題是「量度花圃」。課程長度設定為 12 分鐘。教學時段如下：

- 0 至 120 秒：準備
- 120 至 330 秒：量度方法解釋
- 330 至 570 秒：計算示例
- 570 至 720 秒：限制

寬度概念附近有以下 3 個虛構字幕片段：

| 開始時間（秒） | 持續時間（秒） | 結束時間（秒） | 文字 |
| --- | --- | --- | --- |
| 120 | 30 | 150 | 從一側內緣量至另一側內緣，量出內部寬度 |
| 150 | 45 | 195 | 長度和寬度使用相同單位 |
| 300 | 30 | 330 | 記錄前先核對讀數。 |

學習問題是：如何用同一單位量度寬度？

120 秒的字幕說明操作。150 秒的字幕補充要使用同一單位。300 秒的字幕完成方法說明。因此，定義時段包括全部 3 行字幕，從 120 秒開始，到 330 秒結束。

最後一個字幕片段的結束時間：300 + 30 = 330 秒。時段長度：330 - 120 = 210 秒。210 秒是 3 分 30 秒。開始時間為 2:00。結束時間為 5:30。

在這個虛構課程的人工觀看核對設定中，標籤是 `explains_definition`。證據備註指出畫面展示了內緣。確認標籤的是觀看這一步，單憑字幕片段文字不能確認。

計算時段屬於另一種概念類型，從 330 秒開始，到 570 秒結束。570 - 330 = 240 秒。240 秒是 4:00。開始時間為 5:30。請標記為 `worked_example`。不要將它合併到定義時段。

4 個教學時段的長度分別為 120、210、240 和 150 秒。120 + 210 + 240 + 150 = 720 秒。它們合起來涵蓋了整個虛構課程。涵蓋完整時間，不代表每個概念都有解釋。

「量度」一詞也在 600 秒出現，即 10:00。它位於限制時段內，用於提出警告。請將它保留為 `mention_only`，或標記為限制。不要將主要定義的時間移至 600 秒。

另一個虛構的時段界線需要人工決定。某個字幕片段從 310 秒開始，持續 30 秒。它的結束時間是 310 + 30 = 340 秒。下一個時段從 330 秒開始。340 - 330 = 10 秒，這是重疊長度。請保留這段重疊，或在觀看後移動界線。不要只為了讓界線整齊，就在 330 秒截斷話語。

這裏的 `scrapedAt` 未知，因為沒有讀取真實字幕軌。`videoDurationSeconds` 也未知。720 秒來自虛構設定的時段長度，並非影片時長欄位。未知值仍須保留為未知。

### 4 個虛構時段的時間計算

| 部分 | 開始時間（秒） | 結束時間（秒） | 長度 |
| --- | --- | --- | --- |
| 準備 | 0 | 120 | 120 |
| 寬度定義 | 120 | 330 | 330 - 120 = 210 |
| 計算 | 330 | 570 | 570 - 330 = 240 |
| 限制 | 570 | 720 | 720 - 570 = 150 |
| 總和 | 0 | 720 | 120 + 210 + 240 + 150 = 720 |

### 同一虛構課程中的時段界線情況

| 情況 | 計算 | 決定 |
| --- | --- | --- |
| 定義的最後一個字幕片段 | 300 + 30 = 330 | 以這個結束時間作為寬度時段的終點。 |
| 超過 330 秒的重疊 | 310 + 30 = 340，而 340 - 330 = 10 | 保留這 10 秒重疊，或在觀看後調整。 |
| 稍後在 600 秒出現的字詞 | 600 位於 570 至 720 之間 | 屬於 `mention_only` 的限制說明，並非定義。 |

### 已核對的虛構課程索引

| 概念 | 學習問題 | 影片 | 字幕語言 | 開始時間（秒） | 結束時間（秒） | 開始時間 | 結束時間 | 類型 | 核對時間 | 證據備註 | 核對評級 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 課程準備 | 量度前會做甚麼？ | 只有虛構標題，沒有真實網址。 | en，僅為教學用標籤 | 0 | 120 | 0:00 | 2:00 | unresolved | 僅作教學示範核對 | 標示為準備部分。沒有提供字幕片段文字，因此尚未確認這項說法。 | 觀看前仍屬未知 |
| 以同一單位表示寬度 | 如何用同一單位量度寬度？ | 只有虛構標題，沒有真實網址。 | en，僅為教學用標籤 | 120 | 330 | 2:00 | 5:30 | explains_definition | 僅作教學示範核對 | 最後的結束時間是 300 + 30 = 330。觀看備註：畫面展示了內緣。 | 在這次虛構核對中已確認 |
| 花圃計算 | 如何示範一次計算？ | 只有虛構標題，沒有真實網址。 | en，僅為教學用標籤 | 330 | 570 | 5:30 | 9:30 | worked_example | 僅作教學示範核對 | 屬於獨立類型。570 - 330 = 240 秒，即 4:00。 | 僅確認為示例 |
| 稍後的量度警告 | 稍後出現的字詞有解釋寬度嗎？ | 只有虛構標題，沒有真實網址。 | en，僅為教學用標籤 | 570 | 720 | 9:30 | 12:00 | mention_only | 僅作教學示範核對 | 600 秒時，該字詞用於警告。請將它保留為限制說明。 | 僅提及 |

寬度問題對應的是 120 至 330 秒那一列。你會從 2:00 開始觀看，並以 5:30 作為核對終點。你會儲存起始時間連結、結束時間和證據備註。這列虛構記錄沒有真實連結。對於真實影片，請使用「分享」，再選擇「開始時間」，開啟複製的連結，並寫下你看到的內容。

這個虛構例子沒有實際量度學習速度的結果。這些數字只用來教授時段計算。

## 下一步

將整份示範清單替換為 1 段你已熟悉的公開課堂影片。在 [YouTube Transcript Scraper](https://apify.com/chronometrica/youtube-transcript-scraper) Actor 上使用[用於產生影片章節的 YouTube 逐字稿資料](https://apify.com/chronometrica/youtube-transcript-scraper/examples/youtube-chapters) Task。將 `outputFormats` 設為 `["json"]`。觀看原始影片中的 1 個候選時段。儲存它的起始時間連結、結束時間和簡短證據備註。

## 來源與延伸閱讀

- [YouTube Transcript Scraper](https://apify.com/chronometrica/youtube-transcript-scraper)
- [用於產生影片章節的 YouTube 逐字稿資料](https://apify.com/chronometrica/youtube-transcript-scraper/examples/youtube-chapters)
- [分享影片和頻道](https://support.google.com/youtube/answer/57741?hl=en&ref_topic=9257102)
- [關於長篇課堂影片的第一身筆記](https://www.reddit.com/r/chrome_extensions/comments/1vhu5aj/built_a_lightweight_extension_that_attaches/)