YouTube Transcript APIで、字幕のない動画もテキストに

YouTube Transcript APIに動画のURLを送ると、JSON・テキスト・SRT・VTTで文字起こしを取得できます。使える字幕があれば取得し、なければAIが音声から文字起こしします。

  • 字幕を優先し、なければAIで文字起こし
  • 字幕もAIも1分あたり1クレジット
  • watch・youtu.be・Shorts・埋め込みURLに対応

アプリで必要なテキストの取得方法を選べます

普段使っている動画リンクで送れます
watchページ、youtu.be、Shorts、埋め込み、liveのURLを受け付けます。wwwの有無は問いません。進行中のライブ配信は処理できません。
投稿者の字幕を優先します
source=autoでは、投稿者がアップロードした字幕、自動生成字幕の順に確認します。自動翻訳された字幕は使いません。
字幕がなくても音声から取得できます
使える字幕がなければAI文字起こしに切り替えます。字幕を使わず、音声から作り直したい場合はsource=sttを指定します。
テキストの取得元も残ります
transcript_sourceでyoutube_captionsとspeech_to_textを区別できます。字幕を取得したのか、音声から文字起こししたのかをアプリ側でも確認できます。
字幕とAIで料金は変わりません
動画の長さを分単位で切り上げ、1分あたり1クレジットを使います。文字起こしが失敗した場合やキャンセルした場合は課金しません。

動画URLをPOSTし、IDを保存します

APIキーと動画URLをPOST /v1/transcriptionsに送ります。Pythonでも、普段のHTTPクライアントでも使えます。wait=60を付けると最大60秒待ちます。指定できる項目はAPIリファレンスで確認できます。

APIキーはダッシュボードで作成し、サーバーやスクリプトから使います。作成リクエストが成功したら、返ってきた文字起こしIDを保存してください。待ち時間を過ぎても処理は続きます。同じ動画を再送せず、GET /v1/transcriptions/:idで続きを確認します。

queued、fetching、transcribingは処理の途中です。completedになったらテキストを取得し、failedならエラーを処理します。応答が遅れた場合や動画を取得できなかった場合に、空のテキストを「成功」として返さない設計にしてください。

cURL
curl -X POST "https://api.transcript1.com/v1/transcriptions?wait=60" \
  -H "Authorization: Bearer $TRANSCRIPT1_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"youtube","url":"https://youtu.be/dQw4w9WgXcQ"}'

transcript_sourceで取得元を確認します

字幕を使った場合は、その種類もレスポンスで分かります。billed_minutesは動画の長さを分単位で切り上げた値です。各フィールドは文字起こしオブジェクトにまとめています。

取得元を記録するアプリでは、transcript_sourceとcaption_kindも保存します。投稿者がアップロードした字幕には単語ごとのタイムスタンプがありません。自動生成字幕には単語の開始時刻、AI文字起こしには開始・終了時刻と信頼度があります。単語のデータが必要なときだけinclude=wordsを付けます。

セグメントには開始・終了位置が秒で入ります。再生位置に移動するUIや、録音と対応したメモに使えます。以下のJSONは構造を示す例です。リクエスト例の動画を引用したものではありません。

JSONレスポンスの抜粋
{
  "id": "tr_8fK2Lm0PqRsTuVwXyZaBcD",
  "status": "completed",
  "transcript_source": "youtube_captions",
  "caption_kind": "auto_generated",
  "language": "en",
  "billed_minutes": 4,
  "transcript": {
    "text": "Welcome back to the channel. Today we are looking at how transcripts are made.",
    "segments": [
      { "start": 0, "end": 4.2, "speaker": null, "language": "en", "text": "Welcome back to the channel." }
    ]
  }
}

字幕の取得とAI文字起こしを使い分けます

sourceの初期値はautoです。captions(字幕のみ)では、使える字幕がなければno_captionsになり、課金しません。sttなら常に音声から文字起こしします。言語や話者分離との組み合わせは取得方法の設定で確認できます。

公開された字幕そのものが必要ならcaptions(字幕のみ)を選びます。音声から作り直す場合や話者分離が必要な場合はsttを使います。autoでもdiarize=trueなら字幕を使わずAI文字起こしに進みます。captionsと話者分離は併用できず、リクエストはエラーになります。

languageを指定した場合、字幕はその言語と一致する必要があります。autoなら動画の元の言語を使い、自動翻訳字幕は取得しません。AI文字起こしで言語を指定しても、別の言語への翻訳にはなりません。

音声から文字起こしするリクエスト
{
  "platform": "youtube",
  "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "source": "stt"
}

再送する前に、エラーと既存のジョブを確認します

非公開動画、年齢制限付き動画、進行中のライブ配信は、再送しても取得できません。no_captionsなら、字幕の代わりに音声から文字起こししてよいかを判断します。まだ処理中なら同じIDで確認してください。エラー一覧を使い、原因ごとに対応を分けます。

作成リクエストを再試行する場合はIdempotency-Keyの仕様に従います。最近の文字起こしを再利用する設定は、同じ動画と同じオプションを照合する別の機能です。キャッシュの利用だけでは無料になるとは限りません。完了済みのジョブをIDで読み直す場合は、分数を消費しません。

同じエンドポイントでTikTokやInstagramなどにも対応できます。YouTube、X、TikTok、Blueskyは字幕を優先する例ですが、全プラットフォームの一覧ではありません。ソース別の対応表に合わせ、使えない設定をUIで選ばせないようにします。

初回60分は無料です

メールアドレスの認証後、初回のみ60分を無料で使えます。クレジットカードは必要ありません。

APIキーを取得

よくある質問

ほかにご質問はありますか?サポートに問い合わせる

字幕がない動画にも使えますか?

はい。source=autoでは、使える字幕がない場合にAIが音声から文字起こしします。字幕がない動画をエラーにしたい場合はcaptions(字幕のみ)を指定します。

どのYouTubeリンクを送れますか?

watchページ、youtu.be、Shorts、埋め込み、liveのURLに対応します。ただし進行中のライブ配信は処理できません。チャンネルページや動画を指定していない再生リストは422 invalid_urlになります。

非公開の動画も取得できますか?

いいえ。取得できるのは公開動画と限定公開動画です。非公開、年齢制限付き、ライブ配信中の動画は処理できません。手元にある自分の録画は、ファイルとしてアップロードできます。

字幕とAI文字起こしで料金は違いますか?

同じです。動画の長さを分単位で切り上げ、1分あたり1クレジットを使います。新規アカウントはメール認証後に1回限り60分を無料で使えます。カード登録は不要です。

Pythonパッケージのyoutube-transcript-apiですか?

いいえ。transcript1はホスト型のREST APIです。Pythonから使う場合も、APIキーを付けてHTTPリクエストを送ります。