~/social/youtube-transcript-scraper
YouTube Subtitle & Transcript Scraper — JSON・SRT・VTT・LLM対応
動画、Shorts、再生リスト、チャンネルからYouTubeの字幕・文字起こしを、JSON、SRT、VTT、プレーンテキスト、またはクリーンなLLM対応テキストとして抽出します。100以上の言語、豊富なメタデータに対応、APIキー不要——抽出に失敗した場合は課金されません。
メディア
TypeScriptInnerTube
グローバル
カテゴリsocial / メディア
言語TypeScript
スタックTypeScript, InnerTube
マーケットグローバル
出力クリーンでRAG対応のJSON
主な機能
1つの入力で動画、Shorts、youtu.beリンク、再生リスト、チャンネルに対応 — 1回の実行で混在指定可能
5種類の出力フォーマット — JSON(タイムスタンプ付き)、SRT、VTT、プレーンテキスト、LLM対応([Music]、[Applause]、話者ラベルを除去)
優先順位付きの言語リストによる100以上の言語対応と、切り替え可能な自動字幕フォールバック
豊富なメタデータ — タイトル、チャンネル、説明文、公開日、再生回数、サムネイル、長さ、対応言語
maxVideos上限と1〜10の同時実行数で再生リスト・チャンネル全体を一括処理
レジデンシャルプロキシ対応とオプションのCookie指定で、ボットチェックによるブロックを軽減
多層的な抽出処理 — InnerTubeクライアント間で最大9段階のフォールバックを備え、最終手段としてyt-dlpのPOトークンを使用
サーキットブレーカーとアイテム単位のエラーハンドリングにより、大規模バッチも処理を継続
活用例
- 音声動画からRAGやファインチューニング用データセットを構築するAI/MLチーム(LLM対応テキスト出力)
- 文字起こしをブログ記事、番組概要、SNSキャプションへ再利用するコンテンツチーム
- インデックス登録やキーワード調査のために検索可能な動画テキストを抽出するSEOマーケター
- 標準的なSRT/VTT字幕ファイルを必要とする編集者・パブリッシャー
- チャンネルや再生リスト全体から文字起こしを一括収集する研究者
- YouTube APIキーなしで構造化されたタイムスタンプ付き字幕を必要とする開発者
入力パラメータ
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
urls | array | 任意 | YouTubeのURLまたは裸のID — 動画、Shorts、youtu.beリンク、再生リスト、チャンネル。実行時に必須。 |
outputFormat | string | 任意 | 文字起こしのフォーマット:json、srt、vtt、text、llmのいずれか(デフォルト:json)。 |
languages | array | 任意 | 優先順に指定する字幕言語(ISO 639-1コード、デフォルト:en)。 |
includeAutoGenerated | boolean | 任意 | 手動字幕がない場合に自動生成字幕へフォールバック(デフォルト:true)。 |
maxVideos | number | 任意 | 1回の実行で処理する動画数の上限(再生リスト/チャンネル向け、デフォルト:0=無制限)。 |
maxConcurrency | number | 任意 | 並列処理する動画数、1〜10(デフォルト:3)。 |
proxyConfiguration | object | 任意 | プロキシ設定。デフォルトはUSに固定されたApify Residential。 |
youtubeCookies | string | 任意 | ボットチェックによるブロックを軽減するオプションのYouTube Cookie(CookieヘッダーまたはCookies.txt)。 |
Output Example
1{
2 "videoId": "dQw4w9WgXcQ",
3 "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
4 "title": "Rick Astley - Never Gonna Give You Up (Official Video)",
5 "channelName": "Rick Astley",
6 "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
7 "publishDate": "2009-10-25",
8 "viewCount": 1761003712,
9 "availableLanguages": ["en", "de-DE", "ja", "pt-BR", "es-419"],
10 "language": "en",
11 "isAutoGenerated": false,
12 "duration": 213,
13 "wordCount": 487,
14 "segmentCount": 61,
15 "text": "We're no strangers to love, you know the rules and so do I...",
16 "segments": [{ "text": "We're no strangers to love", "start": 18.64, "end": 21.88 }],
17 "error": null
18}
Pricing
イベント課金制:正常に抽出された文字起こし1件につき1回課金されます——失敗した動画には一切課金されません。チャンネルや再生リストをまるごと渡しても、実際に取得できた字幕分だけの支払いで済みます。
Tips
- RAGやファインチューニングには
outputFormat: llmを使いましょう。 非音声の注記が除去され、エンベディングにはクリーンな文章が渡ります。 - レジデンシャルプロキシは有効にしておきましょう。 YouTubeはデータセンターIPを積極的にブロックします。このアクターがデフォルトでUSレジデンシャルを使うのはそのためです。
- 大規模なジョブでは
maxConcurrencyを1〜3から始め、徐々に上げていきましょう——大きなチャンネルのスクレイピングで同時実行数を上げすぎると、レート制限のリスクが高まります。
よくある質問
YouTube APIキーやログインは必要ですか?
いいえ。このアクターは字幕を直接抽出します——YouTube Data APIキーもログインも不要です。一部の動画で「ボットではないことを確認するためログインしてください」というブロックを軽減するために、オプションでCookieを指定できます。
対応している言語と字幕タイプは?
100以上の言語に対応しています。優先順位付きのISO 639-1コードのリストを指定してください(デフォルト:en)。このアクターは手動作成された字幕を優先し、includeAutoGeneratedを無効にしない限り自動生成字幕にフォールバックします。
抽出に失敗した動画にも課金されますか?
いいえ。課金は「文字起こし抽出成功」という単一のイベント単位で行われ、文字起こしが正常に保存された場合にのみ発生します。失敗した動画は出力にerrorフィールド付きで表示されますが、課金対象にはなりません。
RAG向けのクリーンなLLM対応テキストを取得できますか?
はい。outputFormatを「llm」に設定すると、[Music]/[Applause]の注記や話者ラベルが除去され、エンベディングやファインチューニングに最適なクリーンな文章が生成されます。