YouTube データ活用

youtube-transcript-apiで字幕を取得する方法【Pythonサンプル+実行結果付き】

2025年9月29日

この記事では、youtube-transcript-api を使って、YouTube動画の字幕テキストをPythonから取得する方法を解説します。

最終的には、動画IDを指定して字幕を取得し、字幕本文をCSVやTXTとして保存できる状態を目指します。取得した字幕は、動画内容の要約、テキスト分析、キーワード抽出、配信アーカイブの整理などに活用できます。

この記事でできること

  • YouTube動画IDを指定して字幕を取得する
  • 日本語字幕を優先し、なければ英語字幕を探す
  • 取得した字幕をDataFrameに変換する
  • 字幕をCSVファイルとして保存する
  • 字幕本文だけをTXTファイルとして保存する
  • 字幕が取得できない場合の注意点を理解する
  • yt-dlpやWhisperとの使い分けを整理する

想定読者

  • YouTube動画の字幕をPythonで取得したい方
  • 動画内容を要約・検索・テキスト分析に使いたい方
  • YouTube Data APIでは取得しにくい字幕テキストを扱いたい方
  • Whisperで文字起こしする前に、既存字幕を使えるか確認したい方

利用上の注意

youtube-transcript-api は便利なライブラリですが、YouTubeの公式APIではありません。利用時には、各サービスの利用規約や著作権、アクセス制限に配慮してください。

  • 本記事は、公開されている字幕情報を技術検証・分析前処理として扱うことを目的としています。
  • 字幕テキストや動画内容を、権利者の許可なく再配布・転載する行為を推奨するものではありません。
  • 字幕が存在しない動画、字幕が無効化されている動画、非公開・削除済みの動画では取得できません。
  • 短時間に大量アクセスするような使い方は避け、必要な範囲で実行してください。
  • 取得した字幕には誤認識や表記ゆれが含まれる場合があります。分析時は前処理や確認が必要です。

youtube-transcript-apiで取得できるもの

youtube-transcript-api では、YouTube動画に用意されている字幕を取得できます。取得できる主な情報は以下です。

  • text:字幕テキスト
  • start:字幕の開始秒
  • duration:字幕の表示時間

字幕は、投稿者が設定した手動字幕の場合もあれば、YouTube側の自動生成字幕の場合もあります。動画によって取得できる言語や字幕の種類は異なります。

yt-dlp・Whisperとの使い分け

YouTubeの文字情報を扱う方法には、youtube-transcript-apiyt-dlp、Whisperなどがあります。それぞれ向いている用途が異なります。

方法向いている用途特徴
youtube-transcript-api既存字幕の取得字幕が存在すれば、音声処理なしでテキストを取得できる
yt-dlp字幕ファイルや音声ファイルの保存字幕・音声・動画を分析前処理として保存しやすい
Whisper音声からの文字起こし字幕がない動画でも、音声ファイルから文字起こしできる

まずは youtube-transcript-api で字幕が取得できるか確認し、字幕がない場合は音声を用意してWhisperで文字起こしする、という使い分けが実用的です。

ライブラリのインストール

まず、必要なライブラリをインストールします。

pip install -U youtube-transcript-api pandas

インストール後、Pythonから読み込めるか確認します。

python -c "from youtube_transcript_api import YouTubeTranscriptApi; print('import ok')"

動画IDの確認方法

youtube-transcript-api では、YouTubeのURL全体ではなく、動画IDを指定します。

たとえば、以下のURLであれば、動画IDは dQw4w9WgXcQ です。

https://www.youtube.com/watch?v=dQw4w9WgXcQ

動画IDだけを取り出して、Pythonコード内で指定します。

最小コード:字幕を取得して表示する

まずは、字幕を取得して先頭数件を表示する最小コードです。

from youtube_transcript_api import YouTubeTranscriptApi

video_id = "dQw4w9WgXcQ"

ytt_api = YouTubeTranscriptApi()

fetched = ytt_api.fetch(video_id, languages=["ja", "ja-JP", "en"])

for snippet in fetched[:5]:
    print(snippet.text, snippet.start, snippet.duration)

languages には、取得したい字幕の言語を優先順で指定します。上の例では、日本語、地域付き日本語、英語の順で探します。

実用コード:字幕をCSVとTXTに保存する

次に、取得した字幕をDataFrameに変換し、CSVとTXTとして保存する例です。

from pathlib import Path

import pandas as pd
from youtube_transcript_api import (
    YouTubeTranscriptApi,
    NoTranscriptFound,
    TranscriptsDisabled,
    VideoUnavailable,
)

video_id = "dQw4w9WgXcQ"
languages = ["ja", "ja-JP", "en"]

output_dir = Path("youtube_transcripts")
output_dir.mkdir(parents=True, exist_ok=True)

ytt_api = YouTubeTranscriptApi()

try:
    fetched = ytt_api.fetch(video_id, languages=languages)
    data = fetched.to_raw_data()

    df = pd.DataFrame(data)

    csv_path = output_dir / f"{video_id}_transcript.csv"
    txt_path = output_dir / f"{video_id}_transcript.txt"

    df.to_csv(csv_path, index=False, encoding="utf-8-sig")

    transcript_text = "\n".join(df["text"].astype(str).tolist())
    txt_path.write_text(transcript_text, encoding="utf-8")

    print(f"saved csv: {csv_path}")
    print(f"saved txt: {txt_path}")
    print("rows:", len(df))
    print(df.head())

except TranscriptsDisabled:
    print("Error: この動画では字幕機能が無効化されています。")
except VideoUnavailable:
    print("Error: 動画が削除・非公開などで利用できません。")
except NoTranscriptFound:
    print("Error: 指定した言語の字幕が見つかりませんでした。")
except Exception as e:
    print("Unexpected Error:", e)

CSVには字幕本文、開始秒、表示時間が保存されます。TXTには字幕本文だけを結合して保存します。要約やテキスト分析に使う場合は、TXT形式にしておくと扱いやすいです。

手動字幕と自動生成字幕を確認する

動画によっては、手動字幕と自動生成字幕の両方が存在する場合があります。取得可能な字幕の一覧を確認したい場合は、list() を使います。

from youtube_transcript_api import YouTubeTranscriptApi

video_id = "dQw4w9WgXcQ"

ytt_api = YouTubeTranscriptApi()
transcript_list = ytt_api.list(video_id)

for transcript in transcript_list:
    print(
        transcript.language,
        transcript.language_code,
        "generated:", transcript.is_generated,
        "translatable:", transcript.is_translatable,
    )

手動字幕を優先したい場合や、自動生成字幕を明示的に探したい場合は、find_manually_created_transcript()find_generated_transcript() を使います。

from youtube_transcript_api import YouTubeTranscriptApi

video_id = "dQw4w9WgXcQ"
languages = ["ja", "ja-JP", "en"]

ytt_api = YouTubeTranscriptApi()
transcript_list = ytt_api.list(video_id)

try:
    transcript = transcript_list.find_manually_created_transcript(languages)
except Exception:
    transcript = transcript_list.find_generated_transcript(languages)

fetched = transcript.fetch()
data = fetched.to_raw_data()

print(data[:3])

手動字幕の方が意図した表記になっていることが多い一方、自動生成字幕は音声認識の誤りが含まれる場合があります。分析前には、表記ゆれや不要な記号を確認するのがおすすめです。

実行結果の例

字幕が取得できる動画では、以下のようなデータが得られます。

saved csv: youtube_transcripts/dQw4w9WgXcQ_transcript.csv
saved txt: youtube_transcripts/dQw4w9WgXcQ_transcript.txt
rows: 352

                              text  start  duration
0                             こんにちは   0.00      3.2
1                         今日はAIについて話します   3.20      2.1
2                     まず最初に概要を説明します   5.40      4.5

実際の字幕内容や行数は、対象動画や字幕の有無によって変わります。

取得した字幕の活用例

  • 動画内容の要約
  • 字幕テキストのキーワード抽出
  • 配信アーカイブ内の話題検索
  • 動画ごとの話題傾向の比較
  • 字幕を使ったテキスト分析やトピック分類

字幕が取得できる場合は、音声認識を改めて行わずにテキスト分析へ進めるため、処理時間を大きく短縮できます。

つまずきやすいポイント

指定言語の字幕が見つからない

指定した言語の字幕が存在しない場合、NoTranscriptFound が発生します。まずは list() で取得可能な字幕を確認してください。

字幕機能が無効化されている

投稿者側の設定や動画の状態によっては、字幕が取得できない場合があります。この場合は、音声ファイルを用意してWhisperで文字起こしする方法を検討します。

YouTube URL全体を指定している

youtube-transcript-api で指定するのは、URL全体ではなく動画IDです。https://www.youtube.com/watch?v=...v= 以降を指定してください。

自動生成字幕に誤認識がある

自動生成字幕は便利ですが、固有名詞、専門用語、早口の会話などで誤認識が含まれることがあります。要約や分析に使う場合は、必要に応じて前処理や目視確認を行ってください。

大量取得で失敗する

短時間に多数の動画へアクセスすると、取得に失敗しやすくなる場合があります。複数動画を扱う場合は、取得件数や実行間隔を調整してください。

次に読む記事

まとめ

この記事では、youtube-transcript-api を使ってYouTube動画の字幕を取得し、CSVやTXTとして保存する方法を紹介しました。

字幕が取得できる動画であれば、音声認識を行わずにテキスト分析や要約へ進めます。一方で、字幕が存在しない動画や字幕機能が無効化されている動画では取得できないため、その場合はyt-dlpで音声を用意し、Whisperで文字起こしする流れを検討してください。

-YouTube, データ活用