Las transcripciones de YouTube son aportes valiosos para modelos de resumen, canales RAG, análisis de contenido y herramientas de accesibilidad. La API de datos oficial de YouTube no expone las transcripciones directamente; los desarrolladores suelen recurrir al análisis de subtítulos generados automáticamente desde puntos finales internos, que se rompen sin previo aviso. El punto final de transcripción de Scavio acepta un video_id y devuelve la transcripción completa con marca de tiempo como JSON estructurado. Este tutorial muestra cómo llamar al punto final, manejar la respuesta y volver a ensamblar el texto para el procesamiento posterior.
Requisitos previos
- Python 3.8 o superior instalado
- solicita biblioteca instalada
- Una clave API de Scavio
- Una identificación de video de YouTube para probar (por ejemplo, dQw4w9WgXcQ)
Guia paso a paso
Paso 1: Identificar el ID del vídeo
La identificación del video es la cadena de 11 caracteres después de v= en una URL de YouTube. Para https://youtube.com/watch?v=dQw4w9WgXcQ el ID es 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]Paso 2: Llame al punto final de la transcripción
PUBLICAR en el punto final de Scavio con la plataforma youtube, la transcripción de la acción y el 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()Paso 3: Reensamblar el texto de la transcripción
La clave de transcripción contiene una lista de segmentos con inicio, duración y texto. Únase a ellos para producir un documento de texto sin formato.
segments = data.get("transcript", [])
full_text = " ".join(seg["text"] for seg in segments)
print(full_text[:500])Paso 4: Guardar en un archivo para uso posterior
Escriba la transcripción en el disco para que pueda ser ingerida por un almacén de vectores o un modelo de resumen.
with open("transcript.txt", "w", encoding="utf-8") as f:
f.write(full_text)
print(f"Saved {len(segments)} segments, {len(full_text)} characters")Ejemplo en 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()Ejemplo en 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);Salida esperada
{
"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" }
]
}