Le problème résolu
Les grandes vidéothèques sont en pratique impossibles à fouiller. Les fans parcourent des heures de vidéo pour retrouver un moment dont ils se souviennent vaguement, les étudiants revoient des cours entiers pour une seule explication, et les entreprises perdent un savoir enfoui dans des conférences enregistrées. Indexer les transcriptions horodatées rend chaque vidéothèque consultable comme un document, avec des résultats qui mènent directement au bon moment.
Ce que doit inclure votre première version
- Recherche par expression et mot-clé dans toutes les vidéos d'une chaîne ou d'une playlist
- Des résultats qui affichent la phrase correspondante avec un lien vers l'horodatage exact
- Une recherche sémantique pour que « comment fixer le prix de mon produit » trouve aussi « définir ses tarifs »
- Des filtres par date, par vidéo et par intervenant
- Indexation automatique des nouvelles vidéos
Comment le construire, étape par étape
- 01
Récupérer la liste des vidéos
Appelez /channels/resolve ou /playlists/resolve avec le handle de la chaîne ou l'URL de la playlist pour obtenir l'identifiant et le titre de chaque vidéo.
- 02
Récupérer les transcriptions en masse
Envoyez les identifiants à /batch avec format.timestamp et format.paragraphs activés. Les gros lots s'exécutent de façon asynchrone : interrogez /batch/{batch_id} ou utilisez un webhook.
- 03
Indexer les segments
Stockez chaque paragraphe avec l'identifiant de la vidéo et l'heure de début. La recherche plein texte de Postgres suffit pour les mots-clés ; ajoutez des embeddings dans pgvector ou une base vectorielle pour une recherche par le sens.
- 04
Créer l'interface de recherche
Renvoyez les meilleurs résultats avec le texte environnant et un lien de la forme youtube.com/watch?v=ID&t=SECONDES pour que l'utilisateur arrive au moment exact.
- 05
Garder l'index à jour
Lancez une tâche planifiée qui résout à nouveau la chaîne, repère les nouveaux identifiants de vidéos et ne transcrit que ceux-là.
Code de démarrage
Cette idée repose sur le modèle « Recette 3 : charger une playlist en masse dans une base de connaissances ». Remplacez par vos propres chaînes, prompts et stockage.
import requests
API = "https://www.youtubetranscript.dev/api/v2"
HEADERS = {"Authorization": "Bearer yt_sk_live_YOUR_KEY"}
playlist = requests.post(f"{API}/playlists/resolve", headers=HEADERS,
json={"playlist_url": "https://www.youtube.com/playlist?list=PLAYLIST_ID",
"limit": 100}).json()
ids = [v["video_id"] for v in playlist["items"]]
batch = requests.post(f"{API}/batch", headers=HEADERS, json={
"video_ids": ids,
"format": {"timestamp": True, "paragraphs": True},
}).json()
# Large batches run async: poll GET /batch/{batch_id} until status is "completed"
for r in batch.get("results", []):
if r["status"] == "completed":
for p in r["data"]["transcript"].get("paragraphs") or []:
store(video_id=r["video_id"], start=p["start"], text=p["text"]) # your vector DBPourquoi ça vaut la peine de le construire
Vendez-le au propriétaire de la vidéothèque plutôt qu'au spectateur : réseaux de podcasts, plateformes de formation et entreprises dotées d'archives vidéo internes paieront un abonnement mensuel pour une recherche qui fidélise leur audience. Pour les communautés de fans, une recherche publique gratuite avec une offre payante pour les alertes ou l'accès API fonctionne aussi.
Erreurs à éviter
- Indexer chaque transcription comme un seul document : sans horodatage au niveau du paragraphe, les résultats deviennent inutiles.
- Retranscrire toute la chaîne à chaque mise à jour au lieu de suivre les identifiants de vidéos déjà traités.
- Se limiter à la correspondance exacte des mots-clés : la langue parlée est désordonnée, ajoutez tôt la recherche sémantique.
Questions sur cette idée
Faut-il une base de données vectorielle pour rechercher dans les transcriptions YouTube ?
Non. La recherche plein texte de Postgres gère très bien les mots-clés pour la plupart des vidéothèques. Ajoutez des embeddings si vous voulez des résultats qui correspondent au sens plutôt qu'aux mots exacts.
Comment lier un résultat de recherche au moment exact de la vidéo ?
Chaque segment de transcription inclut une heure de début en secondes. Ajoutez &t= suivi de ce nombre à l'URL YouTube.
Peut-on indexer des vidéos sans sous-titres ?
Oui. Activez allow_asr avec une URL de webhook et l'API transcrit l'audio par reconnaissance vocale IA quand les sous-titres sont absents.