HomeBlogTranscribePlansAPI Keys

yt-dlp Sous-titres vs une API de transcription : Lequel utiliser

Vue divisée d'une commande de téléchargement de sous-titres yt-dlp à côté d'une réponse d'API de transcription JSON propre

yt-dlp peut télécharger les sous-titres pour à peu près n'importe quelle vidéo YouTube, et si vous l'avez utilisé pour les téléchargements de médias, vous avez probablement déjà découvert les drapeaux. C'est un outil véritablement excellent — je le garde installé partout. Mais "peut télécharger les sous-titres" et "est la bonne façon d'obtenir les transcriptions dans un service" sont des affirmations différentes, et j'ai été brûlé en les fusionnant. Voici ce que chaque approche ressemble réellement, incluant l'étape de nettoyage que personne ne vous prévient.

Le chemin yt-dlp, de bout en bout

Attraper les sous-titres anglais générés automatiquement sans télécharger la vidéo :

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

(Utilisez --write-sub à la place pour les pistes téléchargées par l'humain, ou les deux drapeaux ensemble.) Cela supprime un fichier VIDEO_ID.en.vtt. Ouvrez-le et vous verrez pourquoi vous n'avez pas fini :

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

Les auto-sous-titres sont des sous-titres "roulants" — chaque indice répète la ligne précédente, donc le dépôuillement naïf vous donne chaque phrase deux fois. Tout le monde qui descend cette route finit par écrire une certaine version de ce nettoyage :

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)

Commande, gestion des subprocessus, I/O de fichier, déduplication — appelez-le 40 lignes de colle avant d'avoir du texte plain.

Où yt-dlp est la bonne réponse

Où ça fait mal sur un serveur

Trois obligations de maintenance séparées apparaissent au moment où yt-dlp se déplace dans un backend :

Le chemin API

La version de point de terminaison hébergée de tout le pipeline ci-dessus :

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

Retourne du JSON — {"result": {"videoId", "title", "pubDate", "content", ...}} — déjà dédupliqué texte plain, avec des erreurs structurées (TRANSCRIPT_UNAVAILABLE quand aucun sous-titre n'existe, au lieu d'archéologie stderr). Une clé démo partagée est un appel éloigné (curl -s https://youtube2text.org/api/demo-key, 5 vidéos/mois par IP) ; le quickstart complet est dans extraire les transcriptions avec curl.

L'honnête note de bas de page

Les deux approches récupèrent les mêmes sous-titres du même endroit, et les deux doivent faire face à YouTube ne voulant pas du trafic automatisé. yt-dlp rend cela votre problème — bien sur un portable, un projet de proxy sur un serveur. Une API hébergée rend cela le problème du fournisseur : youtube2text.org route les récupérations via des proxies résidentiels rotatifs côté serveur, ce qui est précisément la pièce que vous ne pouvez pas facilement répliquer à partir d'une IP de centre de données. Vous ne payez pas pour la transcription ; vous payez pour ne pas exploiter cela.

Mon fractionnement : yt-dlp pour les archives et les one-offs sur ma propre machine, l'API pour tout ce qui fonctionne sans surveillance. Si cela correspond à votre situation, les clés sont sur youtube2text.org/app/keys — connexion Google, limite gratuite de 5/mois, payée de $5.99.