一張影片卡片連接至一個純文字頁面和多張帶時間的字幕卡片,背景為淺藍色和紫色。
保留可讀副本和帶時間的來源文字,以便分開檢查。

即使只有一部影片,也可能同時需要一份供閱讀的清晰文字副本,以及一份供參照的帶時間來源副本。你可以使用 Actor(一種託管的資料收集程式),並透過 Task(已儲存的輸入預設)來設定它。若選取 JSON(一種結構化文字格式),便會保留帶時間的片段;只有文字的輸出則不會保留。

了解字幕來源與限制

YouTube 字幕來自創作者上載的手動字幕軌,以及由平台演算法產生的自動語音辨識。官方文件指出,有字幕的影片可直接透過影片說明選單取得逐字稿(YouTube 說明:查看逐字稿)。不過,自動字幕可能因發音錯誤、口音、方言或背景噪音而錯誤表述說話內容(YouTube 說明:自動字幕)。此外,官方參考資料把開首長時間靜音和重疊人聲列為可能的字幕產生問題。這些一般清單本身不能診斷某一部特定影片。

要存取公開字幕軌,目標影片必須實際公開可用的字幕。若字幕軌本身缺失或已停用,只開啟直接影片 URL 並不足夠。請注意,公開字幕的存取有別於一般觀看的存取。不要把不公開列出的影片與私人影片歸為一類,因為若創作者已啟用,不公開列出的影片仍可公開字幕軌。請把缺少字幕、語言不符和擷取失敗分開看待。

取得並檢查逐字稿的實用方法

  1. 開始擷取前,確認確切的直接影片連結,並記錄其主要研究目的。請核實你使用的是已知的公開影片 URL,而不是播放清單或頻道頁面。
  2. 以原生方式測試影片:開啟其頁面,捲動至說明,並按一下「顯示逐字稿」,以檢查可用字幕軌。若沒有此操作,把它視為下一步檢查的提示,而不是自動的私隱診斷。
  3. 選擇純閱讀文字、帶時間的證據,或兩者。當你同時需要清晰的閱讀文字和帶時間的片段時,請一併選取 json 和 text。
  4. 使用 startUrls 陣列,以單一直接影片 URL 設定輸入,把 outputFormats 設為 ["json", "text"],並保持 includeFailedInputDetails 啟用。把 preferredLanguages 留空,可讓擷取程式選擇最佳可用字幕軌;若要做嚴格的英文分析,則必須把 preferredLanguages 設為 ["en"]。
  5. 執行擷取,並同時檢查資料集列和 OUTPUT 摘要記錄。使用 rowsWritten、successfulTranscriptRows、failedInputs 和 duplicateVideosSkipped 等欄位,以交代你的輸入。
  6. 請注意,text 是資料集列的欄位,而不是自動下載的文字檔。開啟成功的一列,把 text 欄位的值複製到你自己的閱讀文件,並另行保留包含時間片段的 JSON 來源匯出。檢查 videoId、實際的 transcriptLanguageCode 和 transcriptLanguageName。當用字必須精確時,把開始、中段和結尾的音訊樣本與對應的字幕片段比較,並注意抽查不能證明每一個字都正確。請把手動修正與原始來源資料分開保存。
  7. 對照失敗表檢查任何錯誤代碼,以決定下一步。檢查 isRetryable 屬性;只有該值為 true 時,才在稍後做有限度的重試。
  8. 保留 URL、影片 ID、實際語言、自動或手動標記、scrapedAt 收集時間、結果狀態、來源副本和修正筆記。最後明確決定這份逐字稿是否符合你的質素與完整性標準。

使用結構化 Actor 自動擷取

當一部或多部已知影片需要已儲存的閱讀文字和帶時間的證據時,Chronometrica YouTube Transcript Scraper 可協助收集這些資料。此 Actor 會讀取現有的公開字幕軌;當選取 json 和 text 時,可提供可讀的文字副本和帶時間的片段。

此 Actor 會讀取現有的公開字幕軌。它不會建立語音辨識、翻譯文字、下載媒體或發現影片。

要設定此 Actor,你須提供輸入。你可以查看專門預設,例如供 JSON 和 text 入門之用的 YouTube Transcript Scraper、供純文字預設之用的 YouTube Transcripts as Plain Text,或供純 JSON 預設之用的 YouTube Timestamped Transcript JSON。請注意,純文字預設不會保留帶時間的片段;當你同時需要閱讀文字和時間證據時,請一併使用 json 和 text。

startUrls 輸入接受一個由直接影片 URL 字串組成的陣列。outputFormats 輸入接受 json 和 text 等格式。includeFailedInputDetails 參數控制失敗輸入的詳細錯誤報告是否出現在 OUTPUT 執行摘要中。

json
{
  "startUrls": [
    "VIDEO_URL_TO_REPLACE"
  ],
  "outputFormats": [
    "json",
    "text"
  ],
  "includeFailedInputDetails": true
}
使用結構化 Actor 自動擷取

執行前,請把整個 VIDEO_URL_TO_REPLACE 代號換成已知的直接公開影片 URL,因為所示代號只是佔位符。

解讀執行結果與輸出欄位

一次 Actor 執行會產生資料集列和一份執行摘要記錄。一列資料集代表一份成功的不重複影片逐字稿,而不是一項輸入或一個片段。失敗的輸入不會建立資料集列。

OUTPUT 是交代成功、失敗和已略過重複項目的執行摘要記錄。主要摘要欄位包括 inputsReceived、uniqueVideosPlanned、rowsWritten、successfulTranscriptRows、failedInputs、duplicateVideosSkipped、statusCounts、errorCodeCounts 和 failedInputDetails。不要單憑空白的資料集,就推斷某部影片沒有字幕。

按照本文的 JSON 和 text 設定,每一列成功結果都同時包含純文字閱讀副本和帶時間的片段資料。選取其他輸出格式,並不自動表示帶時間的片段會保留在你的資料集中。

驗證輸出質素與指標(虛構)

要評估擷取的可靠程度,你可以計算樣本指標。考慮一次標明為虛構的執行,其中 preferredLanguages 設為 ["en"]。七個輸入連結包含五部不重複影片和兩個重複輸入。三部不重複影片成功取得英文逐字稿,一部沒有公開字幕,一部沒有相符的英文字幕軌,因而造成 LANGUAGE_UNAVAILABLE 錯誤。若改為使用預設的空白偏好,則可能選取另一條可用的語言字幕軌,因此單是沒有英文,並不會令預設執行失敗。

在此虛構樣本中:

  • 輸入總數:7
  • 不重複影片:5(3 個成功,2 個失敗)
  • 重複輸入:2
  • 已寫入的資料集列:3

可用軌的可用率 = 成功的不重複影片 / 不重複影片總數 = 3 / 5 = 60%。

這個 60% 的數字描述的是此選定樣本中可用軌的可用率,而不是準確度,也不是 YouTube 整體比率。

考慮另一個虛構的時間例子:第一個字幕片段於 2 秒開始,最後一個字幕片段於 92 秒結束,影片總長度為 100 秒。字幕跨度是 92 減 2,等於 90 秒。除以 100 秒的影片總長度後,比率是 90 比 100,即 0.90。

0.90 的字幕跨度比率只描述字幕跨度,不能量度用字準確度。該跨度內仍可能存在空隙和詞語辨識錯誤。平台執行成功,並不表示每一項輸入都產生了字幕。

診斷並處理失敗

失敗代碼描述的是觀察到的失敗類別,而不是必定提供確切的根本原因。請檢視下方已記載的代碼與下一步行動表,為每個錯誤配對適當的回應。

診斷並處理失敗
錯誤代碼所報告的狀況下一步檢查與行動
TRANSCRIPT_NOT_FOUND查詢後沒有可用的公開字幕軌檢查原生來源頁面;如有需要,要求提供字幕,或使用已授權的獨立轉錄。
LANGUAGE_UNAVAILABLE找不到所要求語言的相符項目檢查可用的來源字幕軌,並保留要求;只有在可接受時才更改方針。
INVALID_INPUT / UNSUPPORTED_INPUT提供了錯誤的輸入物件把該項目換成直接影片 URL 字串。
VIDEO_UNAVAILABLE影片無法使用,原因不明檢查連結是否有效,以及影片 ID 格式。
AGE_RESTRICTED / LOGIN_REQUIRED影片在公開範圍之外選擇一個可存取的來源;不存在任何繞過承諾。
ACCESS_BLOCKED / TEMPORARY_FAILURE / TRANSCRIPT_PARSE_FAILED發生請求或解析失敗檢查 isRetryable;只有值為 true 時,才執行有限度的稍後重試。

請始終對照這些已記載的類別,核實你的錯誤診斷。根據傳回的代碼採取精確的修正行動,不要猜測未經核實的原因。

來源與延伸閱讀

作者 Chronometrica · 更新日期

返回頂端 ↑