2時間の技術基調講演に埋もれていませんか?
誰もが経験することです。AWS re:Inventの90分の深掘りセッションや、面白そうなGopherConのトークを見つけたとします。45分あたりに隠れている特定のアーキテクチャ設計の決定事項だけを知りたいのに、無駄な話を延々と聞く時間はありません。タイムラインを手動でシークするのは、フラストレーションの元です。
私はこの問題を解決するために、カスタムの自動化パイプラインを構築しました。メディア処理、ローカルでの音声文字起こし、そして的を絞ったプロンプトエンジニアリングを組み合わせることで、膨大な動画を30秒で読める内容に変換できます。これは単なる時短ではありません。動画形式の中に閉じ込められていた音声から、検索可能なナレッジベースを構築することなのです。
5分で完了するセットアップ
これを動かすのに巨大なサーバーは必要ありません。音声抽出の重い処理を行うための ffmpeg さえインストールされていれば、標準的なノートPCで十分です。
1. システム依存関係のインストール
macOSを使用している場合は、Homebrewで簡単にインストールできます:
brew install ffmpeg
UbuntuまたはDebianユーザーの場合:
sudo apt update && sudo apt install ffmpeg
2. Python環境の準備
仮想環境を使用して、グローバルな環境をクリーンに保ちます。YouTubeストリームを処理するために yt-dlp、文字起こしのために openai-whisper、そして最終的な要約のために openai SDKが必要です。
python -m venv venv
source venv/bin/activate
pip install yt-dlp openai-whisper openai
3. コアスクリプト
以下の内容を summarize.py として保存してください。このスクリプトは音声をダウンロードし、ローカルのCPUまたはGPUでWhisperモデルを実行し、LLMにハイライトを問い合わせます。
import yt_dlp
import whisper
import os
from openai import OpenAI
# クイック設定
VIDEO_URL = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
client = OpenAI(api_key="ここにAPIキーを入力")
def download_audio(url):
opts = {
'format': 'm4a/bestaudio/best',
'postprocessors': [{'key': 'FFmpegExtractAudio', 'preferredcodec': 'm4a'}],
'outtmpl': 'temp_audio.%(ext)s',
}
with yt_dlp.YoutubeDL(opts) as ydl:
ydl.download([url])
return "temp_audio.m4a"
def transcribe(path):
# 'base'モデルは約140MBで、ほとんどのCPUで高速に動作します
model = whisper.load_model("base")
return model.transcribe(path)["text"]
def summarize(text):
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "あなたは技術エディターです。主要なアーキテクチャ上の決定事項やCLIコマンドを抽出し、箇条書きでまとめてください。"},
{"role": "user", "content": text}
]
)
return response.choices[0].message.content
# パイプラインの実行
print("ステップ 1: 音声を抽出中...")
audio_path = download_audio(VIDEO_URL)
print("ステップ 2: 文字起こし中 (ローカルのWhisper)... ")
raw_text = transcribe(audio_path)
print("ステップ 3: 要約を生成中...")
print("\n--- 結果 ---\n", summarize(raw_text))
なぜこのスタックが有効なのか
このパイプラインの各コンポーネントは、コストとパフォーマンスのバランスを取りながら、特定の目的を果たしています。
yt-dlpによる効率的な抽出
スピーカーの話を聞くためだけに4K動画をダウンロードするのは帯域幅の無駄です。 m4a 音声ストリームをターゲットにすることで、ダウンロードサイズを500MBから15MB程度に削減できます。 yt-dlp は、YouTubeの頻繁な仕様変更を pytube のような古いライブラリよりもはるかに適切に処理できるため、ここでは不可欠です。
Whisperによるローカル文字起こし
Whisperは完全に自分のハードウェア上で動作します。つまり、データはプライベートに保たれ、分単位の文字起こし料金を支払う必要もありません。 base モデルは非常に高速ですが、強い訛りがある場合は苦戦することがあります。Kubernetesネットワーキングに関する複雑なトークを文字起こしする場合は、 small または medium モデルへのアップグレードを試してみてください。これらはより多くのRAM(約2GB〜5GB)を必要としますが、技術用語に対する精度が大幅に向上します。
ロジック層:GPT-4o-mini
生の文字起こしデータは乱雑です。「えーと」や「あのー」といった言葉や、メッセージを濁らせる繰り返しのフレーズで溢れています。 gpt-4o-mini を使用するのは賢明な選択です。フル版のGPT-4oモデルよりも約20倍安価でありながら、文字起こしをクリーンな箇書きに抽出する能力は十分に備わっているからです。
よくある障害の克服
長い動画を処理し始めると、いくつかの予想可能な壁に突き当たります。スクリプトをスケールさせる方法は以下の通りです。
大きなコンテキストの管理
最近のLLMは巨大なコンテキストウィンドウを持っていますが、3時間の文字起こしは依然として圧倒的な量になることがあります。これを処理する簡単な方法は、テキストを5,000語ずつのチャンクに分割することです。各チャンクを個別に処理し、最後にLLMにそれらをまとめた「要約の要約」を作成させるよう依頼します。
Ollamaによる100%ローカル化
機密性の高い社内会議を要約する場合、OpenAIにデータを送信したくないかもしれません。その場合は、OpenAIの呼び出しを、Ollamaを介して実行されるLlama 3のようなローカルLLMに置き換えることができます。無料でプライベート、そして驚くほど高性能です。
import requests
def summarize_locally(text):
payload = {
"model": "llama3",
"prompt": f"以下の技術的な文字起こしを要約してください: {text}",
"stream": False
}
r = requests.post("http://localhost:11434/api/generate", json=payload)
return r.json()["response"]
本番環境で利用するための最終的なヒント
何百時間もの動画を処理した結果、スクリプトの信頼性を大幅に高めるいくつかの最適化手法を見つけました。
- GPUアクセラレーション: NVIDIAのカードをお持ちの場合は、WhisperがCUDAを使用していることを確認してください。CPUで10分かかる文字起こしが、GPUなら45秒で完了します。
- クリーンアップ: 一時的な
.m4aファイルを削除するために、常にtry...finallyブロックを使用してください。そうしないと、ストレージがすぐに一杯になってしまいます。 - 具体的なプロンプティング: 単に要約を依頼するのではなく、AIに「シニアエンジニアとして振る舞ってください」と伝え、特にコードスニペットやライブラリ名を探すように指定してください。
このパイプラインは情報の消費方法を一変させます。増え続ける「後で見る」動画リストの代わりに、コーヒーを飲んでいる間にプレゼンテーションの核心的価値を教えてくれるツールが手に入ります。

