API de subtítulos para archivos SRT y VTT traducidos

Sube un video una sola vez y obtén archivos de subtítulos en SRT y WebVTT para cada idioma de destino, sincronizados con el contenido hablado. Corrige cualquier línea a través de la API y descarga los archivos actualizados para tu reproductor, aplicación o software de edición.
SRT y WebVTT
Más de 135 idiomas y variantes regionales
REST + SDK de Python
upload, create, download
OAuth 2.0
# 1. upload the video once - YouTube, Drive, S3, Vimeo or direct URL
curl -X POST https://api.rask.ai/api/library/v1/media/link \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"link": "https://example.com/onboarding.mp4", "name": "onboarding"}'

# 2. one project per subtitle language
for lang in es-mx fr-fr ja-jp; do
  curl -X POST https://api.rask.ai/v2/projects \
    -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
    -d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"$lang\"}"
done
GET /v2/projects/{project_id}
.srt + .vtt
# When status is merging_done, download both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o onboarding.es-mx.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o onboarding.es-mx.vtt "$(echo $P | jq -r .translation_vtt_path)"
Utilizado por equipos globales
Funciones

Todo lo que la API de subtítulos ofrece

Crea archivos SRT y WebVTT traducidos a partir de grabaciones de video o audio, incluyendo podcasts y entrevistas. Elige un idioma de destino para cada proyecto y obtén los archivos de subtítulos junto con la transcripción, la traducción y el contenido doblado.

Archivos SRT y WebVTT

Cada proyecto finalizado incluye un archivo .srt y un archivo .vtt en el idioma de destino: SRT para programas de edición de video y la mayoría de las plataformas, y WebVTT para la reproducción de video en la web.

Subtítulos en otro idioma

Elimina las barreras de idioma para tu audiencia en cualquier mercado: crea un proyecto por idioma de destino, como es-mx, pt-br o fr-ca, a partir de la misma carga. El idioma original se detecta automáticamente.

Sincronizados con el contenido hablado

Cada subtítulo sigue un segmento de la transcripción con un tiempo de inicio y fin, para que cada línea aparezca en la pantalla exactamente cuando se habla.

Subtítulos en el idioma original

La transcripción contiene el texto original de cada segmento con marcas de tiempo. Conviértela en un archivo SRT o VTT para tener subtítulos en el mismo idioma con unas pocas líneas de código.

Identificación de hablantes para los diálogos

Cada segmento de la transcripción incluye una etiqueta de orador, lo que te permite identificar a las personas en los subtítulos para entrevistas, paneles y diálogos.

Edita una línea antes de publicarla

Corrige el texto o el tiempo de cualquier segmento mediante la API y vuelve a generarlo. Las palabras poco claras, los nombres y los acentos se solucionan una sola vez para todos los formatos.

Términos coherentes en todos los idiomas

Un glosario mantiene los nombres de productos y términos técnicos idénticos en todos los idiomas de subtítulos, o en el idioma original si así lo prefieres.

Subtítulos y versión doblada

El mismo proyecto también ofrece las pistas de video y audio traducidas, por lo que obtienes los subtítulos y el doblaje a partir de una sola carga.

Escala sin límites

Sin límites de frecuencia, cuotas de simultaneidad ni restricciones por clave. Subtitula toda tu biblioteca de videos en todos los idiomas de destino al mismo tiempo.
Míralo en acción

Un video, cinco versiones de idioma

El mismo clip en inglés, francés, alemán, portugués y español. Cada versión de idioma incluye sus propios archivos de subtítulos SRT y VTT.
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
Flujo de trabajo

Tres pasos desde la subida del video hasta el archivo de subtítulos

Al crear el proyecto se inicia la transcripción, la traducción y la versión doblada en un solo proceso. Usa el endpoint /generate después de editar las líneas de subtítulos.
1

Sube tu vídeo

Envía el video como archivo o publica un enlace de YouTube, Google Drive, S3, Vimeo o cualquier URL directa. Una sola subida sirve para todos los idiomas de subtítulos.

POST /api/library/v1/media/link
2

Crea el proyecto

Pasa el ID del medio como video_id y un idioma de destino por proyecto. Los proyectos para diferentes idiomas se ejecutan en paralelo.

POST /v2/projects
3

Descarga los archivos de subtítulos

Lee el estado hasta que llegue a merging_done; después, descarga los archivos .srt y .vtt y guárdalos de tu lado.

GET /v2/projects/{project_id}
El tiempo de procesamiento varía según la duración del video, la cantidad de oradores y el idioma de destino. En una prueba observada, un video de 3:47 se completó en 165 segundos.
Diseñado a tu medida

¿Necesitas un formato de subtítulos o una entrega que no aparece en la lista? Habla con nuestro equipo

Otro formato de subtítulos, entrega en tu propio almacenamiento, un idioma fuera del catálogo o mayor rendimiento: nuestro equipo revisa las necesidades de tu flujo de trabajo de producción y las opciones disponibles.

Idiomas y voces

¿Necesitas subtítulos en un idioma fuera del catálogo público? Habla con nuestro equipo sobre tus requerimientos y las opciones disponibles.

Entrega e integración

Webhooks, envío a tu propia cola, entrega directa a tu S3 y endpoints personalizados. Cuéntanos cómo quieres que funcione tu sistema.

Volumen y capacidad

Los tamaños de los lotes, los idiomas de destino por acción y la prioridad de procesamiento son términos del contrato, no límites fijos del producto.

Seguridad y alojamiento

La residencia de datos, SSO y SAML, las reglas de retención y el soporte para revisión de seguridad se gestionan como parte de la incorporación empresarial.
Casos de uso

Quién usa una API de subtítulos

Plataformas con video integrado

Plataformas de LMS y educación para clientes, plataformas de creadores y de video, herramientas de seminarios web y eventos virtuales, SaaS de alojamiento y flujos de trabajo de video, plataformas de adopción digital, compras en vivo. Convierte los subtítulos en todos los idiomas en una función de tus cargas de video.

Agencias de localización y producción

Entrega archivos SRT y VTT para el idioma de cada cliente desde una sola carga. Los revisores corrigen las líneas a través de la API y los archivos se actualizan sin que nadie tenga que volver a sincronizarlos.

Producción de video interna y continua

Retail y comercio electrónico internacional, franquicias globales, medios de comunicación, universidades corporativas. Haz que el contenido de capacitación y de videos de productos sea accesible para todos los mercado y para los espectadores que miran sin sonido.
Casos de éxito de clientes

Equipos reales, resultados cuantificables

Cómo las empresas localizan videos con Rask, según sus propios números.
flecha
flecha
Código

Ejemplos de código de la API de subtítulos

Un ejemplo completo en cada idioma: sube un video, crea un proyecto por idioma de subtítulos, espera y luego guarda los archivos .srt y .vtt o agrégalos a un reproductor HTML5.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio, urllib.request
from rask_sdk import clients, enums, schemas

LANGS = ["es-mx", "fr-fr", "ja-jp"]

async def subtitle(client, video_id, lang):
    job = await client.create_project(data=schemas.ProjectCreate(video_id=video_id, dst_lang=lang))
    while job.status is not enums.ProjectStatus.MERGING_DONE:
        await asyncio.sleep(10)
        job = await client.get_project(project_id=job.id)
    # links are presigned for one hour - save the files right away
    urllib.request.urlretrieve(job.translation_srt_path, f"video.{lang}.srt")
    urllib.request.urlretrieve(job.translation_vtt_path, f"video.{lang}.vtt")

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
    media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://example.com/onboarding.mp4"))
    while media.status is enums.MediaStatus.PROCESSING:
        await asyncio.sleep(5)
        media = await client.get_media(media_id=media.id)
    await asyncio.gather(*(subtitle(client, media.id, l) for l in LANGS))

asyncio.run(main())
github.com/braskai/rask-sdk
async, typed models
import time, requests

AUTH = "https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token"
API  = "https://api.rask.ai"
token = requests.post(AUTH, auth=(CLIENT_ID, CLIENT_SECRET),
                      data={"grant_type": "client_credentials"}).json()["access_token"]
h = {"Authorization": f"Bearer {token}"}

pid = requests.post(f"{API}/v2/projects", headers=h,
                    json={"video_id": VIDEO_ID, "dst_lang": "de-de"}).json()["id"]
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
    time.sleep(10)

# translated subtitles: download the files
open("video.de-de.vtt", "wb").write(requests.get(p["translation_vtt_path"]).content)

# original-language captions: build a WebVTT file from the transcript segments
segs = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
cues = [f"{s['start'].replace(',', '.')} --> {s['end'].replace(',', '.')}\n{s['src']['text']}" for s in segs]
open("video.en.vtt", "w").write("WEBVTT\n\n" + "\n\n".join(cues) + "\n")
requests + polling
same-language captions
// no dependencies, Node 18+ global fetch
import { writeFile } from 'node:fs/promises';
const API = 'https://api.rask.ai';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const auth = await fetch('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token', {
  method: 'POST',
  headers: { Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`) },
  body: new URLSearchParams({ grant_type: 'client_credentials' }),
}).then((r) => r.json());
const h = { Authorization: `Bearer ${auth.access_token}`, 'Content-Type': 'application/json' };
const call = (method, path, body) => fetch(API + path, { method, headers: h, body: body && JSON.stringify(body) }).then((r) => r.json());

const langs = ['es-mx', 'pt-br', 'ko-kr'];
const tracks = await Promise.all(langs.map(async (dst_lang) => {
  let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang });
  while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
  const file = `subs/${dst_lang}.vtt`;
  await writeFile(file, await ((await fetch(p.translation_vtt_path)).text()));
  return `<track kind="subtitles" srclang="${dst_lang}" src="/${file}">`;
}));
console.log(tracks.join('\n'));   // paste inside your <video> element
fetch, Node 18+
HTML5 track elements
# 1. token (valid 1 hour - cache and reuse it)
TOKEN=$(curl -s -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
  -u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials" | jq -r .access_token)

# 2. create the project for one subtitle language
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"it-it\"}" | jq -r .id)

# 3. wait for merging_done
until [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" = merging_done ]; do
  sleep 10
done

# 4. save both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o video.it-it.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o video.it-it.vtt "$(echo $P | jq -r .translation_vtt_path)"
download .srt and .vtt
shell script
<?php
use GuzzleHttp\Client;

$http = new Client(['base_uri' => 'https://api.rask.ai']);
$json = fn($r) => json_decode($r->getBody(), true);
$auth = $json((new Client)->post('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
    ['auth' => [$clientId, $clientSecret], 'form_params' => ['grant_type' => 'client_credentials']]));
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];

foreach (['es-mx', 'tr-tr'] as $lang) {
    $p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
        'video_id' => $videoId, 'dst_lang' => $lang]]));
    while ($p['status'] !== 'merging_done') {
        sleep(10);
        $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
    }
    // presigned links, valid for one hour
    file_put_contents("video.$lang.srt", file_get_contents($p['translation_srt_path']));
    file_put_contents("video.$lang.vtt", file_get_contents($p['translation_vtt_path']));
}
Guzzle 7
plain HTTP
Python es el SDK oficial. Las pestañas de Node, PHP y cURL son ejemplos simples de HTTP que usan los mismos puntos de conexión.
Progreso

Cómo reporta el progreso un proyecto de subtítulos

Cada proyecto pasa por estados documentados para que los usuarios que suban videos en tu aplicación puedan seguir el progreso de cada idioma de subtítulos. Solo necesitas actuar en tres grupos.

Éxito, detente aquí

merging_done
Los archivos de subtítulos están listos. Vuelve a consultar el proyecto para obtener enlaces de descarga nuevos.

En progreso, continúa consultando

created
uploading
transcription_started
separate_background_started
determine_speakers_started
translation_started
voiceover_started
merging_started
Más la coincidencia _done estados. Estos se adaptan perfectamente a una interfaz de progreso por etapas.

Error, detener y reportar

failed
upload_failed
transcription_failed
translation_failed
voiceover_failed
merging_failed
no_audio
no_words
forbidden_link
no_audio, no_words y forbidden_link son lo suficientemente específicos como para mostrarlos directamente a tus propios usuarios.
Observed run, 3:47 source video, en → es-mx
GET /v2/projects/{project_id}
   0s  created
  11s  transcription_started
  87s  translation_started
  99s  voiceover_started
 154s  merging_started
 165s  merging_done

O puedes omitir el sondeo por completo

Indícanos un punto de enlace de webhook y cada cambio de estado llegará como una petición POST, para que tu fila de tareas reaccione a cada cambio en el momento en que ocurre. La entrega por webhook forma parte de la incorporación empresarial.
Leer la documentación
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
Salida

Primero los archivos de subtítulos, todo lo demás al mismo tiempo

Cada proyecto finalizado muestra ambos formatos de subtítulos, los segmentos de transcripción detrás de ellos y el contenido doblado. Los enlaces de descarga están firmados previamente y son válidos por una hora, así que copia los archivos a tu propio almacenamiento.
Campo
Formato
Qué es
translation_srt_path
.srt
Subtítulos en el idioma de destino, para software de edición y la mayoría de las plataformas de video
translation_vtt_path
.vtt
Subtítulos WebVTT para reproducción de video HTML5 y reproductores web
/transcription
JSON
Texto original, traducción, etiqueta de orador y marcas de tiempo para cada segmento
translated_video
MP4
El video doblado, si también publicas una versión con voz
translated_audio
WAV
Voz traducida mezclada con la música y los efectos de sonido originales
original_video
MP4
Tu archivo de origen tal como se guardó, para referencia
Control

Corrige una línea de subtítulos y regenera solo esa parte

Los subtítulos provienen de los segmentos de la transcripción. Edita el texto o el tiempo de una línea, regenera y los archivos de subtítulos y la versión doblada se actualizarán al mismo tiempo. La facturación cubre los segmentos modificados, con un mínimo de un minuto por ejecución.

Edición a nivel de segmento

Edición a nivel de segmento
Cada proyecto expone su transcripción como segmentos direccionables, por lo que una palabra incorrecta o un subtítulo retrasado se solucionan con una solicitud de parche.
Obtén la transcripción y sus segmentos
Actualiza el texto original y nosotros nos encargaremos de traducirlo de nuevo
Modifica el texto traducido directamente para conservar tus propias palabras
Ajusta las marcas de tiempo, agrega segmentos o elimina segmentos
Reasigna la voz asignada a cualquier hablante

Glosarios para terminología

Glosarios para terminología
Adjunta un glosario para que los nombres de marca y los términos técnicos se lean igual en los subtítulos de todos los idiomas, o se mantengan en el idioma original a propósito.

Un glosario cubre un par de idiomas y se aplica a todas las variantes regionales de ese idioma de destino, por lo que un solo glosario en español funciona es-mx y es-es por igual. El registro del proyecto glossary_version, para que las modificaciones posteriores nunca alteren en silencio el trabajo ya terminado.
Entrada

Formatos de archivo compatibles

Sube un video o una grabación de audio compatible, o usa una URL de medios compatible. Crea un proyecto para cada idioma de destino y descarga sus archivos SRT y WebVTT.

Vídeo

7 formatos
.mp4
.mov
.mkv
.avi
.webm
.m4v
.3gp

Audio

4 formatos
.mp3
.wav
.flac
.m4a

Metadatos antes de gastar

El punto final multimedia devuelve la duración, el tamaño del archivo, el códec de vídeo, la frecuencia de fotogramas, la resolución, el códec de audio, la frecuencia de muestreo y la configuración de canales. Comprueba la validez del archivo y calcula el coste por adelantado, ya que los proyectos se facturan por minuto de vídeo.
Seguridad y cumplimiento normativo

Seguridad y cumplimiento normativo para tu contenido de vídeo

Brask Inc cuenta con la certificación SOC 2 Tipo II, opera conforme al RGPD y publica el estado de los controles en tiempo real en su Centro de confianza para que puedas comprobar la seguridad.

Certificaciones

SOC 2 Type II
GDPR
Miembro de CAI y C2PA

Cifrado

TLS 1.2 en tránsito
AES-256 en reposo
Llaves administradas SSE-S3
Rotación de llaves al menos cada 12 meses

Tu contenido

Entorno de IA cerrado
Nunca se usa para entrenar modelos generales
Exportación completa, sin ataduras

Acceda a

SSO y SAML
Control de acceso basado en roles
Credenciales de cliente OAuth 2.0

Empresas

Opciones de residencia de datos
SLA personalizados
Gerente de cuenta dedicado

Derechos de voz

Voces sintéticas con derechos de uso
Clonación de voz basada en consentimiento
Controles de seguridad de IA, humano en el circuito
Comparación

La API de Rask frente a un proceso de subtitulado creado por uno mismo

Los subtítulos en otro idioma requieren transcripción, traducción, sincronización y exportación del archivo. Aquí tienes el mismo resultado, montado de dos formas diferentes.
Lo que necesitas
Rask API
Armado por partes
Transcripción con marcas de tiempo
Incluido
Una API de conversión de voz a texto
Subtítulos en otro idioma
Más de 135 idiomas y variantes regionales
Una API de traducción y reajuste de la sincronización
Exportación a SRT y WebVTT
Ambos formatos en cada proyecto
Tu propio generador de archivos
Terminología coherente
Glosarios
Posprocesamiento personalizado
Corregir una línea
Una solicitud de parche y, a continuación, volver a generar
Edita cada archivo a mano
Una versión doblada del mismo video
Incluido en el mismo proyecto
Un proveedor de TTS más tu propia mezcla
Límites de velocidad
Ninguno
Lo que tus proveedores establezcan
Subtítulos incrustados en el video
En la aplicación web de Rask, aún no en la API
Tu propio procesamiento de video
Tipografía, tamaño y diseño
Configurado en tu reproductor de video
Configurado en tu reproductor de video
PREGUNTAS FRECUENTES

API de subtítulos: preguntas frecuentes

¿No encuentras lo que buscas? Ponte en contacto con el departamento de ventas.

¿Rask tiene una API de subtítulos?

¿Qué formatos de subtítulos devuelve la API?

¿Puedo obtener subtítulos en el idioma original?

¿Qué idiomas están disponibles?

¿Puede la API incrustar subtítulos en el video?

¿Puedo cambiar la tipografía, el tamaño o el diseño de los subtítulos?

¿Los subtítulos describen la música y los efectos de sonido?

¿Se identifican los hablantes?

¿Cómo corrijo una línea de subtítulos?

¿Cuánto tiempo son válidos los enlaces de descarga?

¿Puedo usar mis propios subtítulos?

¿Cómo se cobra la API de subtítulos?

¿Cómo obtengo acceso a la API y una clave de API?

Empieza a hacer doblaje en una tarde

Haz tu primera solicitud hoy y contáctanos cuando necesites términos para grandes volúmenes o un idioma que nadie más tenga.