YouTube 文字记录对于摘要模型、RAG 管道、内容分析和辅助工具来说是很有价值的输入。 YouTube 的官方数据 API 不会直接公开文字记录 - 开发人员通常会从内部端点解析自动生成的字幕,这些字幕会在没有通知的情况下中断。 Scavio 转录端点接受 video_id 并以结构化 JSON 形式返回完整的带时间戳的转录。本教程演示如何调用端点、处理响应以及重新组装文本以进行下游处理。
前置条件
- 安装了 Python 3.8 或更高版本
- 请求已安装库
- Scavio API 密钥
- 用于测试的 YouTube 视频 ID(例如 dQw4w9WgXcQ)
操作指南
步骤 1: 识别视频ID
视频 ID 是 YouTube URL 中 v= 后面的 11 个字符的字符串。对于 https://youtube.com/watch?v=dQw4w9WgXcQ,ID 为 dQw4w9WgXcQ。
from urllib.parse import urlparse, parse_qs
def extract_video_id(url: str) -> str:
parsed = urlparse(url)
return parse_qs(parsed.query).get("v", [url])[0]步骤 2: 调用转录端点
使用 YouTube 平台、操作记录和 video_id POST 到 Scavio 端点。
import requests
response = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "youtube", "action": "transcript", "video_id": "dQw4w9WgXcQ"}
)
data = response.json()步骤 3: 重新组装转录文本
转录密钥包含带有开始、持续时间和文本的片段列表。加入他们以生成纯文本文档。
segments = data.get("transcript", [])
full_text = " ".join(seg["text"] for seg in segments)
print(full_text[:500])步骤 4: 保存到文件以供下游使用
将转录本写入磁盘,以便向量存储或摘要模型可以摄取它。
with open("transcript.txt", "w", encoding="utf-8") as f:
f.write(full_text)
print(f"Saved {len(segments)} segments, {len(full_text)} characters")Python 示例
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def get_transcript(video_id: str) -> list[dict]:
response = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"platform": "youtube", "action": "transcript", "video_id": video_id}
)
response.raise_for_status()
return response.json().get("transcript", [])
def segments_to_text(segments: list[dict]) -> str:
return " ".join(seg["text"] for seg in segments)
def main():
video_id = "dQw4w9WgXcQ"
segments = get_transcript(video_id)
text = segments_to_text(segments)
print(f"Transcript: {len(segments)} segments, {len(text)} chars")
print(text[:300])
if __name__ == "__main__":
main()JavaScript 示例
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
async function getTranscript(videoId) {
const response = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "youtube", action: "transcript", video_id: videoId })
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
return data.transcript || [];
}
function segmentsToText(segments) {
return segments.map(s => s.text).join(" ");
}
async function main() {
const segments = await getTranscript("dQw4w9WgXcQ");
const text = segmentsToText(segments);
console.log(`${segments.length} segments, ${text.length} chars`);
console.log(text.slice(0, 300));
}
main().catch(console.error);预期输出
{
"video_id": "dQw4w9WgXcQ",
"language": "en",
"transcript": [
{ "start": 0.0, "duration": 3.2, "text": "We're no strangers to love" },
{ "start": 3.2, "duration": 2.8, "text": "You know the rules and so do I" },
{ "start": 6.0, "duration": 3.5, "text": "A full commitment's what I'm thinking of" }
]
}