YouTube + Docker : Extraire automatiquement les transcriptions multi-langues de vidéos pour apprendre plus vite
YouTube + Docker : Extraire automatiquement les transcriptions multi-langues de vidéos pour apprendre plus vite
Quand on apprend l'informatique, on tombe sur des dizaines de vidéos YouTube chaque jour. Mais regarder chaque vidéo prend du temps, surtout quand on cherche les parties vraiment intéressantes : lignes de commandes, outils recommandés, concepts clés.
Alors j'ai eu une idée simple : extraire automatiquement la transcription complète, en plusieurs langues, avec horodatage, pour ensuite pouvoir l'analyser plus facilement. Et le tout, dans un conteneur Docker que je peux relancer à volonté.
Le concept : YouTube + Docker = Savoir structuré
Mon objectif :
- Je saisis une ou plusieurs URL YouTube (en ligne de commande ou via une interface)
- Le système télécharge les sous-titres disponibles
- Il génère une transcription structurée avec horodatage
- Il sauvegarde les fichiers JSON dans un répertoire
output/
Tech utilisée
yt-dlp
: pour récupérer les sous-titres automatiques en.vtt
webvtt-py
: pour parser les fichiers.vtt
facilementPython
: pour tout orchestrerDocker
: pour éviter d'installer quoi que ce soit localement
Le code Python
import subprocess
import os
import sys
import json
import webvtt
LANGS = ["en", "fr"]
def download_subtitles(url, lang):
filename = f"video_{lang}"
subprocess.run([
"yt-dlp",
"--write-auto-sub",
"--sub-lang", lang,
"--skip-download",
"-o", f"{filename}.%(ext)s",
url
])
return f"{filename}.{lang}.vtt"
def vtt_to_json(vtt_path, lang):
result = []
for caption in webvtt.read(vtt_path):
result.append({
"start": caption.start,
"end": caption.end,
"text": caption.text
})
with open(f"output/transcript_{lang}.json", "w", encoding="utf-8") as f:
json.dump(result, f, indent=2, ensure_ascii=False)
def main():
os.makedirs("output", exist_ok=True)
urls = sys.argv[1:]
if not urls:
print("Usage: docker run ... <url1> <url2> ...")
return
for url in urls:
print(f"Processing {url}")
for lang in LANGS:
try:
print(f" ➜ Downloading subtitles in {lang}")
vtt_file = download_subtitles(url, lang)
print(f" ➜ Converting to JSON with timestamps")
vtt_to_json(vtt_file, lang)
except Exception as e:
print(f"Failed for language {lang}: {e}")
if __name__ == "__main__":
main()
Le Dockerfile
FROM python:3.11-slim
RUN apt-get update && apt-get install -y ffmpeg curl && \
pip install yt-dlp webvtt-py
WORKDIR /app
COPY requirements.txt ./
COPY extract_subs.py ./
ENTRYPOINT ["python", "extract_subs.py"]
Le script d'exécution (run.sh)
#!/bin/bash
chmod +x run.sh
mkdir -p output
if [ "$#" -eq 0 ]; then
echo "❌ Tu dois fournir au moins une URL YouTube"
echo "👉 Exemple : ./run.sh \"https://www.youtube.com/watch?v=xxx\""
exit 1
fi
docker run --rm \
-v "$(pwd)/output:/app/output" \
transcripteur-youtube "$@"
💡 Astuce ZSH : si tu utilises ZSH, n'oublie pas de mettre l'URL entre guillemets pour éviter que les
&
ou autres caractères spéciaux ne soient interprétés par le shell. Sinon, tu peux désactiver temporairement l'expansion de glob avecsetopt NO_NOMATCH
.
Résultat attendu
À la fin de l'exécution, tu obtiens des fichiers comme :
output/
├── transcript_en.json
└── transcript_fr.json
Chaque fichier contient le texte complet, horodaté, et structuré, prêt à être utilisé pour la lecture ou l'archivage.
Pourquoi c'est utile ?
- 🔍 Recherche rapide dans une vidéo longue (ctrl+F sur le JSON)
- 🌐 Traduction multilingue
- 🧠 Lecture rapide hors ligne ou imprimée
- 📚 Constitution d'une base de savoir lisible et structurée
Prochaines étapes possibles
- Générer un fichier texte ou Markdown lisible à partir du JSON
- Ajouter d'autres langues si disponibles
- Créer une interface plus user-friendly
Conclusion
Ce petit outil m'aide déjà à aller beaucoup plus vite dans ma veille tech. Il me permet de capturer l'essentiel de vidéos longues et d'en garder une trace exploitable. Et grâce à Docker, l'installation est propre et rapide.
Si vous aussi vous voulez mieux apprendre avec YouTube, testez cette méthode !