

# 如何準確引用 YouTube 影片

利用附有時間資料的字幕找出段落，然後先聆聽原聲並核對講者，才作引用。同時核對意思。在引文紀錄中儲存已核對的字句、來源時間及任何修正。成功取得字幕，本身並不代表引文準確。

引文紀錄是你為某個段落保留的筆記。有些人稱這種筆記為引文台賬。它會記下主張、來源、時間、原始字幕、已核對的字句及覆核狀態。

## 附有時間資料的字幕能提供甚麼

Actor 是託管的資料收集程式。[YouTube Transcript Actor](https://apify.com/chronometrica/youtube-transcript-scraper) 會根據你已知的影片網址，讀取公開的字幕軌。字幕軌是與影片一同儲存、附有時間資料的文字。Actor 會複製這些已儲存的文字。它不會將語音轉錄成新文字，不會識別講者，也不會查核事實。它無法證明引文逐字準確。

Task 是已儲存的輸入預設。[YouTube timestamped transcript JSON Task](https://apify.com/chronometrica/youtube-transcript-scraper/examples/youtube-timestamped-transcript-json) 是已發佈的起始輸入設定。它會要求以 JSON 格式輸出附有時間資料的片段。JSON 是以文字表示欄位名稱和值的一種方式。已發佈的 Task 只是起始輸入設定，不會代你核對引文。

YouTube Transcript 公開版本 0.1.43 接受 4 個輸入欄位。

- `startUrls` 存放已知的影片網址或影片 ID。
- `preferredLanguages` 存放你偏好的語言代碼。空白清單不會強制指定任何語言。
- `outputFormats` 用來指定結果格式。請使用 JSON。
- 將 `includeFailedInputDetails` 設為 true，便會要求在某項輸入失敗時輸出一列詳細資料。

已發佈的 Task 包含 3 個範例影片網址。這些範例不是你的來源。請將整份清單換成 1 條已知的公開影片。如果保留範例，你可能會讀到另一條影片的結果列。輸出格式請保留為 JSON，並將 `includeFailedInputDetails` 保持為 true。失敗結果列可以說明失敗原因，但不等於已核實的引文。Actor 不會在頻道內尋找影片，也不會在播放清單內尋找影片。

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

附有時間資料的字幕能提供甚麼

將你實際使用的公開影片網址填入 `startUrls`。刪除所有範例網址。最外層的大括號標示輸入的開始和結束。方括號標示清單的開始和結束。如果知道影片所用的口語語言，請將該語言代碼填入 `preferredLanguages`。如果不知道，請保留空白清單。語言清單留空不代表字幕是英文。

一次相容性檢查傳回了 1 列狀態為 succeeded 的結果。該列包含內容非空的人工英文字幕軌。「人工」表示字幕軌由人製作，而非自動產生。附有時間資料的片段屬於預定的影片。你可以沿用這項狀態事實，但不要沿用範例影片的字句。那些字句不屬於這套方法的一部分。

每列代表 1 條影片的 1 項結果。請原樣保留所有傳回的欄位。以下欄位會有用：

- `videoId` 是影片的公開 ID。
- `videoUrl` 是影片的公開網址。
- `transcriptLanguageCode` 是字幕的語言代碼。
- `isAutoGenerated` 表示字幕軌是否由 YouTube 自動產生。相容性檢查使用的是人工英文字幕軌，因此該字幕軌並非自動產生。如果這個欄位是 null，就無法知道字幕軌是如何製作的。
- `text` 是結果列中的字幕文字。每個片段也有自己的 `text`。兩者都要保留。
- `segments` 是附有時間資料的片段清單。每個片段都是字幕軌中附有時間資料的一小段。
- `status` 表示該項輸入的處理結果。相容性檢查中的值是 succeeded。如果狀態不是 succeeded，就不要引用該列的內容。
- `scrapedAt` 是收集該列資料的時間，不是講話的時間。

每個片段都保留 `startSeconds`、`endSeconds`、`durationSeconds` 及 `text`。`startSeconds` 是片段的開始時間，以該影片開始播放時起計。`endSeconds` 是片段的結束時間。`durationSeconds` 是 Actor 傳回的時長。如果某個值是 null，請保留 null。Null 表示該值缺失。缺失不等於 0。

你可以用簡單的減法核對時長。段落時長 = 結束秒數 - 開始秒數。如果計算結果與 `durationSeconds` 不符，請保留 Actor 的值。在引文紀錄中註明差異。不要取代 Actor 的值。

即使狀態是 succeeded，字幕仍可能有錯。片段可能互相重疊。請保留兩個重疊的片段，不要將它們合併成新句子。字幕軌可能沒有標示講者轉換，也可能遺漏了會改變意思的畫面內容。請保留原始文字及原始時間。不要自行編造講者標籤，也不要用估計時間取代來源時間。

如果影片設為私人，你就無法取得已核實的引文。如果影片已被移除，你就無法取得已核實的引文。如果影片沒有字幕，你就無法取得已核實的引文。你可以聆聽原聲，然後自行轉錄。轉錄稿是你聆聽後寫下的字句。請標明這是你自行轉錄的內容，不要說是 Actor 產生的。

`transcriptLanguageCode` 不能證明實際說出了甚麼。如果你作翻譯，請標明是譯文。不要將譯文當作原文的逐字引文。

這套設定會在字句覆核前保留 1 份執行摘要。inputsReceived 是進入該次執行的輸入數目。uniqueVideosPlanned 是該次執行預定開啟的不同影片數目。rowsWritten 是成功取得逐字稿的結果列數目。successfulTranscriptRows 是成功取得逐字稿的結果列數目。逐字稿是附有時間資料的字幕文字。rowsWritten 及 successfulTranscriptRows 不計算已儲存的失敗詳細資料列。failedInputs 是字幕輸入失敗的數目。failedInputs 不計算尚未完成的工作。duplicateVideosSkipped 是該次執行沒有再次開啟的重複影片數目。statusCounts 是各種字幕軌狀態下，已處理輸入的結果數目。這些結果包括失敗情況。字幕軌狀態是單一字幕軌的結果標籤。errorCodeCounts 是各個錯誤代碼對應的失敗數目。錯誤代碼是某種失敗類型的簡稱。failedInputDetails 列出每項失敗輸入及其錯誤。includeFailedInputDetails: true 可儲存失敗詳細資料列。這些失敗詳細資料列與成功取得逐字稿的計數分開。覆核字句前，請先核對這些紀錄是否一致。核對一致是指比較各項紀錄，直至確認它們相符。預定的影片、字幕軌語言、字幕軌狀態、狀態為 succeeded 的結果列、失敗計數及失敗清單，全部都必須相符。預定的影片是該次執行原本要開啟的影片。字幕軌語言是該字幕軌上的語言標籤。成功擷取只表示該次執行找到了字幕及其時間，不能證明引文字句、講者或主張正確。

## 用 8 個步驟核對字句

對每個可能引用的短段落，依次完成以下步驟。

1. 寫下這段引文應支持的主張。

挑選字句前，先用 1 句話寫下主張。然後選擇 1 條已知的公開影片，再選出 1 個簡短的候選段落。你必須親自核對實際說出的字句。[檢索所得的文字區塊](/zh-Hant/articles/youtube-%E9%80%90%E5%AD%97%E7%A8%BF-rag-%E5%88%86%E6%AE%B5%E8%88%87%E4%BE%86%E6%BA%90%E6%99%82%E9%96%93%E6%A8%99%E8%A8%98/)只是一個查找線索。記下你點擊了哪裏，也只是一個查找線索。兩者都不是引文本身。如果不先寫下主張，就很容易不斷刪去字句，直至內容變成另一個主張。

1. 取得目前附有時間資料的 JSON，或手動查看影片。

儲存來源 ID、來源網址、語言代碼、狀態，以及原始片段的文字和時間。[如果沒有字幕](/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/)，請聆聽原聲並自行轉錄。請標明這份轉錄稿，不要說是 Actor 產生的。即使發現錯誤，也要保持原始字幕軌不變。原始字幕軌顯示 Actor 傳回了甚麼。你的修正應記在引文紀錄中，不應寫入該字幕軌。

1. 按候選段落的時間開啟影片。

播放該句之前及之後足夠長度的影片。前後的字句和畫面就是語境。語境會顯示誰在說話，以及「它」或「他們」等詞語所指的是甚麼。語境也會顯示條件、單位及否定詞。否定詞是「不」這類詞語。條件是採取行動前必須成立的要求。單位是計量的標準，例如杯或分鐘。如果畫面可能改變意思，就要觀看畫面。字幕中的標點符號不能證明講者當時如何表達。字幕中的講者姓名不能證明實際是誰在說話。短片段可能遺漏了在前一刻說出的否定詞。如果條件出現在相鄰片段，就要一併納入該片段。

1. 再聽一次，寫下所需的字句。

先不看字幕，聽 1 次。只逐字轉錄你需要的內容。不確定的字詞要重播再聽。如果聽錯一個詞會導致嚴重的失實主張，請另一位讀者一同聆聽。如果聲音不清楚，請寫「聽不清楚」。不要用看似合理的詞語填補空缺。只有來源中的介紹或其他明確說明，才可用來確認講者姓名。聲音聽起來熟悉，不能證明身分。字幕的猜測也不能證明身分。如果來源沒有說明講者姓名，請寫「不詳」。不詳就要保持不詳。不要填上姓名，也不要填 0。

1. 比較字幕字句與你已核對的字句。

在引文紀錄中寫下修正原因，並記下你聆聽的來源時間範圍。不要更改原始字幕文字，也不要更改原始時間。你已核對的字句是你自行轉錄的內容，不是 Actor 提供的新欄位。不要潤飾句子後仍保留引號。潤飾過的句子可能較易閱讀，卻仍可能不忠於來源。引號表示你承諾其中的字句已經核對。

1. 選擇直接引用或轉述。

直接引用會重現已核對的字句，並使用引號。轉述是用自己的新字句表達相同意思。轉述不使用引號，但仍須連結至來源。只有在意思不變的情況下，才可省略字句。不要省略條件，也不要省略否定詞。刪去「不」這類詞語，可能會令意思相反。請遵守發佈平台的引用限制。這套方法不會告訴你版權法准許甚麼。不要從真實影片複製大段內容。

1. 儲存引文紀錄。

記錄主張、來源網址及來源 ID。記錄段落的開始秒數和結束秒數。記錄語言、講者身分的證據及原始字幕摘錄。記錄已核對的字句、核對方法及核對時間。記錄語境備註、修正及覆核狀態。引用讀者可以直接開啟的時間點。在電腦上，YouTube 可以分享從指定時間開始播放的連結。YouTube 稱這項功能為 Start at。說明頁面是 [YouTube 分享說明：Start at](https://support.google.com/youtube/answer/57741?hl=en)。引用實際的時間點連結前，請先測試。確認它能在預定時間開啟預定影片。在原始結果列中保留 `videoUrl`。時間點連結是供讀者使用的，不能證明引文準確，也不能證明主張成立。如果覆核者無法開啟該時間點，就無法核對你的字句。即使連結能開啟該時間點，也仍然只提供導覽功能。

1. 發佈前，請覆核者開啟該段落。

覆核者會將最終引文與聲音內容比較，也會將引文與旁邊的主張比較。如果有必要的字詞仍未確認，請將覆核狀態保持為 `needs_review`。如果來源沒有表明講者身分，也要保留 `needs_review`。不要將 `needs_review` 的引文當作已核對的內容發佈。`verified_wording` 表示字句及講者身分的證據已經核對，不表示主張已獲證實。準確的轉錄稿仍可能包含缺乏證據支持的主張。請將字句核對與主張查核分開。覆核者會再次聆聽，因此核對不會只依靠 1 位聆聽者。覆核者不能令失實主張變成事實。

## 逐步示例：原創虛構內容

本節的園藝課是原創虛構內容，不是 Actor 的執行結果。它不是真實影片，講者也不是真實人物。這裏沒有提供任何畫面事實。不要自行添加。

虛構來源 ID 使用佔位符 VIDEO_ID。42 秒至 48 秒的原始字幕片段是：「托盤放平時加水。」聆聽者隨後播放 38 秒至 51 秒的內容。在這段較長的時間範圍內，講者說：「在托盤放平之前，不要加水。」

字幕漏掉了否定詞「不」，也漏掉了「直到……才」所表達的時間條件。讀者如果只引用原始字幕，就會教人採取相反的行動。已核對的簡短引文是：「在托盤放平之前，不要加水。」

段落時長 = 結束秒數 - 開始秒數。字幕時間範圍為 48 - 42 = 6 秒。聆聽時間範圍為 51 - 38 = 13 秒。兩個時間範圍都要儲存。較短的時間範圍是原始片段，較長的時間範圍是你聽過的語境。

虛構的介紹將講者稱為講者 A。請儲存該介紹，作為講者身分的證據。原始字幕要保持傳回時的原貌。修正原因是遺漏了否定詞及條件。覆核狀態是 `verified_wording`。這段虛構內容的核對時間不詳。不詳不等於 0。

轉述可以是：等托盤放平後才加水。不要為這句轉述加上引號。這是換句話說，不是另一段已核實的引文。只引用「加水」會令指示的意思相反，因為這樣刪去了否定詞及條件。請拒用這段引文。

候選段落 2 也是原創虛構內容。它的字幕結果列狀態為 succeeded。這段虛構內容沒有為它提供可安心使用的原始句子，因此原始摘錄仍為不詳。不要編造單位來填補空缺。聲音中的單位詞聽不清楚。來源也沒有確認講者是否已轉換。已核對的字句不詳。講者不詳。段落時間不詳。覆核狀態是 `needs_review`。它尚未獲核實。

2 列狀態為 succeeded 的字幕結果，不等於 2 段已核實的引文。成功取得字幕只表示傳回了結果列。只有候選段落 1 具備已核對的字句、講者身分的證據及修正原因。

發佈決定的範圍很有限。只有在覆核者聽過 38 秒至 51 秒的內容並表示同意後，才發佈候選段落 1 中已核對的直接引文。不要將「加水」作為引文發佈。不要發佈候選段落 2。在單位及講者身分確認前，請將候選段落 2 保持為 `needs_review`。

這段虛構內容的時間點連結只採用以下格式：

```text
https://www.youtube.com/watch?v=VIDEO_ID&t=42s
```

逐步示例：原創虛構內容

這個格式不是可播放的證據，也不是實際可用的來源。不要將 VIDEO_ID 作為事實引證發佈。在真實影片上使用這套方法時，請引用該真實影片。先測試實際的時間點連結。引文要簡短，並將來源語境保留在讀者能看到的地方。

```text
Record 1 (original fiction)
claim: The speaker tells the viewer not to add water until the tray is level.
source id: VIDEO_ID (placeholder, not a real video)
moment link: template only, not playable evidence
passage in seconds: 42
passage out seconds: 48
passage length: 48 - 42 = 6 seconds
wider checked interval: 38 to 51 seconds
wider length: 51 - 38 = 13 seconds
language heard: English
speaker evidence: The fictional introduction names Speaker A.
raw caption excerpt: add water when the tray is level.
checked wording: Do not add water until the tray is level.
check method: Listen from 38 seconds to 51 seconds. Compare with the raw caption. Leave the raw caption unchanged.
check time: unknown
context note: The wider window contains the negation and the condition. No picture fact is supplied.
correction: The caption omitted the negation and the timing condition.
review state: verified_wording
```

逐步示例：原創虛構內容

```text
Record 2 (original fiction)
claim: unknown
source id: VIDEO_ID (same fictional placeholder)
passage in seconds: unknown
passage out seconds: unknown
language heard: unknown
speaker evidence: none. No speaker change is confirmed.
raw caption excerpt: unknown. A caption row succeeded, but its words are not supplied here.
checked wording: unknown. The unit word is unclear in the audio.
check method: Listen. Do not guess the unit. Do not guess the speaker.
check time: unknown
context note: Caption success does not verify the words.
correction: none yet
review state: needs_review
```

逐步示例：原創虛構內容

| 項目 | 候選段落 1 | 候選段落 2 |
| --- | --- | --- |
| 原始字幕 | 托盤放平時加水。 | 不詳 |
| 已核對的字句 | 在托盤放平之前，不要加水。 | 不詳 |
| 講者身分的證據 | 介紹中稱其為講者 A | 不詳 |
| 時間 | 42 至 48 秒；聆聽範圍為 38 至 51 秒 | 不詳 |
| 覆核狀態 | verified_wording | needs_review |
| 決定 | 覆核後發佈已核對的引文 | 不要發佈 |

## 分開判斷字句是否準確與主張是否屬實

已核對的引文仍可能表達證據薄弱或失實的主張。字句準確只表示你確實聽到了那些字句，不表示主張屬實。請用適合該主張的證據核實主張。這項查核與引文紀錄分開進行。即使在虛構內容中，`verified_wording` 也不能證明園藝指示正確。它只表示已按虛構講者說出的內容核對字句。

## 下一步

發佈前，先聆聽 1 個候選段落，並儲存引文紀錄。只有在字句及講者身分的證據均已核對時，才使用 `verified_wording`。如果有字詞或講者身分仍然不詳，請使用 `needs_review`。開啟 [YouTube Transcript Actor](https://apify.com/chronometrica/youtube-transcript-scraper) 及 [YouTube timestamped transcript JSON Task](https://apify.com/chronometrica/youtube-transcript-scraper/examples/youtube-timestamped-transcript-json)。將範例網址清單換成 1 條已知的公開影片。保留附有時間資料的 JSON 片段，並將 `includeFailedInputDetails` 設為 true。然後聆聽該段落並儲存紀錄。

## 來源與延伸閱讀

- [YouTube Transcript Actor](https://apify.com/chronometrica/youtube-transcript-scraper)
- [YouTube timestamped transcript JSON Task](https://apify.com/chronometrica/youtube-transcript-scraper/examples/youtube-timestamped-transcript-json)
- [YouTube 分享說明：Start at](https://support.google.com/youtube/answer/57741?hl=en)
- [將高質素的 YouTube 逐字稿匯入 RAG](https://www.reddit.com/r/AgentPlumbing/comments/1vah1gr/getting_clean_youtube_transcripts_into_a_rag/)