Agent / tools /youtube_transcript.py
BiGuan's picture
Upload 13 files
e15103f verified
Raw
History Blame Contribute Delete
1.96 kB
"""
tools/youtube_transcript.py —— 工具⑦:抓取 YouTube 视频字幕
有的题目给一个 YouTube 视频链接,问"视频里某人说了什么/出现了什么数字"。
这个工具不去真的"看"视频(那太慢),而是直接抓取视频自带的字幕文字,
把整段台词拼成一段文字交给大模型,从中找答案。
"""
import re
from langchain_core.tools import tool
@tool
def youtube_transcript(url: str) -> str:
"""Return the spoken transcript of a YouTube video given its URL (or video id). Use it
to answer questions about what is said in a video."""
# 每个 YouTube 视频都有一个 11 位的唯一编号(video id)。下面用正则从各种格式的链接里把它揪出来:
# 比如 youtube.com/watch?v=XXXX、youtu.be/XXXX、/shorts/XXXX 等都能匹配。
match = re.search(r"(?:v=|youtu\.be/|/shorts/|/embed/)([0-9A-Za-z_-]{11})", url)
# 匹配到就用匹配出的编号;没匹配到就假设传进来的本身就是编号。
video_id = match.group(1) if match else url.strip()
try:
from youtube_transcript_api import YouTubeTranscriptApi
# 这个库新旧版本用法不同,下面两种写法是为了兼容:哪种可用就用哪种。
if hasattr(YouTubeTranscriptApi, "get_transcript"):
# 旧版用法:返回一串"片段",每段是 {"text": 这句话, ...},把所有句子拼起来。
chunks = YouTubeTranscriptApi.get_transcript(video_id)
return " ".join(c["text"] for c in chunks)
# 新版用法:写法略有不同,但同样是把每段台词拼成整段文字。
fetched = YouTubeTranscriptApi().fetch(video_id)
return " ".join(snippet.text for snippet in fetched)
except Exception as e:
# 抓不到字幕(比如视频没字幕、或服务器 IP 被限制)就返回错误说明。
return f"Could not fetch transcript for '{url}': {e}"