El problema que resuelve
En la práctica, es imposible buscar en las grandes videotecas. Los fans recorren horas de grabaciones para encontrar un momento que recuerdan a medias, los alumnos de un curso vuelven a ver lecciones enteras para encontrar una explicación y las empresas pierden conocimiento interno enterrado en charlas grabadas. Indexar transcripciones con marcas de tiempo convierte cualquier videoteca en algo que puedes buscar como un documento, con resultados que saltan directamente al momento adecuado.
Qué incluir en tu primera versión
- Búsqueda por frase y palabra clave en todos los vídeos de un canal o una lista de reproducción
- Resultados que muestran la frase coincidente con un enlace a la marca de tiempo exacta
- Búsqueda semántica para que "cómo pongo precio a mi producto" también encuentre "fijar tus tarifas"
- Filtros por fecha, vídeo y orador
- Indexación automática de los nuevos vídeos
Cómo construirlo, paso a paso
- 01
Reúne la lista de vídeos
Llama a /channels/resolve o /playlists/resolve con el identificador del canal o la URL de la lista para obtener el ID y el título de cada vídeo.
- 02
Obtén las transcripciones en bloque
Envía los IDs a /batch con format.timestamp y format.paragraphs activados. Los lotes grandes se procesan de forma asíncrona, así que consulta /batch/{batch_id} o usa un webhook.
- 03
Indexa los segmentos
Guarda cada párrafo con el ID del vídeo y su tiempo de inicio. La búsqueda de texto completo de Postgres basta para buscar por palabras clave; añade embeddings en pgvector o en una base de datos vectorial para buscar por significado.
- 04
Crea la interfaz de búsqueda
Devuelve las mejores coincidencias con el texto de alrededor y un enlace del tipo youtube.com/watch?v=ID&t=SECONDS para que los usuarios lleguen al momento exacto.
- 05
Mantenlo actualizado
Programa una tarea que vuelva a resolver el canal, detecte los IDs de vídeo nuevos y transcriba solo esos.
Código de inicio
Esta idea se basa en el patrón "Receta 3: carga en bloque una lista de reproducción en una base de conocimiento". Usa tus propios canales, prompts y almacenamiento.
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 DBPor qué vale la pena construirlo
Véndeselo al propietario de la videoteca, no al espectador: las redes de pódcasts, las plataformas de cursos y las empresas con archivos de vídeo internos pagarán una cuota mensual por una búsqueda que mantenga a su audiencia enganchada. Para comunidades de fans también funciona una búsqueda pública gratuita con un plan de pago para alertas o acceso a la API.
Errores que debes evitar
- Indexar cada transcripción completa como un único documento: sin marcas de tiempo por párrafo, los resultados no sirven de nada.
- Volver a transcribir todo el canal en cada actualización en lugar de llevar un registro de los IDs de vídeo ya procesados.
- Depender solo de coincidencias exactas de palabras clave: el lenguaje hablado es desordenado, así que añade búsqueda semántica pronto.
Preguntas sobre esta idea
¿Necesito una base de datos vectorial para buscar en transcripciones de YouTube?
No. La búsqueda de texto completo de Postgres resuelve bien la búsqueda por palabras clave para la mayoría de las videotecas. Añade embeddings cuando quieras resultados que coincidan en significado y no solo en palabras exactas.
¿Cómo enlazo un resultado de búsqueda al momento exacto del vídeo?
Cada segmento de la transcripción incluye un tiempo de inicio en segundos. Añade &t= seguido de ese número a la URL de YouTube.
¿Puedo indexar vídeos que no tienen subtítulos?
Sí. Activa allow_asr con una URL de webhook y la API transcribirá el audio con reconocimiento de voz por IA cuando falten los subtítulos.