# 1. upload an audio or video file by link
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/interview.mp3", "name": "interview"}'
# 2. create the project - speech recognition starts automatically
# src_lang is optional: leave it out and the language is detected
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$MEDIA_ID\", \"dst_lang\": \"es-mx\"}"# Read the transcript: one object per segment
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq '.segments[] | {speaker, start, end, text: .src.text}'



Envía un archivo de audio o video como datos de formulario multiparte, o publica un enlace de YouTube, Google Drive, S3, Vimeo o cualquier URL directa. Obtendrás un ID de contenido multimedia y los metadatos del archivo antes de gastar algo.
Pasa el ID de contenido multimedia como video_id y un idioma de destino. Agrega el idioma de origen o el número de hablantes si los conoces. El reconocimiento comienza de inmediato.
Lee la transcripción tan pronto como sus segmentos estén disponibles, mientras el contenido multimedia traducido sigue procesándose. Descarga los archivos de subtítulos y multimedia cuando el proyecto esté completo.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
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/interview.mp3"))
while media.status is enums.MediaStatus.PROCESSING:
await asyncio.sleep(5)
media = await client.get_media(media_id=media.id)
# src_lang omitted: the source language is detected automatically
job = await client.create_project(data=schemas.ProjectCreate(video_id=media.id, dst_lang="es-mx"))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
transcript = await client.get_project_transcription(project_id=job.id)
for seg in transcript.segments:
print(seg.start, seg.end, seg.speaker, seg.src.text)
asyncio.run(main())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}"}
with open("interview.mp3", "rb") as f:
media = requests.post(f"{API}/api/library/v1/media", headers=h,
params={"kind": "audio"}, files={"data": f}).json()
while media["status"] == "processing":
time.sleep(5)
media = requests.get(f"{API}/api/library/v1/media/{media['id']}", headers=h).json()
pid = requests.post(f"{API}/v2/projects", headers=h, json={
"video_id": media["id"], "dst_lang": "es-mx", "num_speakers": 2}).json()["id"]
while requests.get(f"{API}/v2/projects/{pid}", headers=h).json()["status"] != "merging_done":
time.sleep(10)
# write the source transcript as an .srt file
segments = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
with open("interview_en.srt", "w") as out:
for i, s in enumerate(segments, 1):
out.write(f"{i}\n{s['start']} --> {s['end']}\n{s['speaker']}: {s['src']['text']}\n\n")// no dependencies, Node 18+ global fetch
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());
let media = await call('POST', '/api/library/v1/media/link', { link: 'https://example.com/webinar.mp4' });
while (media.status === 'processing') { await sleep(5000); media = await call('GET', `/api/library/v1/media/${media.id}`); }
let p = await call('POST', '/v2/projects', { video_id: media.id, src_lang: 'en', dst_lang: 'de-de' });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const { segments } = await call('GET', `/v2/projects/${p.id}/transcription`);
segments.forEach((s) => console.log(`[${s.start}] ${s.speaker}: ${s.src.text}`));
console.log(p.translation_vtt_path); // German subtitles for your player# 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. upload a local audio file
MEDIA_ID=$(curl -s -X POST "https://api.rask.ai/api/library/v1/media?kind=audio" \
-H "Authorization: Bearer $TOKEN" -F "data=@podcast_episode.mp3" | jq -r .id)
# 3. create the project once the media status is ready
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$MEDIA_ID\", \"dst_lang\": \"fr-fr\"}" | jq -r .id)
# 4. when status is merging_done, read the transcript with speaker labels
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq -r '.segments[] | "\(.start) \(.speaker): \(.src.text)"'<?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']];
$media = $json($http->post('/api/library/v1/media/link', ['headers' => $h, 'json' => [
'link' => 'https://example.com/interview.mp3']]));
while ($media['status'] === 'processing') {
sleep(5);
$media = $json($http->get("/api/library/v1/media/{$media['id']}", ['headers' => $h]));
}
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $media['id'], 'dst_lang' => 'es-mx']]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
$t = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
foreach ($t['segments'] as $s) {
echo $s['start'], ' ', $s['speaker'], ': ', $s['src']['text'], PHP_EOL;
}{"segments": [
{"speaker": "SPEAKER_00", "start": "00:00:00,320", "end": "00:00:07,316", "status": "done",
"src": {"text": "Thanks for joining us. Let's start with the new release.", "lang": "en"},
"dst": {"text": "Gracias por acompañarnos. Empecemos con la nueva versión.", "lang": "es-mx"}},
{"speaker": "SPEAKER_01", "start": "00:00:07,640", "end": "00:00:11,900", "status": "done",
"src": {"text": "Sure. The biggest change is the reporting view.", "lang": "en"},
"dst": {"text": "Claro. El cambio más grande es la vista de reportes.", "lang": "es-mx"}}
]}

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.Sí. El reconocimiento de voz es la primera etapa de cada proyecto en Rask. Sube audio o video, crea un proyecto y lee la transcripción en segmentos con etiquetas de orador y marcas de tiempo desde GET /v2/projects/{id}/transcription. El mismo proyecto traduce la transcripción y ofrece subtítulos y audio doblado.
La API acepta 75 idiomas de origen. Deja src_lang vacío y el idioma se detectará de forma automática, o ingresa un código de dos letras como en o de. La transcripción se puede traducir a más de 135 opciones de idiomas y regiones.
Sí. Sube archivos de audio en formato MP3, WAV, FLAC o M4A, como podcasts, entrevistas y llamadas grabadas, y el proyecto los transcribirá igual que un video.
Sí. Los diferentes oradores se detectan automáticamente y cada segmento incluye una etiqueta de orador con el formato SPEAKER_XX. Ingresa num_speakers si conoces la cantidad y corrige el orador de cualquier segmento a través de la API.
No. Las marcas de tiempo son por segmento: cada segmento tiene un tiempo de inicio y fin en formato HH:MM:SS,mmm. Ese es el tiempo que utilizan los subtítulos y los textos en pantalla. Si necesitas una marca de tiempo para cada palabra, elige una API de voz a texto especializada.
No. Rask transcribe audio y video completos ya grabados. Para subtítulos en tiempo real, agentes de voz, IA conversacional y centros de contacto, donde el texto debe aparecer mientras la persona sigue hablando, una API de streaming de voz a texto es la mejor opción.
La precisión depende del audio: los micrófonos, los acentos, las voces encimadas y el ruido de fondo influyen. Pon a prueba la API con una muestra de tus propias grabaciones y corrige cualquier segmento mediante la API antes de publicarlo o traducirlo.
El reconocimiento no incluye una lista de vocabulario personalizado. Corrige palabras específicas en la transcripción a través del endpoint de segmentos. Al traducir la transcripción, un glosario ayuda a mantener la coherencia en nombres de productos, nombres propios y términos especializados.
El proyecto finalizado incluye archivos de subtítulos en formato SRT y VTT en el idioma de destino. La transcripción en el idioma de origen se entrega como segmentos JSON con tiempos de inicio y fin, los cuales se pueden convertir a SRT con unas cuantas líneas de código.
Sí. En los planes con importación de transcripciones, puedes incluir una transcripción de origen existente, una traducción aprobada al idioma de destino o ambas como archivos SRT o segmentos de texto con marca de tiempo al crear el proyecto. Rask puede traducir tu guion original o usar tu traducción aprobada para el doblaje.
Los proyectos se cobran por minuto de audio o video, redondeando hacia arriba al siguiente minuto completo, utilizando la misma bolsa de minutos de la aplicación de Rask. El precio incluye transcripción, traducción, locución y subtítulos. Los minutos adicionales cuestan $3 por minuto en los planes estándar elegibles. Los precios para empresas se adaptan a tu acuerdo. Si solo necesitas una transcripción, una API dedicada de voz a texto cuesta menos.
Comienza con una prueba gratuita en la aplicación de Rask, sin necesidad de tarjeta, para probar la transcripción y la traducción con tus propios archivos. El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, y sus funciones dependen del plan que elijas.
El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, con funciones definidas según tu plan. Puedes generar tu ID de cliente y tu clave secreta en la app y empezar a hacer llamadas de inmediato. Las condiciones para empresas, los precios por volumen y la cobertura de idiomas personalizados se gestionan a través de nuestro equipo.