HomeBlogTranscribePlansAPI Keys

yt-dlp-Untertitel vs. eine Transkript-API: Welche zum Nutzen

Split-View eines yt-dlp-Untertitel-Download-Befehls neben einer sauberen JSON-Transkript-API-Antwort

yt-dlp kann Untertitel für grundsätzlich jedes YouTube-Video herunterladen, und wenn du es für Media-Downloads verwendet hast, hast du die Flags wahrscheinlich bereits entdeckt. Das ist ein rechtmäßig großartiges Tool — ich behalte es überall installiert. Aber "kann Untertitel herunterladen" und "ist die richtige Weg, Transkripte in einen Service zu bekommen" sind unterschiedliche Ansprüche, und ich bin davon verbrannt, sie zu vermischen. Hier ist, wie jeder Ansatz tatsächlich aussieht, einschließlich der Aufräum-Schritt, den niemand dir warnt.

Der yt-dlp-Weg, end-to-end

Auto-generierte englische Untertitel abrufen, ohne das Video herunterzuladen:

yt-dlp --write-auto-sub --sub-lang en --skip-download \
  -o "%(id)s" "https://www.youtube.com/watch?v=VIDEO_ID"

(Nutze --write-sub statt dessen für menschlich-hochgeladene Tracks oder beide Flags zusammen.) Dies droppt eine VIDEO_ID.en.vtt Datei. Öffne sie und du wirst sehen, warum du nicht fertig bist:

WEBVTT
Kind: captions
Language: en

00:00:00.320 --> 00:00:02.879
so today we're going to look at
00:00:01.760 --> 00:00:04.560
so today we're going to look at
how youtube handles

Auto-Untertitel sind "rolling" Captions — jede Hinweis wiederholt die vorherige Zeile, daher naive Stripping gibt dir jeden Satz zweimal. Jeder, der diesen Weg hinunter geht, endet damit, schreiben irgendeine Version dieser Aufräum:

import re, pathlib

lines = []
for line in pathlib.Path("VIDEO_ID.en.vtt").read_text().splitlines():
    if "-->" in line or line.startswith(("WEBVTT", "Kind:", "Language:")) or not line.strip():
        continue
    line = re.sub(r"<[^>]+>", "", line).strip()   # strip inline timing tags
    if not lines or line != lines[-1]:            # collapse rolling duplicates
        lines.append(line)
text = " ".join(lines)

Befehl, Subprocess-Handhabung, Datei-I/O, Dedupe — call it 40 Zeilen Klebstoff, bevor du reinen Text hast.

Wo yt-dlp die richtige Antwort ist

Wo es auf einem Server schmerzt

Drei separate Wartungs-Lasten zeigen sich der Moment, yt-dlp in einen Backend bewegt:

Der API-Weg

Die gehostete-Endpunkt-Version der ganzen obigen Pipeline:

curl -s "https://youtube2text.org/api/transcribe?url=VIDEO_ID" \
  -H "x-api-key: yt_YOUR_KEY"

Gibt JSON zurück — {"result": {"videoId", "title", "pubDate", "content", ...}} — schon dedupliziert reinen Text, mit strukturierten Fehlern (TRANSCRIPT_UNAVAILABLE, wenn Captions nicht vorhanden, statt stderr Archäologie). Ein gemeinsamer Demo-Schlüssel ist ein Aufruf weg (curl -s https://youtube2text.org/api/demo-key, 5 Videos/Monat pro IP); der vollständige Quickstart ist in Transkripte mit curl extrahieren.

Die ehrliche Fußnote

Beide Ansätze holen die gleichen Captions vom gleichen Ort und beide müssen sich mit YouTube befassen, nicht wollen automatisierten Traffic. yt-dlp macht das dein Problem — fine auf einem Laptop, ein Proxy-Projekt auf einem Server. Eine gehostete API macht es das Problem des Anbieters: youtube2text.org leitet fetches durch rotierende Wohn-Proxys Server-Seite, das ist genau der Teil, den du nicht leicht von einer Rechenzentrum-IP replizieren kannst. Du zahlst nicht für das Transkript; du zahlst, um das nicht zu operieren.

Mein Split: yt-dlp für Archive und One-Offs auf meiner eigenen Maschine, die API für alles, das unbeaufsichtigt läuft. Wenn das deine Situation passt, Schlüssel sind bei youtube2text.org/app/keys — Google-Anmeldung, kostenlos 5/Monat-Stufe, bezahlt von $5,99.