HomeBlogTranscribePlansAPI Keys

Subtítulos de yt-dlp versus una API de Transcripción: Cuál Usar

Vista dividida de un comando de descarga de subtítulos de yt-dlp junto a una respuesta limpia de API de transcripción JSON

yt-dlp puede descargar subtítulos para básicamente cualquier video de YouTube, y si lo has usado para descargas de medios probablemente ya hayas descubierto los flags. Es una herramienta genuinamente excelente — la mantengo instalada en todas partes. Pero "puede descargar subtítulos" y "es la forma correcta de obtener transcripciones en un servicio" son reclamos diferentes, y he sido quemado por confundirlos. Aquí está lo que cada enfoque realmente parece, incluyendo el paso de limpieza que nadie te advierte.

El camino de yt-dlp, de principio a fin

Agarrando subtítulos en inglés generados automáticamente sin descargar el video:

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

(Usa --write-sub en lugar de eso para pistas cargadas por humanos, o ambos flags juntos.) Esto suelta un archivo VIDEO_ID.en.vtt. Abrelo y verás por qué no has terminado:

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

Los subtítulos automáticos son leyendas "rodantes" — cada cue repite la línea anterior, así que el despojo ingenuo te da cada oración dos veces. Todos los que bajan por este camino terminan escribiendo alguna versión de esta limpieza:

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)

Comando, manejo de subproceso, I/O de archivo, dedup — llámalo 40 líneas de pegamento antes de que tengas texto plano.

Dónde yt-dlp es la respuesta correcta

Dónde duele en un servidor

Tres cargas de mantenimiento separadas aparecen en el momento en que yt-dlp se mueve a un backend:

El camino de la API

La versión de punto final alojado de todo el pipeline anterior:

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

Devuelve JSON — {"result": {"videoId", "title", "pubDate", "content", ...}} — ya texto plano desduplicado, con errores estructurados (TRANSCRIPT_UNAVAILABLE cuando no existen subtítulos, en lugar de arqueología de stderr). Una clave demo compartida es una llamada de distancia (curl -s https://youtube2text.org/api/demo-key, 5 videos/mes por IP); el quickstart completo está en extrayendo transcripciones con curl.

La nota a pie de página honesta

Ambos enfoques obtienen los mismos subtítulos del mismo lugar, y ambos tienen que lidiar con YouTube no queriendo tráfico automatizado. yt-dlp hace eso tu problema — bien en un portátil, un proyecto proxy en un servidor. Una API alojada lo hace el problema del proveedor: youtube2text.org enruta capturas a través de proxies residenciales rotativos del lado del servidor, que es precisamente la pieza que no puedes replicar fácilmente desde una IP del centro de datos. No estás pagando por la transcripción; estás pagando por no operar eso.

Mi división: yt-dlp para archivos y de una sola vez en mi propia máquina, la API para cualquier cosa que se ejecute desatendida. Si eso coincide con tu situación, las claves están en youtube2text.org/app/keys — inicio de sesión de Google, nivel gratuito de 5/mes, pagado desde $5.99.