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

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
- Archivage offline en masse. Pointez-le vers une URL de canal et il marche chaque vidéo, sous-titres inclus, reprise possible et gratuit. Pour construire une archive personnelle sur votre connexion d'accueil, rien ne la bat.
- Vous voulez les fichiers de sous-titre eux-mêmes. Si srt/vtt avec timing est le livrable — alimenter un éditeur vidéo, préserver le timing exact des indices — yt-dlp vous donne l'artefact brut.
- Vous téléchargez de toute façon le média. Déjà tirer l'audio pour la transcription Whisper ? Ajouter
--write-auto-subest un drapeau. - Zéro budget, échelle personnelle. Sur une IP résidentielle à des vitesses humaines, ça marche simplement.
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 :
- La bande roulante binaire. YouTube change constamment ses internes, et yt-dlp expédie les correctifs constamment — c'est une fonctionnalité, mais cela signifie que votre dépendance de production doit des mises à jour fréquentes ou l'extraction commence à échouer.
- Blocage d'IP. À partir des adresses AWS/GCP/Heroku, attendez-vous à des erreurs "Connectez-vous pour confirmer que vous n'êtes pas un bot". C'est le même mur qui bloque youtube-transcript-api dans le cloud — changer d'outils ne change pas votre réputation d'IP.
- Le code de colle. Gestion des subprocessus, fichiers temporaires, le nettoyage vtt ci-dessus, pistes non-anglaises, détection de caption-manquante via codes de sortie et analyse stderr.
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.