Subtítulos VTT
La etiqueta de video de HTML5 fue diseñada esperando un formato de subtítulos específico, y no es .srt: es WebVTT. Este endpoint transcribe una pista de audio y devuelve un archivo .vtt formateado según el estándar web, listo para referenciarse desde una etiqueta track sin ningún paso de conversión intermedio.
Ejecútela online
Ejecute esto en nuestros servidores con su cuenta. Las herramientas gratuitas corren en su navegador; esta cobra de su saldo del KIT según el precio de arriba.
Por qué la web necesitó su propio formato de subtítulos
Cuando los navegadores incorporaron reproducción nativa de video, necesitaban un formato de subtítulos diseñado para la web y no heredado de los extractores de DVD de escritorio: uno con estructura basada en texto, espacio para señales de estilo y posición, y una especificación mantenida junto con el propio HTML. WebVTT se construyó exactamente para ese papel, y es el formato que el elemento track espera por defecto cuando una página quiere subtítulos en un video HTML5 sin plugin ni reproductor externo.
Qué produce el endpoint
Envía un archivo de audio por POST a /audio/subtitles-vtt y la tarea transcribe el habla, la divide en líneas de subtítulo legibles según pausas naturales, y escribe el resultado como un archivo WebVTT válido: el encabezado WEBVTT, marcas de tiempo con el formato correcto y el texto de cada cue en la estructura que exige la especificación. Es un archivo listo para colocarse junto a un video y enlazarse directamente, no texto en bruto que haya que formatear a mano.
Dónde encaja el VTT frente a otros formatos
Un reproductor nativo de video HTML5 lee un archivo .vtt directamente a través de un elemento track sin código adicional; el .srt sigue dominando en editores de escritorio y muchos flujos de carga construidos alrededor de él. Como ambos formatos describen la misma información subyacente —líneas de subtítulo con tiempo—, la mayoría de proyectos que necesitan ambos simplemente generan un .srt para edición y entrega, y un .vtt específicamente para el reproductor web; el endpoint hermano de este se encarga del lado .srt.
Cómo se sincronizan los subtítulos
Cada línea de subtítulo se sincroniza contra la pista de audio real en lugar de cortarse a intervalos arbitrarios, así que el texto aparece y desaparece al ritmo del habla en vez de ir con retraso o interrumpirse a mitad de oración. Las grabaciones largas se trocean automáticamente durante el procesamiento, y el tiempo se mantiene consistente en los límites entre fragmentos, así que un subtítulo cerca de una unión sigue cayendo correctamente en el archivo final.
Precio y manejo de fallos
El costo es una tarifa base pequeña por solicitud más una tarifa por minuto según la duración del audio, la misma estructura transparente que el trabajo de transcripción simple. La tarea corre de forma asíncrona: envía el audio, recibe un task_id de inmediato, y obtiene el archivo .vtt por webhook firmado o un enlace firmado válido por 24 horas; si la generación falla, reintenta automáticamente hasta tres veces y nunca se cobra si sigue sin completarse.
Qué puede hacer con ella
Subtítulos nativos en video HTML5
Un editor de contenido incrusta una etiqueta video con un elemento track que apunta al .vtt generado, logrando subtítulos nativos sin ninguna librería de reproductor externa.
Cumplimiento de accesibilidad en video de apps web
Un producto SaaS añade subtítulos WebVTT a sus videos tutoriales dentro de la app para cumplir requisitos de accesibilidad en su reproductor embebido.
Flujo de subtitulado en plataformas de streaming
Una plataforma de video genera archivos .vtt automáticamente como parte de su flujo de carga, así todo video nuevo sale con subtítulos por defecto.
Pistas de subtítulos multilingües
Un sitio de cursos genera una pista .vtt base, traduce el texto y ofrece varias pistas de subtítulos .vtt sobre el mismo video HTML5.
Preguntas frecuentes
¿Cómo genero un archivo .vtt a partir de audio con esta API?
Envía un archivo de audio por POST a /audio/subtitles-vtt y la tarea devuelve un archivo WebVTT conforme al estándar, por webhook o enlace firmado, listo para referenciarse desde un elemento track de HTML5.
¿Cuál es la diferencia entre VTT y SRT aquí?
Ambos llevan texto de subtítulo con tiempo, pero WebVTT es el formato que espera de forma nativa el video HTML5; el endpoint hermano de subtítulos SRT produce la versión .srt para editores y plataformas que esperan ese formato.
¿La API para generar subtítulos VTT es gratuita?
No hay capa gratuita: las capas gratis se abusan y ralentizan a todos. El acceso funciona con un saldo prepago de ForHosting KIT: se recarga desde $10.00 (no caduca) y cada solicitud se cobra a su precio publicado, así que una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens ni créditos inventados, y una tarea fallida no se cobra.
¿El resultado funciona directamente con la etiqueta track de HTML5?
Sí, el archivo sigue exactamente la especificación WebVTT, así que puede referenciarse directamente desde el atributo src de un elemento track sin necesidad de reformatearlo.
¿Puedo generar subtítulos para muchos videos a la vez?
Sí, cada archivo de audio se envía como una solicitud asíncrona independiente, así que se puede encolar un lote junto y recolectar cada archivo .vtt por webhook conforme termina.
¿Qué tan precisa es la sincronización de los subtítulos?
Cada línea se sincroniza contra el audio real y se corta en pausas naturales del habla, así el texto sigue lo que se dice en vez de desfasarse o cortarse a mitad de oración.
¿Qué idiomas admite?
Aplica la misma amplia cobertura de idiomas que la transcripción estándar, con detección automática de idioma o configuración explícita.
¿Qué pasa si falla la generación de subtítulos?
La tarea reintenta automáticamente hasta tres veces antes de devolver un error claro, y una solicitud fallida nunca se cobra.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/audio/subtitles-vtt \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"audio":"https://ejemplo.com/audio.mp3"}'const res = await fetch("https://api.kit.forhosting.com/audio/subtitles-vtt", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"audio": "https://ejemplo.com/audio.mp3"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/subtitles-vtt",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"audio": "https://ejemplo.com/audio.mp3"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/subtitles-vtt", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"audio":"https://ejemplo.com/audio.mp3"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"audio":"https://ejemplo.com/audio.mp3"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/subtitles-vtt", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"audio": "https://ejemplo.com/audio.mp3"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.subtitles_vtt",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_mb | 200 |
max_minutes | 180 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
422 | task_failed | La tarea falló tras 3 reintentos. No se cobra. |