YouTube API データ活用

yt-dlpでYouTubeの動画・音声・字幕を保存する方法【Python/CLI・実行例付き】

2025年10月4日

yt-dlp は YouTube などの動画サイトから動画・音声・字幕を保存できる非公式ツールです。本記事では CLI(コマンドライン)Python の両方で利用する方法を整理しました。音声抽出(WAV/MP3)、動画保存(MP4)、字幕取得(VTT)、プレイリスト保存、部分切り出しまで解説します。

Whisperによる文字起こしや YouTube API 分析の前処理にも活用可能です。

注意事項

  • 利用は 個人利用・研究用途 に限定してください。
  • 著作権者の許可なく動画・音声・字幕を再配布することは禁止されています。
  • YouTube利用規約に反する方法での利用は行わないでください。
  • ffmpegのインストールとPATH設定(Windows) が必須です。

1. CLI(コマンドライン)で使う方法

① yt-dlpのインストール


pip install -U yt-dlp
yt-dlp --version

② 音声だけ保存(WAV / MP3)

Whisper用の音声抽出に便利です。


# WAV形式で保存
yt-dlp -x --audio-format wav -o "D:/youtube_downloads/%(title)s.%(ext)s" "https://www.youtube.com/watch?v=VIDEO_ID"

# MP3形式で保存
yt-dlp -x --audio-format mp3 -o "D:/youtube_downloads/%(title)s.%(ext)s" "https://www.youtube.com/watch?v=VIDEO_ID"

③ 動画を保存(MP4形式)


yt-dlp -f "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]/b" --merge-output-format mp4 -o "D:/youtube_downloads/%(title)s.%(ext)s" "https://www.youtube.com/watch?v=VIDEO_ID"

④ 字幕を保存(日本語のみ)


yt-dlp --skip-download --write-subs --write-auto-sub --sub-langs "ja" --sub-format vtt -o "D:/youtube_downloads/%(title)s.%(ext)s" "https://www.youtube.com/watch?v=VIDEO_ID"

⑤ プレイリスト・部分保存


# プレイリスト丸ごと
yt-dlp -o "D:/youtube_downloads/%(playlist_title)s/%(playlist_index)03d - %(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLAYLIST_ID"

# プレイリストの一部(1~10番目)
yt-dlp --playlist-start 1 --playlist-end 10 -o "D:/youtube_downloads/%(playlist_title)s/%(playlist_index)03d - %(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLAYLIST_ID"

# 動画の一部分(1分~3分)
yt-dlp --download-sections "*00:01:00-00:03:00" -o "D:/youtube_downloads/%(title)s.%(ext)s" "https://www.youtube.com/watch?v=VIDEO_ID"

2. Pythonで使う方法

Pythonから呼び出すことで自動処理やデータ分析パイプラインに組み込めます。

① 保存場所設定(基本形)


import yt_dlp

VIDEO_ID = "XXXXXXXXXXX"
URL = f"https://www.youtube.com/watch?v={VIDEO_ID}"
OUTPUT = r"D:\youtube_downloads\%(title)s.%(ext)s"

ydl_opts = {"outtmpl": OUTPUT}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    info = ydl.extract_info(URL, download=False)
    print("title:", info.get("title"))
    print("ext  :", info.get("ext"))

② 音声のみ保存(WAV形式・Whisper向け)


import yt_dlp

VIDEO_ID = "XXXXXXXXXXX"
URL = f"https://www.youtube.com/watch?v={VIDEO_ID}"
OUTPUT = r"D:\youtube_downloads\%(title)s.%(ext)s"

ydl_opts = {
    "format": "bestaudio/best",
    "outtmpl": OUTPUT,
    "postprocessors": [{
        "key": "FFmpegExtractAudio",
        "preferredcodec": "wav",
        "preferredquality": "192",
    }],
    "retries": 10,
    "extractor_retries": 10,
    "sleep_requests": 1.5,
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    ydl.download([URL])

③ 動画+字幕を保存(MP4+日本語字幕)


import yt_dlp

VIDEO_ID = "XXXXXXXXXXX"
URL = f"https://www.youtube.com/watch?v={VIDEO_ID}"
OUTPUT = r"D:\youtube_downloads\%(title)s.%(ext)s"

ydl_opts = {
    "format": "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]/b",
    "merge_output_format": "mp4",
    "outtmpl": OUTPUT,

    "writesubtitles": True,
    "writeautomaticsub": True,
    "subtitleslangs": ["ja"],
    "subtitlesformat": "vtt",

    "retries": 10,
    "extractor_retries": 10,
    "sleep_requests": 1.5,
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    ydl.download([URL])

④ プレイリスト保存(例:1〜10番目を音声MP3で保存)


import yt_dlp

PLAYLIST_ID = "XXXXXXXXXXX"
PLAYLIST_URL = f"https://www.youtube.com/playlist?list={PLAYLIST_ID}"
OUTPUT = r"D:\youtube_downloads\%(playlist_title)s\%(playlist_index)03d - %(title)s.%(ext)s"

ydl_opts = {
    "outtmpl": OUTPUT,
    "playliststart": 1,
    "playlistend": 10,

    "format": "bestaudio/best",
    "postprocessors": [{
        "key": "FFmpegExtractAudio",
        "preferredcodec": "mp3",
        "preferredquality": "192",
    }],

    "retries": 10,
    "extractor_retries": 10,
    "sleep_requests": 1.5,
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    ydl.download([PLAYLIST_URL])

⑤ 時間指定保存(例:1分〜3分をMP4で切り出し)


import yt_dlp

VIDEO_ID = "XXXXXXXXXXX"
URL = f"https://www.youtube.com/watch?v={VIDEO_ID}"
OUTPUT = r"D:\youtube_downloads\%(title)s.%(ext)s"

ydl_opts = {
    "outtmpl": OUTPUT,
    "format": "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]/b",
    "merge_output_format": "mp4",

    "download_sections": ["*00:01:00-00:03:00"],

    "retries": 10,
    "extractor_retries": 10,
    "sleep_requests": 1.5,
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    ydl.download([URL])

3. 実行結果・よくあるエラー・Tips

よくあるエラーと対処法

  • 音声が出ない(無音MP4) → ba[ext=m4a] を指定して再取得(Opus回避)
  • HTTP 429 Too Many Requests → subtitleslangs=["ja"] に限定+sleep_requests
  • ffmpegが見つからない → ffmpegのインストールとPATH設定 を確認
  • Impersonation warning → 無視してOK(特殊ライブラリ未導入の警告)

Tips

  • %(uploader)s/%(upload_date)s - %(title)s.%(ext)s で自動フォルダ分け可能
  • .wav 保存は Whisper にそのまま投入できる
  • 字幕はデフォルト .vttsrt 形式も選べる

次に読む

Whisperで文字起こしして要約する方法

ffmpegのインストールとPATH設定(Windows)

YouTubeの情報を取得する方法まとめ

-YouTube API, データ活用