Transcriptions vidéo pour RAG et pipelines LLM
Transformez des vidéos YouTube et TikTok en blocs qu'un LLM peut rechercher et citer : récupérez des segments horodatés, découpez par temps et conservez des liens vers l'instant exact.
Mis à jour le
En bref : récupérez la transcription en JSON, et non en texte brut. Le tableau segments contient un temps de début et de fin pour chaque ligne de sous-titres. Vous pouvez ainsi découper par temps et stocker le début comme métadonnée. Chaque réponse de votre modèle peut alors renvoyer vers le moment exact de la vidéo.
Pourquoi les segments horodatés valent mieux que le texte brut#
- Citations : un bloc qui sait qu'il commence à 754 secondes devient un lien vers ce moment.
- Frontières naturelles : les lignes de sous-titres se terminent aux pauses, donc les blocs coupent rarement une phrase en deux.
- Provenance :
source_originindique si le texte vient du créateur, des sous-titres automatiques de la plateforme ou de la transcription par IA, etlanguagedonne sa langue.
Récupérer et découper#
Cet exemple récupère une transcription et regroupe les segments en fenêtres d'environ une minute. La structure du JSON de transcription est décrite dans la référence 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
Beaucoup de vidéos#
- Trouvez les vidéos avec la découverte de vidéos : recherche YouTube, chaîne, playlist ou profil TikTok.
- Envoyez-les sous forme de lot et laissez un webhook prévenir votre module d'ingestion à la fin de chaque tâche, au lieu de faire du polling.
- Relire et réexporter une transcription est gratuit, et envoyer un lien déjà transcrit renvoie le résultat enregistré : relancer une ingestion ne coûte donc pas deux fois.
Des agents qui récupèrent à la demande#
Tous les pipelines n'ont pas besoin d'un index. Un agent connecté au serveur MCP de Transcript Dock peut appeler get_video_transcript lorsqu'un utilisateur mentionne une vidéo, et lire le texte directement dans son contexte. Pour les frameworks, voir LangChain et n8n.