Youtubeの料理動画からChatGPTでレシピを要約
背景
私は自炊をする際にyoutubeの料理動画を参考にし、気に入ったレシピをmarkdownで書き起こして自分好みのレシピ集として蓄積しています。
動画ごとに以下を調整しながらレシピをまとめるのがいつも手間だなーと思っていたので自動化してみました。
- 材料一覧と簡単な手順が概要欄に書いてあるパターン
- 材料のみが概要欄に書かれていて、工程は動画を確認しながら簡潔な文章に書き起こす必要があるパターン
- (当然ですが)Youtuberさん毎に工程の詳しさや材料の書き方がばらつく
動作環境
- Windows + WSL2(Ubuntu24.04)
- Python 3.12.3
- LangChain 0.3.14
方法
1. Youtube動画からレシピ動画の字幕と概要欄を取得
LangChainのYoutubeLoader[1]を利用しました。
事前準備として、必要なライブラリをインストールします。
pip install --upgrade --quiet youtube-transcript-api pytube
公式ドキュメントを参考に、Youtube動画から字幕を取得するコードを記述します。
from langchain_community.document_loaders import YoutubeLoader
video_url='要約したいYoutube動画のURL'
loader = YoutubeLoader.from_youtube_url(
video_url,
add_video_info=False,
language=["ja"],
)
# Document Loaderで読み込み、字幕情報のみを取得
scripts = loader.load()[0].page_content
scripts
add_video_info
をTrue
にしたら概要欄などの情報がとれるのかな?と試してみましたが、私の環境ではエラーとなってしまいました...。
概要欄は別方法で取得します。
同じくLangChainに用意されているYoutubeLoaderDL[2]というライブラリを使用します。
事前準備として、追加で必要なライブラリをインストールします。
pip install langchain-yt-dlp
概要欄を取得するスクリプトは以下のように記述します。
from langchain_yt_dlp.youtube_loader import YoutubeLoaderDL
# Basic transcript loading
loader = YoutubeLoaderDL.from_youtube_url(
video_url, add_video_info=True
)
documents = loader.load()
metadata = documents[0].metadata # 読み込んだドキュメントからメタデータを取得
metadata
いい感じに取得できました!
取得したYoutubeの情報をプロンプトへ埋め込みます。
2. レシピを要約し、markdown化するプロンプトの作成
動画の概要欄の説明文と字幕情報を埋め込み可能なプロンプトテンプレートを用意します。
from langchain_core.prompts import PromptTemplate
template = """
以下はYoutubeのレシピ動画をDocument Loaderで読み込んだテキスト情報です。
レシピの工程を簡潔にmarkdown形式で書き起こしてください。
材料と分量は省略しないこと。
回答は必ず日本語で生成してください。
動画の概要欄の説明文:{description}
動画のスクリプト: {script}
回答:"""
prompt = PromptTemplate.from_template(template)
1.で取得したYoutube動画の情報を埋め込むためには、以下のコードを実行します。
request = prompt.invoke( {"script":scripts, "description": metadata["description"]})
print(request.text)
ChatGPTへこの出力結果をそのまま張り付けることでもレシピのmarkdown化は可能です。
ログイン不要で無料でChatGPTを試せるので、手軽に試したい場合はコピペでも!
3. ChatGPTにレシピを要約してもらう
OpenAIのAPIを使える場合は、以下のようなコードでレシピの要約&markdown化まで自動化できます。
import getpass
import os
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv()
# API keyを環境変数から取得。ない場合は入力を促す
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")
# OpenAIのAPIを使用して、GPT-4o miniを呼び出す場合
model = ChatOpenAI(model="gpt-4o-mini")
# プロンプトテンプレートを使用して、LLMを呼び出し
chain = prompt | model | StrOutputParser()
chain.invoke({"script":scripts, "description": metadata["description"]})
※ Youtubeの字幕分の文章を要約させようとしたところ、429のRateLimitError
が発生してしまいました。無料枠では難しいようでした...。
'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.'
無料で試したい場合は、2.で作成したプロンプトの出力結果をChatGPTへコピペするのがよさそうです。
実行すると...?
ChatGPTへ、2.で作成したプロンプトをコピペする方法で要約してみました。
いくつか試したレシピ動画では、材料の表記が「酒・醤油・みりん 各大さじ2」のようにまとまっていた原文から、
- 酒:大さじ2
- 醤油:大さじ2
- みりん:大さじ2
のように材料毎の分量のリストとして出力されたりと、構造化もできていることが確認できました。
レシピの工程だけでなく、動画内で言及されていた調理のポイントも書き起こしてくれました。
今後やりたいこと
レシピ集としてDB化まで自動化したい...。
Discussion