Transcrições de vídeo para pipelines de RAG e LLM
Transforme vídeos do YouTube e do TikTok em blocos que um LLM pode buscar e citar: busque os segmentos com tempo, divida por tempo e mantenha links com marcação de tempo.
Atualizado em
Resposta curta: busque a transcrição em JSON, não em texto simples. O array segments traz um horário de início e de fim para cada linha de legenda, então você pode dividir por tempo e guardar o início como metadado. Assim, cada resposta do seu modelo pode linkar para o momento exato do vídeo.
Por que segmentos com tempo superam o texto simples#
- Citações: um bloco que sabe que começa aos 754 segundos vira um link para esse momento.
- Limites naturais: as linhas de legenda terminam nas pausas, então os blocos raramente cortam uma frase ao meio.
- Procedência:
source_origininforma se o texto veio do criador, das legendas automáticas da plataforma ou da transcrição por IA, elanguageinforma o idioma.
Buscar e dividir em blocos#
Este código busca uma transcrição e agrupa os segmentos em janelas de cerca de um minuto. O formato do JSON da transcrição está documentado na referência da 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
Muitos vídeos#
- Encontre os vídeos com a descoberta de vídeos: busca no YouTube, um canal, uma playlist ou um perfil do TikTok.
- Envie-os como um lote e deixe um webhook avisar o seu ingestor quando cada tarefa terminar, em vez de ficar consultando o status.
- Ler de novo e reexportar uma transcrição é grátis, e enviar um link que você já transcreveu devolve o resultado armazenado; assim, rodar uma ingestão novamente não custa duas vezes.
Agentes que buscam sob demanda#
Nem todo pipeline precisa de um índice. Um agente conectado ao servidor MCP do Transcript Dock pode chamar get_video_transcript quando um usuário mencionar um vídeo e ler o texto diretamente no contexto dele. Para frameworks, veja LangChain e n8n.