YouTube データ活用

WhisperでYouTube音声を文字起こしして要約する方法|Pythonサンプル付き

2025年9月29日

この記事では、OpenAIが公開している音声認識モデル Whisper を使って、YouTube音声を文字起こしし、必要に応じて要約する方法をPythonで解説します。

最終的には、音声ファイルから日本語テキストを生成し、文字起こし結果をテキストファイルとして保存し、長い文章を要約できる状態を目指します。YouTube配信アーカイブ、講義動画、勉強会動画、インタビュー音声などを整理する前処理として活用できます。

この記事でできること

  • WhisperをPython環境にインストールする
  • 音声ファイルや動画ファイルを文字起こしする
  • 日本語音声として認識させる設定を行う
  • 文字起こし結果をテキストファイルに保存する
  • 長い文字起こし結果を分割して扱いやすくする
  • OpenAI APIを使って文字起こし結果を要約する
  • ffmpegやyt-dlpと組み合わせた前処理の流れを理解する

想定読者

  • 音声ファイルや動画ファイルをPythonで文字起こししたい方
  • YouTube配信アーカイブや講義動画の内容をテキスト化したい方
  • Whisperを使った文字起こしの最小コードと実用コードを知りたい方
  • 文字起こし結果を要約やテキスト分析に活用したい方

利用上の注意

Whisperは音声認識に便利なツールですが、動画や音声の内容を扱うため、利用時には権利やプライバシーへの配慮が必要です。

  • 本記事は、自身が権利を持つ音声、利用許可を得た音声、または規約・著作権法上問題のない範囲での技術検証を目的としています。
  • 第三者の動画・音声・文字起こし結果を無断で再配布、転載する行為を推奨するものではありません。
  • YouTubeなど外部サービスのコンテンツを扱う場合は、各サービスの利用規約や著作権を確認してください。
  • 会話や配信ログを扱う場合は、個人情報や誹謗中傷、プライバシーに関わる内容の扱いに注意してください。

使用するもの

  • Python 3.10以降
  • openai-whisper
  • ffmpeg
  • 必要に応じてOpenAI API

Whisperで音声や動画を読み込む場合、内部的にffmpegが使われることがあります。先にffmpegを使える状態にしておくとスムーズです。

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

YouTube動画から音声ファイルを作成する場合は、以下の記事も参考になります。

yt-dlpでYouTube音声・字幕を取得する方法

Whisperのインストール

まずは、Whisperをインストールします。

pip install -U openai-whisper

インストール後、Pythonから import whisper できれば準備完了です。

python -c "import whisper; print('whisper import ok')"

GPUが使える環境では処理が速くなりますが、CPUでも動作します。CPU環境では、まず basesmall など軽めのモデルから試すのがおすすめです。

Whisperモデルの選び方

Whisperには複数のモデルサイズがあります。一般的には、モデルが大きいほど精度は上がりやすい一方で、処理時間やメモリ使用量も増えます。

モデル特徴使いどころ
tiny軽いが精度は控えめ動作確認、短い音声のテスト
base軽量で扱いやすいCPU環境での最初の検証
small精度と速度のバランスがよい日本語音声の実用的な文字起こし
medium精度重視時間に余裕がある場合
large高精度だが重いGPU環境や精度重視の処理

この記事では、処理時間と精度のバランスを考えて small を使います。

最小コード:音声ファイルを文字起こしする

まずは、音声ファイルを読み込んで文字起こしする最小コードです。

import whisper

model = whisper.load_model("small")

audio_path = r"D:\youtube_downloads\sample.wav"

result = model.transcribe(audio_path, language="ja")

print(result["text"][:500])

language="ja" を指定すると、日本語音声として認識されやすくなります。日本語の動画や配信アーカイブを扱う場合は、基本的に指定しておくのがおすすめです。

動画ファイルを直接文字起こしする

Whisperは、音声ファイルだけでなく動画ファイルも読み込めます。ffmpegが使える状態であれば、MP4などの動画ファイルを指定して文字起こしできます。

import whisper

model = whisper.load_model("small")

video_path = r"D:\youtube_downloads\sample.mp4"

result = model.transcribe(video_path, language="ja")

print(result["text"][:500])

ただし、動画ファイルを直接扱うよりも、あらかじめ音声ファイルとして保存しておいた方が管理しやすく、処理も軽くなる場合があります。

実用コード:文字起こし結果をテキスト保存する

実際の分析では、文字起こし結果をその場で表示するだけでなく、テキストファイルとして保存しておくと便利です。

from pathlib import Path
import whisper

model_name = "small"
audio_path = Path(r"D:\youtube_downloads\sample.wav")
output_dir = Path(r"D:\youtube_downloads\transcripts")
output_dir.mkdir(parents=True, exist_ok=True)

model = whisper.load_model(model_name)

result = model.transcribe(str(audio_path), language="ja")

text = result["text"].strip()

output_path = output_dir / f"{audio_path.stem}_transcript.txt"
output_path.write_text(text, encoding="utf-8")

print(f"saved: {output_path}")
print(text[:500])

実行すると、D:\youtube_downloads\transcripts フォルダに文字起こし結果のテキストファイルが保存されます。

セグメント情報も保存する

Whisperの結果には、全文だけでなく、時間情報付きのセグメントも含まれます。配信や動画のどの時間帯で何を話していたかを確認したい場合に便利です。

from pathlib import Path
import json
import whisper

model = whisper.load_model("small")

audio_path = Path(r"D:\youtube_downloads\sample.wav")
output_dir = Path(r"D:\youtube_downloads\transcripts")
output_dir.mkdir(parents=True, exist_ok=True)

result = model.transcribe(str(audio_path), language="ja")

segments = result.get("segments", [])

json_path = output_dir / f"{audio_path.stem}_segments.json"
json_path.write_text(
    json.dumps(segments, ensure_ascii=False, indent=2),
    encoding="utf-8"
)

print(f"saved: {json_path}")
print(segments[:2])

セグメントには、開始時刻、終了時刻、該当部分の文字起こしテキストなどが含まれます。あとから字幕作成や発話区間ごとの分析に使いやすくなります。

長い文字起こし結果を分割する

配信アーカイブや長時間の音声を文字起こしすると、テキストが非常に長くなります。要約やテキスト分析に回す前に、一定の文字数で分割しておくと扱いやすくなります。

def split_text(text: str, max_chars: int = 3000) -> list[str]:
    chunks = []
    start = 0

    while start < len(text):
        end = start + max_chars
        chunks.append(text[start:end])
        start = end

    return chunks


text = result["text"].strip()
chunks = split_text(text, max_chars=3000)

print(f"chunks: {len(chunks)}")
print(chunks[0][:500])

ここでは単純に文字数で分割しています。より丁寧に処理する場合は、句点や改行で区切る方法もあります。

OpenAI APIで要約する例

Whisperの出力は長文になりやすいため、要約処理と組み合わせると内容を把握しやすくなります。ここでは、OpenAI APIを使って文字起こし結果を要約する例を紹介します。

事前に環境変数 OPENAI_API_KEY を設定しておいてください。

pip install -U openai

以下は、文字起こしテキストを要約するシンプルな例です。

from openai import OpenAI

client = OpenAI()

transcribed_text = result["text"].strip()

response = client.responses.create(
    model="gpt-4o-mini",
    input=[
        {
            "role": "system",
            "content": "あなたは日本語の文字起こしを読みやすく要約するアシスタントです。"
        },
        {
            "role": "user",
            "content": f"以下の文字起こしを、重要な話題がわかるように5項目以内で要約してください。\n\n{transcribed_text}"
        }
    ],
)

print(response.output_text)

長時間の文字起こしをそのまま要約に渡すと長すぎる場合があります。その場合は、先ほどのようにテキストを分割し、分割ごとに要約してから、最後に全体要約を作る流れにすると扱いやすくなります。

分割した文字起こしを順番に要約する例

長い文字起こし結果を分割し、それぞれを順番に要約する例です。

from pathlib import Path
from openai import OpenAI

client = OpenAI()

summary_dir = Path(r"D:\youtube_downloads\summaries")
summary_dir.mkdir(parents=True, exist_ok=True)

summaries = []

for i, chunk in enumerate(chunks, start=1):
    response = client.responses.create(
        model="gpt-4o-mini",
        input=[
            {
                "role": "system",
                "content": "あなたは日本語の文字起こしを簡潔に要約するアシスタントです。"
            },
            {
                "role": "user",
                "content": f"以下は文字起こしの一部です。重要な話題を3項目以内で要約してください。\n\n{chunk}"
            }
        ],
    )

    summary = response.output_text
    summaries.append(summary)

    print(f"chunk {i} summary:")
    print(summary)

summary_text = "\n\n".join(summaries)

summary_path = summary_dir / "summary_parts.txt"
summary_path.write_text(summary_text, encoding="utf-8")

print(f"saved: {summary_path}")

必要に応じて、分割ごとの要約をさらにまとめることで、長時間配信や講義動画の全体要約を作成できます。

出力例

文字起こしを実行すると、以下のようなテキストが得られます。

=== Transcribed Text ===
今日は、YouTubeの配信アーカイブを文字起こしして、
あとから検索しやすい形に整理する方法を紹介します。
まずは音声ファイルを用意し、Whisperでテキスト化します。
...

要約を実行すると、以下のように内容の要点を短く整理できます。

=== Summary ===
- YouTube配信アーカイブを文字起こしして整理する方法を紹介
- yt-dlpで音声ファイルを用意し、Whisperでテキスト化
- 長い文字起こしは分割してから要約すると扱いやすい

つまずきやすいポイント

ffmpegが見つからない

Whisperの実行時にffmpegが見つからない場合は、ffmpegがPATHに設定されていない可能性があります。

以下のコマンドで確認してください。

ffmpeg -version

認識されない場合は、以下の記事を確認してください。

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

日本語がうまく認識されない

日本語音声を扱う場合は、language="ja" を指定すると安定しやすくなります。

result = model.transcribe(str(audio_path), language="ja")

処理に時間がかかる

CPU環境では、長い音声や大きいモデルを使うと処理に時間がかかります。まずは basesmall を使い、必要に応じてモデルサイズを調整してください。

OpenAI APIの要約でテキストが長すぎる

長時間の文字起こしをそのまま要約に渡すと、入力が長くなりすぎる場合があります。文字数や話題単位で分割し、分割ごとに要約してから全体をまとめる流れにすると扱いやすくなります。

次に読む記事

まとめ

この記事では、Whisperを使って音声ファイルや動画ファイルを文字起こしし、必要に応じて要約する方法を紹介しました。

文字起こし結果をテキストファイルやセグメント情報として保存しておくと、あとから検索、要約、字幕作成、テキスト分析に活用しやすくなります。長時間の音声を扱う場合は、音声ファイルの準備、分割、要約の流れを整理しておくと、配信アーカイブや講義動画の分析にも応用できます。

-YouTube, データ活用