Les transcriptions YouTube sont une source précieuse pour les modèles de résumé, les pipelines RAG, l'analyse de contenu et les outils d'accessibilité. L'API officielle de YouTube n'expose pas directement les transcriptions — les développeurs doivent généralement recourir à l'analyse des sous-titres générés automatiquement via des endpoints internes, qui cessent de fonctionner sans préavis. L'endpoint de transcription de Scavio accepte un video_id et renvoie la transcription complète avec horodatages au format JSON structuré. Ce tutoriel montre comment appeler l'endpoint, gérer la réponse et reconstituer le texte pour un traitement en aval.
Prérequis
- Python 3.8 ou version ultérieure installé
- bibliothèque requests installée
- Une clé API Scavio
- Un ID de vidéo YouTube pour tester (par exemple dQw4w9WgXcQ)
Parcours
Étape 1: Identifier l'ID de la vidéo
L'ID de la vidéo est la chaîne de 11 caractères après v= dans une URL YouTube. Pour https://youtube.com/watch?v=dQw4w9WgXcQ, l'ID est dQw4w9WgXcQ.
from urllib.parse import urlparse, parse_qs
def extract_video_id(url: str) -> str:
parsed = urlparse(url)
return parse_qs(parsed.query).get("v", [url])[0]Étape 2: Appeler l'endpoint de transcription
Envoyer une requête POST à l'endpoint Scavio avec platform=youtube, action=transcript et le video_id.
import requests
response = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "youtube", "action": "transcript", "video_id": "dQw4w9WgXcQ"}
)
data = response.json()Étape 3: Reconstituer le texte de la transcription
La clé transcript contient une liste de segments avec start, duration et text. Joignez-les pour obtenir un document en texte brut.
segments = data.get("transcript", [])
full_text = " ".join(seg["text"] for seg in segments)
print(full_text[:500])Étape 4: Enregistrer dans un fichier pour une utilisation en aval
Écrire la transcription sur le disque afin qu'elle puisse être ingérée par un vector store ou un modèle de résumé.
with open("transcript.txt", "w", encoding="utf-8") as f:
f.write(full_text)
print(f"Saved {len(segments)} segments, {len(full_text)} characters")Exemple Python
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def get_transcript(video_id: str) -> list[dict]:
response = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"platform": "youtube", "action": "transcript", "video_id": video_id}
)
response.raise_for_status()
return response.json().get("transcript", [])
def segments_to_text(segments: list[dict]) -> str:
return " ".join(seg["text"] for seg in segments)
def main():
video_id = "dQw4w9WgXcQ"
segments = get_transcript(video_id)
text = segments_to_text(segments)
print(f"Transcript: {len(segments)} segments, {len(text)} chars")
print(text[:300])
if __name__ == "__main__":
main()Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
async function getTranscript(videoId) {
const response = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "youtube", action: "transcript", video_id: videoId })
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
return data.transcript || [];
}
function segmentsToText(segments) {
return segments.map(s => s.text).join(" ");
}
async function main() {
const segments = await getTranscript("dQw4w9WgXcQ");
const text = segmentsToText(segments);
console.log(`${segments.length} segments, ${text.length} chars`);
console.log(text.slice(0, 300));
}
main().catch(console.error);Sortie attendue
{
"video_id": "dQw4w9WgXcQ",
"language": "en",
"transcript": [
{ "start": 0.0, "duration": 3.2, "text": "We're no strangers to love" },
{ "start": 3.2, "duration": 2.8, "text": "You know the rules and so do I" },
{ "start": 6.0, "duration": 3.5, "text": "A full commitment's what I'm thinking of" }
]
}