Какую проблему решает
Большие видеотеки фактически невозможно искать. Фанаты часами перематывают записи в поисках полузабытого момента, студенты курсов пересматривают целые уроки ради одного объяснения, а компании теряют знания, похороненные в записях выступлений. Индексация расшифровок с таймкодами превращает любую видеотеку в то, что можно искать как документ, а результаты сразу ведут к нужному моменту.
Что включить в первую версию
- Поиск по фразам и ключевым словам во всех видео канала или плейлиста
- Результаты с найденным предложением и ссылкой на точный таймкод
- Семантический поиск, чтобы запрос «как назначить цену на продукт» находил и «как выставлять расценки»
- Фильтры по дате, видео и спикеру
- Автоматическая индексация новых загрузок
Как создать: пошагово
- 01
Соберите список видео
Вызовите /channels/resolve или /playlists/resolve с хендлом канала или URL плейлиста, чтобы получить ID и названия всех видео.
- 02
Получите расшифровки пакетом
Отправьте ID в /batch с включёнными format.timestamp и format.paragraphs. Крупные пакеты обрабатываются асинхронно, поэтому опрашивайте /batch/{batch_id} или используйте вебхук.
- 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 хорошо справляется с поиском по ключевым словам для большинства видеотек. Добавьте эмбеддинги, когда нужны результаты, совпадающие по смыслу, а не по точным словам.
Как связать результат поиска с точным моментом в видео?
Каждый сегмент расшифровки содержит время начала в секундах. Добавьте к URL YouTube &t= и это число.
Можно ли индексировать видео без субтитров?
Да. Включите allow_asr и укажите URL вебхука — если субтитров нет, API расшифрует аудио с помощью AI-распознавания речи.