YouTube データ活用

yt-dlpでYouTube音声・字幕を取得する方法|Whisper文字起こし前処理【Python/CLI】

2025年10月4日

この記事では、yt-dlpを使ってYouTubeの動画・音声・字幕を保存する基本手順を、CLI(コマンドライン)とPythonの両方で解説します。

最終的には、動画ファイルの保存、Whisper向けの音声抽出、字幕ファイルの保存、プレイリストの一部保存、時間指定での切り出しまでを試せる状態を目指します。YouTube動画の文字起こしや字幕分析、配信アーカイブの前処理などに活用できます。

この記事でできること

  • yt-dlpをインストールして、コマンドラインから実行できるようにする
  • YouTube動画をMP4形式で保存する
  • 動画から音声だけを抽出し、WAV / MP3形式で保存する
  • 日本語字幕をVTT形式で保存する
  • プレイリストの一部だけを保存する
  • 動画の指定時間だけを切り出して保存する
  • Pythonからyt-dlpを呼び出して、自動処理に組み込む

想定読者

  • YouTube動画や配信アーカイブを、文字起こし・要約・分析の前処理に使いたい方
  • Whisperに入力する音声ファイルを作成したい方
  • CLIだけでなく、Pythonスクリプトからyt-dlpを使いたい方
  • YouTube Data APIでは取得できない動画・音声・字幕ファイルを扱う方法を知りたい方

利用上の注意

yt-dlpは便利なツールですが、動画・音声・字幕といったコンテンツそのものを保存できるため、利用時には権利や利用規約への配慮が必要です。

  • 本記事は、自身が権利を持つ動画、利用許可を得た動画、または各サービスの規約・著作権法上問題のない範囲での技術検証を目的としています。
  • 第三者の動画・音声・字幕を無断で保存、再配布、転載する行為を推奨するものではありません。
  • YouTubeを含む各サービスの利用規約、著作権、APIやアクセス制限を確認したうえで利用してください。
  • 大量アクセスや短時間での連続取得は避け、必要な範囲で実行してください。

使用するもの

  • Python 3.10以降
  • yt-dlp
  • ffmpeg
  • PowerShell または コマンドプロンプト

ffmpegは、音声変換や動画と音声の結合、時間指定での切り出しなどに使います。未設定の場合は、先に以下の記事を確認してください。

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

yt-dlpとyoutube-dlの違い

yt-dlpは、youtube-dlをベースに開発されている派生ツールです。現在はyt-dlpの方が更新頻度が高く、YouTube側の仕様変更にも比較的追従しやすいため、これから使う場合はyt-dlpを選ぶのが無難です。

項目yt-dlpyoutube-dl
位置づけyoutube-dlの派生ツール元になったツール
更新状況比較的活発更新が少ない時期がある
使い方youtube-dlに近いコマンド体系基本的な使い方は近い
選び方新しく使うならこちらを推奨既存環境で使っている場合のみ検討

yt-dlpとYouTube Data APIの使い分け

yt-dlpとYouTube Data APIでは、取得できる情報が異なります。

用途向いている方法
動画タイトル、公開日、動画ID、再生数などのメタデータ取得YouTube Data API
チャンネルの動画一覧取得YouTube Data API
字幕テキストの取得youtube-transcript-api / yt-dlp
音声ファイルの抽出yt-dlp + ffmpeg
Whisperによる文字起こし用音声の作成yt-dlp + ffmpeg
配信アーカイブの分析前処理目的に応じてAPIとyt-dlpを併用

分析用途では、YouTube Data APIでメタデータを取得し、yt-dlpで音声や字幕を取得し、Whisperやテキスト分析につなげるという組み合わせが実用的です。

事前準備:yt-dlpのインストール

まずはyt-dlpをインストールします。

pip install -U yt-dlp

インストール後、以下のコマンドでバージョンが表示されれば準備完了です。

yt-dlp --version

音声変換やMP4への結合を行う場合は、ffmpegも利用します。以下のコマンドで確認できます。

ffmpeg -version

CLIで使う方法

まずは、コマンドラインからyt-dlpを使う基本例を紹介します。以降の例では、保存先を D:/youtube_downloads/ としています。必要に応じて自分の環境に合わせて変更してください。

動画の情報だけ確認する

いきなり保存せず、まずは動画タイトルなどの情報を確認したい場合は、以下のように実行します。

yt-dlp --skip-download --print "%(title)s | %(duration_string)s | %(uploader)s" "https://www.youtube.com/watch?v=VIDEO_ID"

動画タイトル、長さ、投稿者名が表示されれば、URLを正しく認識できています。

音声だけ保存する(WAV / MP3)

Whisperで文字起こしする場合は、音声だけをWAV形式で保存しておくと扱いやすいです。

# 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形式で保存する

動画と音声を取得し、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"

bv* は動画、ba は音声を意味します。動画と音声が別々に取得される場合は、ffmpegで結合されます。

日本語字幕を保存する

字幕だけを保存する場合は、--skip-download を付けます。手動字幕と自動生成字幕の両方を対象にする例です。

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"

字幕が存在しない動画では、字幕ファイルは保存されません。字幕取得を主目的にする場合は、以下の記事も参考になります。

youtube-transcript-apiで字幕を取得する方法

プレイリストの一部を保存する

プレイリスト全体ではなく、一部だけ保存したい場合は、--playlist-start--playlist-end を使います。

# プレイリスト全体
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"

動画の一部分だけ保存する

長い配信アーカイブから一部だけ切り出したい場合は、--download-sections を使います。

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"

上記は、動画の1分00秒から3分00秒までを保存する例です。

Pythonで使う方法

Pythonからyt-dlpを使うと、複数動画の処理や、Whisperによる文字起こし前処理に組み込みやすくなります。

動画情報を取得する最小コード

まずは、保存せずに動画情報だけを取得する最小コードです。

import yt_dlp

VIDEO_ID = "VIDEO_ID"
url = f"https://www.youtube.com/watch?v={VIDEO_ID}"

ydl_opts = {
    "quiet": True,
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    info = ydl.extract_info(url, download=False)

print("title:", info.get("title"))
print("duration:", info.get("duration"))
print("uploader:", info.get("uploader"))

動画タイトル、再生時間、投稿者名が表示されれば、Pythonからyt-dlpを呼び出せています。

Whisper向けに音声をWAV保存する

Whisperで文字起こしを行う前処理として、音声だけをWAV形式で保存する例です。

from pathlib import Path
import yt_dlp

VIDEO_ID = "VIDEO_ID"
url = f"https://www.youtube.com/watch?v={VIDEO_ID}"

output_dir = Path("D:/youtube_downloads")
output_dir.mkdir(parents=True, exist_ok=True)

ydl_opts = {
    "format": "bestaudio/best",
    "outtmpl": str(output_dir / "%(title)s.%(ext)s"),
    "postprocessors": [{
        "key": "FFmpegExtractAudio",
        "preferredcodec": "wav",
        "preferredquality": "192",
    }],
    "retries": 5,
    "extractor_retries": 5,
    "sleep_requests": 1,
}

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

実行後、保存先フォルダに .wav ファイルが作成されます。このファイルをWhisperに渡すことで文字起こしできます。

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

動画と日本語字幕を保存する

MP4動画と日本語字幕をまとめて保存する例です。

from pathlib import Path
import yt_dlp

VIDEO_ID = "VIDEO_ID"
url = f"https://www.youtube.com/watch?v={VIDEO_ID}"

output_dir = Path("D:/youtube_downloads")
output_dir.mkdir(parents=True, exist_ok=True)

ydl_opts = {
    "format": "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]/b",
    "merge_output_format": "mp4",
    "outtmpl": str(output_dir / "%(title)s.%(ext)s"),
    "writesubtitles": True,
    "writeautomaticsub": True,
    "subtitleslangs": ["ja"],
    "subtitlesformat": "vtt",
    "retries": 5,
    "extractor_retries": 5,
    "sleep_requests": 1,
}

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

字幕が存在する場合は、動画ファイルとあわせて .vtt ファイルが保存されます。

複数動画の音声をまとめて保存する

複数の動画IDをリストで指定し、音声をまとめて保存する例です。分析用の音声データをまとめて準備したい場合に便利です。

from pathlib import Path
import yt_dlp
import time

video_ids = [
    "VIDEO_ID_1",
    "VIDEO_ID_2",
    "VIDEO_ID_3",
]

output_dir = Path("D:/youtube_downloads/audio")
output_dir.mkdir(parents=True, exist_ok=True)

ydl_opts = {
    "format": "bestaudio/best",
    "outtmpl": str(output_dir / "%(upload_date)s_%(id)s_%(title)s.%(ext)s"),
    "postprocessors": [{
        "key": "FFmpegExtractAudio",
        "preferredcodec": "wav",
        "preferredquality": "192",
    }],
    "retries": 5,
    "extractor_retries": 5,
    "sleep_requests": 1,
}

for video_id in video_ids:
    url = f"https://www.youtube.com/watch?v={video_id}"
    print(f"download: {url}")

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

    time.sleep(2)

複数動画を扱う場合は、短時間で大量にアクセスしないように、取得件数や実行間隔に注意してください。

出力例と確認方法

正常に実行できると、保存先フォルダに以下のようなファイルが作成されます。

  • 動画タイトル.mp4
  • 動画タイトル.wav
  • 動画タイトル.ja.vtt
  • 20250101_VIDEO_ID_動画タイトル.wav

まずは短い動画や、自分が権利を持つテスト動画で動作確認するのがおすすめです。音声ファイルが作成されていれば、Whisperによる文字起こしや音声分析の前処理に使えます。

つまずきやすいポイント

  • ffmpegが見つからない
    音声変換や動画結合にはffmpegが必要です。ffmpeg -version で確認し、認識されない場合はPATH設定を見直してください。
  • 字幕ファイルが保存されない
    対象動画に日本語字幕が存在しない場合、字幕ファイルは保存されません。自動生成字幕も必ず存在するとは限りません。
  • 保存先フォルダがわからなくなる
    -oouttmpl で指定した保存先を確認してください。Pythonでは Path を使って保存先フォルダを明示すると管理しやすくなります。
  • 動画と音声が別々に保存される
    高画質の動画では、映像と音声が別々に取得されることがあります。MP4として結合したい場合は、ffmpegが使える状態になっているか確認してください。
  • 短時間に大量取得しない
    連続取得はアクセス制限や一時的な失敗の原因になります。複数動画を扱う場合は、取得件数や実行間隔を調整してください。

次に読む記事

まとめ

この記事では、yt-dlpを使ってYouTubeの動画・音声・字幕を保存する方法を紹介しました。CLIで手早く実行する方法に加えて、Pythonから呼び出して複数動画を処理する例も扱いました。

取得した音声や字幕は、Whisperによる文字起こし、字幕テキストの分析、配信アーカイブの要約などに活用できます。利用時は、各サービスの利用規約や著作権に配慮し、権利上問題のない範囲で技術検証・分析に活用してください。

-YouTube, データ活用