Videotranscripties voor RAG- en LLM-pijplijnen
Zet YouTube- en TikTok-video's om in stukken die een LLM kan doorzoeken en citeren: haal getimede segmenten op, deel op tijd en bewaar tijdstempellinks.
Bijgewerkt
Kort gezegd: haal de transcriptie op als JSON, niet als platte tekst. De segments-array bevat een begin- en eindtijd voor elke ondertitelregel, zodat je op tijd kunt opdelen en de starttijd als metadata kunt opslaan. Dan kan elk antwoord van je model linken naar het exacte moment in de video.
Waarom getimede segmenten beter zijn dan platte tekst#
- Bronvermeldingen: een stuk dat weet dat het op 754 seconden begint, wordt een link naar dat moment.
- Natuurlijke grenzen: ondertitelregels eindigen bij pauzes, dus stukken snijden zelden een zin in tweeën.
- Herkomst:
source_originvertelt of de tekst van de maker, van de automatische ondertitels van het platform of van AI-transcriptie komt, enlanguagegeeft de taal.
Ophalen en opdelen#
Dit haalt één transcriptie op en groepeert segmenten in vensters van ongeveer een minuut. De opbouw van het transcript-JSON staat in de API-referentie.
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
Veel video's#
- Zoek de video's met videoontdekking: YouTube-zoeken, een kanaal, een afspeellijst of een TikTok-profiel.
- Dien ze in als batch en laat een webhook je ingester melden wanneer elke taak klaar is, in plaats van te pollen.
- Een transcriptie opnieuw lezen en opnieuw exporteren is gratis, en een link die je al hebt getranscribeerd geeft het opgeslagen resultaat terug. Een opnieuw uitgevoerde ingest kost dus niet dubbel.
Agents die op verzoek ophalen#
Niet elke pijplijn heeft een index nodig. Een agent die verbonden is met de Transcript Dock MCP-server kan get_video_transcript aanroepen wanneer een gebruiker een video noemt, en de tekst direct in zijn context lezen. Voor frameworks zie LangChain en n8n.