指南
用于 RAG 和 LLM 流水线的视频文稿
把 YouTube 和 TikTok 视频变成 LLM 可以搜索和引用的文本块:获取带时间的分段、按时间分块、保留时间戳链接。
更新于
先说结论:请以 JSON 而不是纯文本获取文稿。segments 数组为每一行字幕都带有开始和结束时间,所以你可以按时间分块,并把开始时间存为元数据。这样模型给出的每个回答,都可以链接到视频中的确切时刻。
为什么带时间的分段胜过纯文本#
- 引用:知道自己从第 754 秒开始的文本块,可以变成指向那个时刻的链接。
- 自然的边界:字幕行在停顿处结束,所以文本块很少把一句话从中间截断。
- 来源信息:
source_origin会告诉你文字来自创作者、平台自动字幕还是 AI 转录,language则给出它的语言。
获取并分块#
下面的代码获取一份文稿,并把分段按大约一分钟一个窗口分组。文稿 JSON 的结构记录在 API 参考中。
rag_ingest.py
import requestsAPI = "https://www.transcriptdock.com"H = {"Authorization": "Bearer td_live_YOUR_KEY"}def transcript(url: str) -> dict:job = requests.post(f"{API}/v1/jobs", headers={**H, "Idempotency-Key": f"rag-{url}"[:128]},json={"source": {"url": url}, "mode": "captions_only"}).json()while job["status"] not in ("succeeded", "failed", "cancelled"):job = requests.get(f"{API}/v1/jobs/{job['id']}", params={"wait": 25}, headers=H).json()if job["status"] != "succeeded":raise RuntimeError(job["error"]["code"])return requests.get(f"{API}/v1/transcripts/{job['result_id']}", headers=H).json()def chunks(t: dict, seconds: float = 60.0):"""Group caption segments into windows of about `seconds`, never splitting a segment."""url = t["source"]["canonical_url"]buf, start = [], Nonefor seg in t["segments"]:if start is None:start = seg["start"]buf.append(seg["text"])if seg["end"] - start >= seconds:yield {"text": " ".join(buf), "start": start, "url": f"{url}&t={int(start)}s" if "youtube" in url else url}buf, start = [], Noneif buf:yield {"text": " ".join(buf), "start": start, "url": url}t = transcript("https://www.youtube.com/watch?v=dQw4w9WgXcQ")for c in chunks(t):print(c["start"], c["url"], c["text"][:80]) # embed c["text"], store start and url as metadata
大量视频#
- 用视频发现找到视频:YouTube 搜索、某个频道、某个播放列表或某个 TikTok 主页。
- 把它们作为批量任务提交,让 Webhook 在每个任务完成时通知你的摄取程序,而不是轮询。
- 重新读取和重新导出文稿都是免费的,提交你已经转录过的链接会直接返回已保存的结果,所以重新运行一次摄取不会重复花费。
按需获取的智能体#
并不是每条流水线都需要索引。连接了 Transcript Dock MCP 服务器的智能体,可以在用户提到某个视频时调用 get_video_transcript,把文本直接读入自己的上下文。关于框架,参见 LangChain 和 n8n。