CoolFace
Apppublic

BiGuan/Agent

sourceHugging Faceupdated 4mo agoView on Hugging Face
0likes
youtube_transcript.py37 linesDownload Raw Back to tools
1"""2tools/youtube_transcript.py —— 工具⑦:抓取 YouTube 视频字幕3 4有的题目给一个 YouTube 视频链接,问"视频里某人说了什么/出现了什么数字"。5这个工具不去真的"看"视频(那太慢),而是直接抓取视频自带的字幕文字,6把整段台词拼成一段文字交给大模型,从中找答案。7"""8 9import re10 11from langchain_core.tools import tool12 13 14@tool15def youtube_transcript(url: str) -> str:16    """Return the spoken transcript of a YouTube video given its URL (or video id). Use it17    to answer questions about what is said in a video."""18    # 每个 YouTube 视频都有一个 11 位的唯一编号(video id)。下面用正则从各种格式的链接里把它揪出来:19    # 比如 youtube.com/watch?v=XXXX、youtu.be/XXXX、/shorts/XXXX 等都能匹配。20    match = re.search(r"(?:v=|youtu\.be/|/shorts/|/embed/)([0-9A-Za-z_-]{11})", url)21    # 匹配到就用匹配出的编号;没匹配到就假设传进来的本身就是编号。22    video_id = match.group(1) if match else url.strip()23    try:24        from youtube_transcript_api import YouTubeTranscriptApi25 26        # 这个库新旧版本用法不同,下面两种写法是为了兼容:哪种可用就用哪种。27        if hasattr(YouTubeTranscriptApi, "get_transcript"):28            # 旧版用法:返回一串"片段",每段是 {"text": 这句话, ...},把所有句子拼起来。29            chunks = YouTubeTranscriptApi.get_transcript(video_id)30            return " ".join(c["text"] for c in chunks)31        # 新版用法:写法略有不同,但同样是把每段台词拼成整段文字。32        fetched = YouTubeTranscriptApi().fetch(video_id)33        return " ".join(snippet.text for snippet in fetched)34    except Exception as e:35        # 抓不到字幕(比如视频没字幕、或服务器 IP 被限制)就返回错误说明。36        return f"Could not fetch transcript for '{url}': {e}"37