它解决什么问题
大型视频库实际上无法搜索。粉丝要在几小时的视频里来回拖动,寻找一个记得不太清的片段;学员为了找到一段讲解要重看整节课;企业的知识则埋没在录制的演讲里。为带时间戳的字幕建立索引,就能像搜索文档一样搜索任何视频库,结果还能直接跳到正确的时刻。
第一版应该包含哪些功能
- 在频道或播放列表的所有视频中按短语和关键词搜索
- 结果显示匹配的句子,并附带跳转到精确时间点的链接
- 语义搜索:搜“我的产品该怎么定价”也能找到“如何设定收费标准”
- 按日期、视频和说话人筛选
- 新上传的视频自动建立索引
分步实现指南
- 01
收集视频列表
用频道 handle 或播放列表 URL 调用 /channels/resolve 或 /playlists/resolve,获取每个视频的 ID 和标题。
- 02
批量获取字幕
把视频 ID 发送到 /batch,并启用 format.timestamp 和 format.paragraphs。大批量任务是异步执行的,可轮询 /batch/{batch_id} 或使用 webhook。
- 03
为分段建立索引
将每个段落连同视频 ID 和开始时间一起存储。关键词搜索用 Postgres 全文搜索就够了;如需按语义搜索,可在 pgvector 或向量数据库中加入向量嵌入。
- 04
搭建搜索界面
返回最匹配的结果及上下文,并提供 youtube.com/watch?v=ID&t=SECONDS 格式的链接,让用户直接跳到那一刻。
- 05
保持内容更新
运行定时任务,重新解析频道,找出新的视频 ID,只为这些新视频获取字幕。
入门代码
这个创意基于“方案 3:把播放列表批量导入知识库”模式。替换成你自己的频道、提示词和存储即可。
import requests
API = "https://www.youtubetranscript.dev/api/v2"
HEADERS = {"Authorization": "Bearer yt_sk_live_YOUR_KEY"}
playlist = requests.post(f"{API}/playlists/resolve", headers=HEADERS,
json={"playlist_url": "https://www.youtube.com/playlist?list=PLAYLIST_ID",
"limit": 100}).json()
ids = [v["video_id"] for v in playlist["items"]]
batch = requests.post(f"{API}/batch", headers=HEADERS, json={
"video_ids": ids,
"format": {"timestamp": True, "paragraphs": True},
}).json()
# Large batches run async: poll GET /batch/{batch_id} until status is "completed"
for r in batch.get("results", []):
if r["status"] == "completed":
for p in r["data"]["transcript"].get("paragraphs") or []:
store(video_id=r["video_id"], start=p["start"], text=p["text"]) # your vector DB为什么值得做
卖给视频库的所有者而不是观众:播客网络、课程平台和拥有内部视频档案的公司,愿意为能提升受众黏性的搜索功能支付月费。对于粉丝社区,可以提供免费的公开搜索,再用提醒或 API 访问做付费层。
需要避开的坑
- 把整份字幕当作一个文档来索引:没有段落级时间戳,搜索结果基本没用。
- 每次更新都重新转录整个频道,而不是记录哪些视频 ID 已经处理过。
- 只依赖精确关键词匹配:口语表达很随意,应尽早加入语义搜索。
关于这个创意的问题
搜索 YouTube 字幕需要向量数据库吗?
不需要。对大多数视频库来说,Postgres 全文搜索就能很好地处理关键词搜索。当你希望按语义而非字面匹配时,再加入向量嵌入。
如何把搜索结果链接到视频中的精确时刻?
每个字幕分段都包含以秒为单位的开始时间。在 YouTube 链接后追加 &t= 加上该数字即可。
没有字幕的视频也能建立索引吗?
可以。启用 allow_asr 并提供 webhook URL,当视频缺少字幕时,API 会用 AI 语音识别转录音频。