この記事では、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は、音声変換や動画と音声の結合、時間指定での切り出しなどに使います。未設定の場合は、先に以下の記事を確認してください。
yt-dlpとyoutube-dlの違い
yt-dlpは、youtube-dlをベースに開発されている派生ツールです。現在はyt-dlpの方が更新頻度が高く、YouTube側の仕様変更にも比較的追従しやすいため、これから使う場合はyt-dlpを選ぶのが無難です。
| 項目 | yt-dlp | youtube-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 -versionCLIで使う方法
まずは、コマンドラインから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に渡すことで文字起こしできます。
動画と日本語字幕を保存する
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.vtt20250101_VIDEO_ID_動画タイトル.wav
まずは短い動画や、自分が権利を持つテスト動画で動作確認するのがおすすめです。音声ファイルが作成されていれば、Whisperによる文字起こしや音声分析の前処理に使えます。
つまずきやすいポイント
- ffmpegが見つからない
音声変換や動画結合にはffmpegが必要です。ffmpeg -versionで確認し、認識されない場合はPATH設定を見直してください。 - 字幕ファイルが保存されない
対象動画に日本語字幕が存在しない場合、字幕ファイルは保存されません。自動生成字幕も必ず存在するとは限りません。 - 保存先フォルダがわからなくなる
-oやouttmplで指定した保存先を確認してください。PythonではPathを使って保存先フォルダを明示すると管理しやすくなります。 - 動画と音声が別々に保存される
高画質の動画では、映像と音声が別々に取得されることがあります。MP4として結合したい場合は、ffmpegが使える状態になっているか確認してください。 - 短時間に大量取得しない
連続取得はアクセス制限や一時的な失敗の原因になります。複数動画を扱う場合は、取得件数や実行間隔を調整してください。
次に読む記事
- ffmpegのインストールとPATH設定(Windows)
- Whisperで文字起こしして要約する方法
- youtube-transcript-apiで字幕を取得する方法
- YouTubeの情報を取得する方法まとめ
まとめ
この記事では、yt-dlpを使ってYouTubeの動画・音声・字幕を保存する方法を紹介しました。CLIで手早く実行する方法に加えて、Pythonから呼び出して複数動画を処理する例も扱いました。
取得した音声や字幕は、Whisperによる文字起こし、字幕テキストの分析、配信アーカイブの要約などに活用できます。利用時は、各サービスの利用規約や著作権に配慮し、権利上問題のない範囲で技術検証・分析に活用してください。