YouTubeデータ取得 データ取得

yt-dlpで許諾済み動画の音声・字幕を分析用に取得する方法|Whisper文字起こし前処理

2025年10月4日

yt-dlpは、動画ページのメタ情報、字幕、音声などを取得できるコマンドラインツールです。

このページでは、YouTubeなどの動画を対象に、自分が権利を持つ動画、または利用許諾を得た素材を、文字起こしや字幕分析の前処理に使う方法を整理します。動画を集めること自体が目的ではなく、Whisperで文字起こししたり、字幕やチャットなどの公開データと組み合わせて分析したりするための準備として扱います。

この記事で扱う範囲

この記事では、次のような作業を扱います。

  • yt-dlpで動画のメタ情報だけ確認する
  • 許諾済み動画から音声ファイルを作り、Whisperの入力にする
  • 字幕ファイルを取得し、テキスト分析の前処理に使う
  • Pythonからyt-dlpを呼び出し、分析用のファイルを整理する
  • つまずきやすいエラーと確認方法を整理する

動画や音声の再配布、権利者の許可がない素材の保存、利用規約に反する使い方をすすめるものではありません。YouTube Data APIで取得できる情報だけで足りる場合は、まず公式APIを使う方が扱いやすいです。

利用前に確認したいこと

yt-dlpは便利ですが、使い方によっては権利や利用規約に関わります。分析用途であっても、次の点は先に確認しておきます。

  • 対象が自分の動画、または利用許諾を得た動画か
  • 対象サービスの利用規約で許される範囲か
  • 取得した字幕や音声を公開・再配布しない運用になっているか
  • 公開記事では、字幕本文や発話内容を長文転載しない方針にしているか
  • 個人情報、限定公開情報、権利者が意図しない利用につながらないか

このサイトでは、取得した素材そのものを見せるのではなく、文字起こし後の件数集計、語句の傾向、要約、時系列変化など、分析結果として扱うことを前提にしています。

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

YouTube関連のデータ取得では、まず公式のYouTube Data APIで足りるかを確認します。公式APIで取れる情報と、yt-dlpで扱いやすい情報は少し違います。

やりたいこと向いている方法補足
チャンネルの動画一覧を取得するYouTube Data API公式APIで扱いやすい範囲です
タイトル、公開日、再生数などを取得するYouTube Data APIAPIキーとquotaの管理が必要です
字幕ファイルを分析前処理に使う字幕APIまたはyt-dlp取得可否や言語の違いに注意します
許諾済み動画の音声をWhisperに渡すyt-dlp + ffmpeg権利・規約の確認が前提です
音声をWAVに変換するffmpegyt-dlpとは別に環境構築が必要です

公式APIで足りる処理は、公式APIを使う方が後から管理しやすいです。yt-dlpは、文字起こし前処理や字幕ファイルの確認など、分析用の入力データを整える場面で使います。

事前準備

ここでは、Python環境がある前提で進めます。まずyt-dlpをインストールします。

YouTube対応には外部JavaScript実行環境とEJSが必要です。yt-dlp公式EJS手順に従い、Deno(2.3.0以上)を公式配布元から導入してPATHへ追加します。Denoは既定で有効です。Python版は次のdefault依存グループでEJSも導入します。公式実行ファイル版にはEJSが同梱されますが、外部JavaScript実行環境と音声変換用FFmpegは別途必要です。

python -m pip install -U "yt-dlp[default]"

deno --versionffmpeg -versionyt-dlp --version で各コマンドを確認します。許可された動画で yt-dlp --verbose --simulate "動画URL" を実行すると依存認識を確認できます。導入確認だけでは実際の動画取得成功を保証しません。ログ共有時は認証情報を除いてください。

音声変換を行う場合は、ffmpegも必要です。WindowsでのインストールとPATH設定は、次の記事で整理しています。

ffmpegのインストールとPATH設定(Windows)|音声・動画データ分析の前処理環境を整える

まず動画情報だけ確認する

最初から音声や字幕を保存するのではなく、まず対象URLから取得できるメタ情報だけ確認します。

yt-dlp --skip-download --print "%(title)s | %(duration_string)s | %(uploader)s" "動画URL"

--skip-download を付けると、動画本体を取得せずに情報だけ確認できます。分析対象の確認や、URLリストの整理ではこの使い方から始めると安全です。

許諾済み動画の音声をWhisper用にWAV保存する

Whisperで文字起こしする場合は、音声をWAVやMP3などのファイルにしておくと扱いやすいです。ここでは、分析対象として利用できることを確認済みの動画だけを対象にします。

yt-dlp -x --audio-format wav -o "audio/%(id)s.%(ext)s" "動画URL"

-x は音声抽出、--audio-format wav はWAV形式への変換、-o は保存先とファイル名の指定です。複数ファイルを扱う場合は、動画IDをファイル名に入れておくと後から対応関係を確認しやすくなります。

文字起こしの流れは、次の記事でも整理しています。

Whisperで許諾済み音声を文字起こしして要約する方法|Pythonで分析前処理を整える

日本語音声を一覧から選ぶ

# PowerShell:許可された動画URLを入力
$videoUrl = Read-Host "利用許諾を確認した動画URL"
python -m yt_dlp --no-playlist -F "$videoUrl"
python -m yt_dlp --no-playlist --skip-download --print "%(formats.:.{format_id,language,format_note,acodec,vcodec})j" "$videoUrl"

一覧の音声コーデック、言語(ja等)、トラックの説明を照合します。言語が日本語でも原音・吹替・音声解説が別にある場合は、目的のトラックを選んでください。--sub-langs は字幕の言語であり、音声を日本語に変換する指定ではありません。

$audioId = Read-Host "この動画の一覧で日本語と確認した音声形式ID"
python -m yt_dlp --no-playlist -f "$audioId" -x --audio-format wav -o "audio-ja/%(id)s.%(ext)s" "$videoUrl"
Get-ChildItem .\audio-ja -File | Select-Object FullName,Length,Extension

形式IDは動画ごとに確認し、別動画へ流用しません。日本語音声がなければこの手順は実行せず、取得不可と記録します。言語情報が不明なら、元ページの音声トラック表示と実際の再生音を確認してください。それでも特定できなければ日本語取得成功とは扱いません。保存したWAVを短く再生して内容と言語を確認します。WAVでは言語タグが残らない場合があり、ファイル生成やタグだけでは日本語を話している証明にはなりません。

字幕ファイルを分析用に取得する

動画に字幕がある場合は、音声から文字起こしする前に字幕を確認するとよいです。字幕は、話題の抽出や要約、時系列での発話分析に使えます。

yt-dlp --skip-download --write-subs --write-auto-subs --sub-langs "ja,en" -o "subs/%(id)s.%(ext)s" "動画URL"

自動字幕は誤認識を含むことがあります。分析に使う場合は、字幕の種類、言語、取得日をメモしておくと、結果の読み取りで迷いにくくなります。

字幕取得だけを確認したい場合は、次の記事も参考になります。

youtube-transcript-apiで許諾済み動画の字幕を取得する方法|Pythonで分析前処理を整える

字幕一覧・言語・VTT/SRTを確認する

# 以下は先に設定した $videoUrl を使います
python -m yt_dlp --no-playlist --list-subs "$videoUrl"

一覧で手動字幕と自動生成字幕の見出し、言語コード、提供形式を確認します。翻訳字幕は原字幕を翻訳したもので、元の日本語発話から作られた字幕とは限りません。自動字幕欄に翻訳候補が含まれることもあります。言語コードだけで原語を断定せず、元動画の字幕メニュー・原音と照合してください。

$subtitleLang = Read-Host "一覧で確認した字幕言語コード(例: ja)"
# 手動字幕をVTTで別保存
python -m yt_dlp --no-playlist --skip-download --write-subs --no-write-auto-subs --sub-langs "$subtitleLang" --sub-format vtt -o "subs-vtt/%(id)s.%(ext)s" "$videoUrl"
# 手動字幕をSRTへ変換して別保存(上のコマンドとは代替)
python -m yt_dlp --no-playlist --skip-download --write-subs --no-write-auto-subs --sub-langs "$subtitleLang" --sub-format "vtt/best" --convert-subs srt -o "subs-srt/%(id)s.%(ext)s" "$videoUrl"
Get-ChildItem .\subs-vtt,.\subs-srt -File -ErrorAction SilentlyContinue | Select-Object FullName,Length,Extension

VTT例はその形式が提供される場合に使います。通常は subs-vtt/動画ID.言語.vtt、変換例は subs-srt/動画ID.言語.srt です。実際のログと拡張子を確認してください。SRT変換にはFFmpegが必要です。自動生成字幕を選ぶ場合だけ、該当コマンドの --write-subs --no-write-auto-subs--no-write-subs --write-auto-subs へ変更します。字幕なし・言語なしでは動画情報の処理だけ成功することもあるため、今回のログ・ファイル更新時刻・本文が空でないことを確認します。古い出力と混同しないよう別フォルダーを使ってください。

動画へ字幕トラックを埋め込む

# 動画と音声を取得する独立した例。--skip-download は付けません
$videoId = Read-Host "-Fで確認した映像形式ID"
$audioId = Read-Host "-Fで確認した目的の音声形式ID"
python -m yt_dlp --no-playlist -f "$videoId+$audioId" --merge-output-format mkv --remux-video mkv --write-subs --no-write-auto-subs --sub-langs "$subtitleLang" --sub-format "vtt/best" --embed-subs -o "review-video/%(id)s.%(ext)s" "$videoUrl"
$outputFile = Read-Host "実際に生成されたMKVのパス"
ffprobe -v error -select_streams s -show_entries stream=index,codec_name:stream_tags=language,title -of json "$outputFile"

これは原音・映像と字幕を照合するための補足です。字幕トラックの埋め込みは、再生時に表示を切り替えられる字幕であり、映像への焼き込みではありません。焼き込みは扱いません。--write-subs と併用するため別字幕ファイルも残ります。字幕のみ取得する上の例に埋め込み指定を足すだけでは動画は作られません。

yt-dlpの埋め込み対応はMP4・WebM・MKVですが、字幕コーデックとの組合せに制限があります。この例はMKVを使用し、FFmpegとffprobeを必要とします。ffprobeの streams が空なら字幕埋め込み成功とは扱いません。字幕ストリームの存在・言語と、字幕対応プレーヤーで表示を切り替えられること、原音に対する時刻ずれを確認してください。自動字幕を使う場合は前節と同様に字幕種別のオプションを切り替えます。

Pythonからyt-dlpを使う

URLを複数扱う場合や、取得結果をCSVにまとめたい場合は、Pythonからyt-dlpを呼び出すと管理しやすくなります。

from yt_dlp import YoutubeDL

url = "動画URL"

options = {
    "skip_download": True,
    "quiet": True,
}

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

print(info.get("id"))
print(info.get("title"))
print(info.get("duration"))

まずは download=False でメタ情報だけ確認します。対象URL、タイトル、動画ID、長さなどを表にしておくと、後で字幕や音声ファイルと紐づけやすくなります。

複数URLを扱うときの考え方

複数の動画を扱う場合は、最初にURLリストを作り、取得済みかどうかを管理します。

  • 対象URL
  • 動画ID
  • タイトル
  • 取得したファイル名
  • 取得日
  • 利用許諾や権利確認のメモ

このような管理表を作ると、どの音声ファイルがどの動画に対応しているか、あとから確認しやすくなります。公開記事で使う場合も、元データの条件を説明しやすくなります。

出力ファイルを確認する

取得後は、ファイルが作成されたことだけでなく、分析に使える形式になっているかを確認します。

  • 音声ファイルが想定フォルダに保存されているか
  • ファイル名に動画IDなどの識別子が入っているか
  • Whisperで読み込める形式か
  • 字幕ファイルの言語が想定通りか
  • 空ファイルや極端に短いファイルが混ざっていないか

この確認を飛ばすと、文字起こしやテキスト分析の段階で原因が分かりにくくなります。とくに複数動画を扱う場合は、前処理の段階で小さく確認する方が楽です。

つまずきやすいポイント

症状確認すること
ffmpegが見つからないWindowsでffmpegをインストールし、PATHを設定する手順を確認する
字幕が取得できない対象動画に字幕があるか、言語指定が合っているか確認する
一部URLだけ失敗する動画の公開状態、年齢制限、地域制限、ログイン要否を確認する
ファイル名が分かりにくい-o で動画IDや日付を含む命名にする
分析結果がずれる取得日、字幕種類、自動字幕かどうかを記録する

yt-dlpや対象サービス側の仕様は変わることがあります。手元で動いたコードでも、時間が経つとオプションや取得結果が変わる場合があります。

次に読む記事

追加例の確認環境:Python 3.12、yt-dlp 2026.8.19、youtube-transcript-api 1.2.4、openai-whisper 20250625、FFmpeg 8.0。自作文章の日本語合成音声と字幕をローカルHTTPで配信し、実yt-dlpによる形式選択・WAV・VTT/SRT保存と、FFmpegによるMKV字幕トラック(ffprobeでjpn)を確認しました。YouTubeからの実取得・日本語トラック提供状況は未検証です。ローカル素材の成功をYouTube取得の成功とは扱いません。

まとめ

yt-dlpは、許諾済み動画の音声や字幕を分析用に整えるときに便利なツールです。Whisperの文字起こし、字幕のテキスト分析、動画IDと取得ファイルの管理など、前処理の段階で役立ちます。

一方で、対象素材の権利や利用規約を確認せずに使うと問題につながります。この記事では、保存そのものではなく、分析前処理としての使い方に絞って整理しました。公式APIで足りる情報はYouTube Data APIを使い、音声や字幕が必要な場合だけ、用途と範囲を決めて扱うのがよいと思います。

-YouTubeデータ取得, データ取得