Transcripciones de video para RAG y pipelines de LLM
Convierte videos de YouTube y TikTok en fragmentos que un LLM pueda buscar y citar: obtén segmentos con tiempos, fragmenta por tiempo y conserva los enlaces con marca de tiempo.
Actualizado
Respuesta corta: obtén la transcripción como JSON, no como texto plano. El arreglo segments trae una hora de inicio y de fin para cada línea de subtítulos, así que puedes fragmentar por tiempo y guardar el inicio como metadato. Así, cada respuesta de tu modelo puede enlazar al momento exacto del video.
Por qué los segmentos con tiempos superan al texto plano#
- Citas: un fragmento que sabe que empieza en el segundo 754 se convierte en un enlace a ese momento.
- Límites naturales: las líneas de subtítulos terminan en las pausas, así que los fragmentos rara vez cortan una oración por la mitad.
- Procedencia:
source_originte dice si el texto vino del creador, de los subtítulos automáticos de la plataforma o de la transcripción con IA, ylanguageindica su idioma.
Obtener y fragmentar#
Este código obtiene una transcripción y agrupa los segmentos en ventanas de aproximadamente un minuto. La forma del JSON de la transcripción está documentada en la referencia de la API.
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
Muchos videos#
- Encuentra los videos con el descubrimiento de videos: búsqueda en YouTube, un canal, una lista de reproducción o un perfil de TikTok.
- Envíalos como un lote y deja que un webhook avise a tu proceso de ingesta cuando termine cada trabajo, en lugar de consultar el estado una y otra vez.
- Volver a leer y volver a exportar una transcripción es gratis, y enviar un enlace que ya transcribiste devuelve el resultado guardado, así que volver a ejecutar una ingesta no cuesta el doble.
Agentes que obtienen la transcripción cuando la necesitan#
No todos los pipelines necesitan un índice. Un agente conectado al servidor MCP de Transcript Dock puede llamar a get_video_transcript cuando un usuario menciona un video y leer el texto directamente en su contexto. Para frameworks, consulta LangChain y n8n.