
動画が1本だけでも、読むために整えたテキストと、参照用の時刻情報付きの元テキストの両方が必要になる場合があります。ホスティング環境で動作するデータ収集プログラムであるActorを使い、保存済みの入力設定であるTaskを通じて設定できます。構造化されたテキスト形式であるJSONを選択すると、時刻情報付きのセグメントが保持されます。テキストのみの出力では保持されません。
字幕の生成元と制約を理解する
YouTubeの字幕には、クリエイターが手作業で作成してアップロードした字幕トラックと、プラットフォームのアルゴリズムによる自動音声認識で生成された字幕があります。公式ドキュメントによると、字幕がある動画では、動画の説明欄のメニューから文字起こしを直接表示できます(YouTubeヘルプ:文字起こしを表示する)。ただし、自動字幕は、発音の誤り、アクセント、方言、背景雑音などの影響で、発話内容を誤って表記することがあります(YouTubeヘルプ:自動字幕)。また、公式資料では、冒頭の長い無音や複数の声の重なりも、字幕の生成に問題が起きる原因として挙げられています。こうした一般的な原因の一覧だけでは、特定の動画の問題を診断できません。
公開字幕トラックにアクセスするには、対象動画で利用可能な字幕が実際に公開されている必要があります。字幕トラック自体が存在しない場合や無効になっている場合は、動画の直接URLを開くだけでは取得できません。公開字幕へのアクセスと、通常の動画視聴へのアクセスは別です。限定公開動画でも、クリエイターが有効にしていれば公開字幕トラックを利用できるため、限定公開動画と非公開動画を同じものとして扱わないでください。字幕がない場合、言語が一致しない場合、抽出に失敗した場合を区別してください。
文字起こしを取得して確認する実践手順
- 抽出を始める前に、動画への正確な直接リンクを確認し、主な研究目的を記録します。再生リストやチャンネルのページではなく、対象が明確な公開動画のURLを使っていることを確認してください。
- YouTube上で動画ページを開き、説明欄までスクロールして「文字起こしを表示」をクリックし、利用可能な字幕トラックを確認します。この項目がない場合は、すぐに非公開だと判断せず、次の確認が必要な状態として扱ってください。
- 閲覧用のプレーンテキスト、時刻情報付きの根拠資料、またはその両方から、必要な出力を選びます。読みやすいテキストと時刻情報付きセグメントの両方が必要な場合は、jsonとtextを併せて選択します。
- startUrls配列に動画の直接URLを1つ指定し、outputFormatsを["json", "text"]に設定して、includeFailedInputDetailsを有効にしたままにします。preferredLanguagesを空にすると、スクレイパーが利用可能な字幕トラックから最適なものを選びます。英語のみを対象に厳密に分析する場合は、["en"]に設定する必要があります。
- 抽出を実行し、データセットの行とOUTPUTのサマリーレコードの両方を確認します。rowsWritten、successfulTranscriptRows、failedInputs、duplicateVideosSkippedなどのフィールドを使い、各入力がどう処理されたかを把握します。
- textはデータセットの行に含まれるフィールドであり、テキストファイルが自動的にダウンロードされるわけではありません。成功した行を開き、textフィールドの値を自分の閲覧用文書にコピーします。時刻情報を参照できるよう、セグメントを含む元データをJSONで別途エクスポートして保存します。videoIdと、実際のtranscriptLanguageCodeおよびtranscriptLanguageNameを確認してください。正確な言い回しが重要な場合は、冒頭、中盤、終盤の音声サンプルを、対応する字幕セグメントと照合します。ただし、抜き取り確認で、すべての語の正確性が保証されるわけではありません。手作業による修正は、未加工の元データと分けて管理してください。
- エラーコードがある場合は、失敗時の対応表と照合し、次の手順を決めます。isRetryableプロパティを確認し、その値がtrueの場合に限り、時間を置いて上限を設けた再試行を行います。
- URL、動画ID、実際の言語、自動生成か手動作成かを示すフラグ、scrapedAtの収集時刻、結果の状態、元データのコピー、修正メモを保存します。最後に、文字起こしが品質と完全性の基準を満たしているかを明確に判断します。
構造化データを扱うActorで抽出を自動化する
対象が決まっている1本以上の動画について、閲覧用テキストと時刻情報付きの根拠資料を保存する必要がある場合は、Chronometrica YouTube Transcript Scraperがデータ収集に役立ちます。このActorは既存の公開字幕トラックを読み取り、jsonとtextを選択すると、読みやすいテキストと時刻情報付きセグメントを出力できます。
このActorは、既存の公開字幕トラックを読み取ります。音声認識による文字起こしの新規作成、テキストの翻訳、メディアのダウンロード、動画の検索は行いません。
Actorを設定するには、入力を指定します。用途別のプリセットには、JSONとテキストの出力を始めるためのYouTube Transcript Scraper、テキストのみを出力するYouTube Transcripts as Plain Text、JSONのみを出力するYouTube Timestamped Transcript JSONがあります。テキストのみのプリセットでは、時刻情報付きセグメントは保持されません。閲覧用テキストと時刻の根拠の両方が必要な場合は、jsonとtextを併せて使用してください。
startUrlsには、動画の直接URLを文字列の配列で入力します。outputFormatsには、jsonやtextなどの形式を指定できます。includeFailedInputDetailsパラメーターは、失敗した入力に関する詳細なエラーレポートをOUTPUTの実行サマリーに含めるかどうかを制御します。
{
"startUrls": [
"VIDEO_URL_TO_REPLACE"
],
"outputFormats": [
"json",
"text"
],
"includeFailedInputDetails": true
}表示されているVIDEO_URL_TO_REPLACEは仮の文字列です。実行前に、この文字列全体を、対象となる公開動画の直接URLに置き換えてください。
実行結果と出力フィールドの読み取り方
Actorを実行すると、データセットの行と実行サマリーレコードが生成されます。データセットの1行は、取得に成功した重複のない1本の動画の文字起こしを表します。入力1件やセグメント1つを表すものではありません。失敗した入力については、データセットの行は作成されません。
OUTPUTは、成功、失敗、重複によるスキップを集計する実行サマリーレコードです。主なサマリーフィールドには、inputsReceived、uniqueVideosPlanned、rowsWritten、successfulTranscriptRows、failedInputs、duplicateVideosSkipped、statusCounts、errorCodeCounts、failedInputDetailsがあります。データセットが空であることだけを根拠に、動画に字幕がないと判断しないでください。
この記事のJSONとテキストの設定では、成功した各行に、閲覧用のプレーンテキストと時刻情報付きセグメントの両方が含まれます。他の出力形式を選択した場合、データセットに時刻情報付きセグメントが保持されるとは限りません。
出力品質と指標の検証(架空の例)
抽出の信頼性を評価するために、サンプルの指標を計算できます。ここでは架空の実行例として、preferredLanguagesを["en"]に設定した場合を考えます。入力リンクは7件で、重複を除くと動画は5本、重複した入力は2件あります。重複を除いた動画のうち3本では英語の文字起こしを取得でき、1本には公開字幕がなく、もう1本には指定に一致する英語の字幕トラックがないため、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 | 照会しても、利用可能な公開字幕トラックが見つからない | YouTubeの元の動画ページを確認します。必要に応じて字幕を依頼するか、許可を得たうえで別途文字起こしを行います。 |
| LANGUAGE_UNAVAILABLE | 指定した言語に一致する字幕が見つからない | 元の動画で利用可能な字幕トラックを確認します。言語の要件を維持するか、許容できる場合に限って方針を変更します。 |
| INVALID_INPUT / UNSUPPORTED_INPUT | 指定された入力オブジェクトが正しくない | 該当する入力項目を、動画の直接URLの文字列に置き換えます。 |
| VIDEO_UNAVAILABLE | 原因不明で動画を利用できない | リンクの有効性と動画IDの形式を確認します。 |
| AGE_RESTRICTED / LOGIN_REQUIRED | 動画が公開アクセスの対象範囲外にある | アクセスできる動画を選びます。制限を回避できるという保証はありません。 |
| ACCESS_BLOCKED / TEMPORARY_FAILURE / TRANSCRIPT_PARSE_FAILED | リクエストまたは解析で失敗が発生した | isRetryableを確認し、trueの場合に限り、時間を置いて上限を設けた再試行を行います。 |
エラーの診断結果は、必ずこれらの文書化された分類と照合してください。未確認の原因を推測するのではなく、返されたコードに基づいて的確に対処します。
出典と参考資料
著者 Chronometrica · 更新日
ページの先頭へ ↑

