Videotranskripte für RAG- und LLM-Pipelines
Verwandeln Sie YouTube- und TikTok-Videos in Abschnitte, die ein LLM durchsuchen und zitieren kann: zeitlich markierte Segmente abrufen, nach Zeit in Abschnitte teilen, Zeitstempel-Links behalten.
Aktualisiert
Kurz gesagt: Rufen Sie das Transkript als JSON ab, nicht als Klartext. Das Array segments enthält für jede Untertitelzeile eine Start- und eine Endzeit. So können Sie nach Zeit in Abschnitte teilen und den Start als Metadaten speichern. Dann kann jede Antwort Ihres Modells auf den genauen Moment im Video verlinken.
Warum zeitlich markierte Segmente besser sind als Klartext#
- Quellenangaben: Ein Abschnitt, der weiß, dass er bei 754 Sekunden beginnt, wird zu einem Link auf genau diesen Moment.
- Natürliche Grenzen: Untertitelzeilen enden an Sprechpausen, daher zerschneiden Abschnitte selten einen Satz in der Mitte.
- Herkunft:
source_originzeigt, ob der Text vom Ersteller, aus den automatischen Untertiteln der Plattform oder aus der KI-Transkription stammt.languagegibt die Sprache an.
Abrufen und in Abschnitte teilen#
Dieses Beispiel ruft ein Transkript ab und fasst Segmente zu Abschnitten von etwa einer Minute zusammen. Die Struktur des Transkript-JSON ist in der API-Referenz dokumentiert.
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
Viele Videos#
- Finden Sie die Videos mit der Videosuche: YouTube-Suche, ein Kanal, eine Playlist oder ein TikTok-Profil.
- Übermitteln Sie sie als Stapel. Ein Webhook benachrichtigt Ihren Ingest-Prozess, sobald jeder Auftrag fertig ist, statt dass Sie abfragen müssen.
- Ein Transkript erneut zu lesen und zu exportieren ist kostenlos. Wenn Sie einen Link übermitteln, den Sie bereits transkribiert haben, kommt das gespeicherte Ergebnis zurück. Ein erneuter Ingest kostet daher nicht doppelt.
Agenten, die bei Bedarf abrufen#
Nicht jede Pipeline braucht einen Index. Ein Agent, der mit dem MCP-Server von Transcript Dock verbunden ist, kann get_video_transcript aufrufen, sobald ein Nutzer ein Video erwähnt, und den Text direkt in seinen Kontext lesen. Für Frameworks siehe LangChain und n8n.