# 1. on a dubbed project: confirm the video has a face (runs once, usually automatically)
curl https://api.rask.ai/v2/projects/$ID/lipsync \
-H "Authorization: Bearer $TOKEN"
# "check_face_task_status": "done", "video_has_face": true
# 2. preview one free minute of lip-sync
curl -X PUT https://api.rask.ai/v2/projects/$ID/lipsync \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"is_multiple_speakers": true, "is_free_lipsync": true}'
# 3. lip-sync the full video - billed separately from dubbing
curl -X PUT https://api.rask.ai/v2/projects/$ID/lipsync \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"is_multiple_speakers": true, "is_free_lipsync": false}'# Poll until lipsync_task_status is done, then download lipsync_result_path
while :; do
curl -s https://api.rask.ai/v2/projects/$ID/lipsync -H "Authorization: Bearer $TOKEN" \
| jq '{lipsync_task_status, lipsync_task_progress, tasks_in_lipsync_queue}'
sleep 15
done



Sube el video original o envía una URL pública, crea un proyecto con un idioma de destino y espera a que aparezca merging_done. La sincronización labial necesita el translated_video de este proyecto.
La tarea de verificación de rostros confirma que hay al menos un rostro en el video. Por lo general, comienza de manera automática. Si no ha empezado, ejecútala tú mismo una vez para el proyecto.
Ejecuta la tarea de sincronización labial, sigue el progreso con lipsync_task_progress de 0 a 100 y luego descarga el video desde lipsync_result_path.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
PROJECT_ID = "..." # a project with status merging_done
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
info = await client.get_lipsync_info(project_id=PROJECT_ID)
if info.check_face_task_status is not enums.LipsyncStatus.DONE:
await client.run_check_face_task(project_id=PROJECT_ID)
while (info := await client.get_lipsync_info(project_id=PROJECT_ID)).check_face_task_status is not enums.LipsyncStatus.DONE:
await asyncio.sleep(10)
if not info.video_has_face:
raise SystemExit("No face found - lip-sync is not available for this video")
await client.run_lipsync_task(project_id=PROJECT_ID,
data=schemas.LipsyncTaskData(is_multiple_speakers=True, is_free_lipsync=False))
while (info := await client.get_lipsync_info(project_id=PROJECT_ID)).lipsync_task_status is not enums.LipsyncStatus.DONE:
print(info.lipsync_task_progress, info.tasks_in_lipsync_queue)
await asyncio.sleep(15)
print(info.lipsync_result_path)
asyncio.run(main())import time, requests
AUTH = "https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token"
URL = f"https://api.rask.ai/v2/projects/{PROJECT_ID}" # a dubbed project
token = requests.post(AUTH, auth=(CLIENT_ID, CLIENT_SECRET),
data={"grant_type": "client_credentials"}).json()["access_token"]
h = {"Authorization": f"Bearer {token}"}
info = requests.get(f"{URL}/lipsync", headers=h).json()
if info["check_face_task_status"] != "done":
requests.put(f"{URL}/check_face", headers=h)
while (info := requests.get(f"{URL}/lipsync", headers=h).json())["check_face_task_status"] != "done":
time.sleep(10)
assert info["video_has_face"], "No face found"
requests.put(f"{URL}/lipsync", headers=h,
json={"is_multiple_speakers": True, "is_free_lipsync": False})
while (info := requests.get(f"{URL}/lipsync", headers=h).json())["lipsync_task_status"] not in ("done", "failed"):
time.sleep(15)
print(info["lipsync_task_status"], info["lipsync_result_path"])// no dependencies, Node 18+ global fetch - PROJECT_ID is a dubbed project
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 url = `https://api.rask.ai/v2/projects/${PROJECT_ID}`;
const info = () => fetch(`${url}/lipsync`, { headers: h }).then((r) => r.json());
let i = await info();
if (i.check_face_task_status !== 'done') {
await fetch(`${url}/check_face`, { method: 'PUT', headers: h });
while ((i = await info()).check_face_task_status !== 'done') await sleep(10000);
}
if (!i.video_has_face) throw new Error('No face found');
await fetch(`${url}/lipsync`, {
method: 'PUT', headers: h,
body: JSON.stringify({ is_multiple_speakers: true, is_free_lipsync: false }),
});
while (!['done', 'failed'].includes((i = await info()).lipsync_task_status)) {
console.log(i.lipsync_task_progress, i.tasks_in_lipsync_queue);
await sleep(15000);
}
console.log(i.lipsync_result_path);# 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. face check on the dubbed project - start it only if it has not run yet
curl -s https://api.rask.ai/v2/projects/$ID/lipsync -H "Authorization: Bearer $TOKEN" \
| jq '{check_face_task_status, video_has_face}'
curl -s -X PUT https://api.rask.ai/v2/projects/$ID/check_face -H "Authorization: Bearer $TOKEN"
# 3. run lip-sync (set is_free_lipsync to true for the free preview minute)
curl -s -X PUT https://api.rask.ai/v2/projects/$ID/lipsync \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"is_multiple_speakers": true, "is_free_lipsync": false}'
# 4. follow progress, then download the result
curl -s https://api.rask.ai/v2/projects/$ID/lipsync -H "Authorization: Bearer $TOKEN" \
| jq '{lipsync_task_status, lipsync_task_progress, lipsync_result_path}'<?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']];
$info = fn() => $json($http->get("/v2/projects/$projectId/lipsync", ['headers' => $h]));
$i = $info();
if ($i['check_face_task_status'] !== 'done') {
$http->put("/v2/projects/$projectId/check_face", ['headers' => $h]);
while (($i = $info())['check_face_task_status'] !== 'done') sleep(10);
}
if (!$i['video_has_face']) exit('No face found');
$http->put("/v2/projects/$projectId/lipsync", ['headers' => $h,
'json' => ['is_multiple_speakers' => true, 'is_free_lipsync' => false]]);
while (!in_array(($i = $info())['lipsync_task_status'], ['done', 'failed'])) sleep(15);
echo $i['lipsync_result_path'];check face check_face_task_status done video_has_face true
queued lipsync_task_status started tasks_in_lipsync_queue 2
processing lipsync_task_progress 0 → 50 → 100
complete lipsync_task_status done
lipsync_result_path https://...

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í. La API de sincronización labial de Rask funciona en cualquier video que tu proyecto haya doblado. Comprueba que el video tenga un rostro, inicia la tarea de sincronización labial y descarga el video sincronizado cuando termine. La autenticación usa credenciales de cliente OAuth 2.0, por lo que la integración de la API sigue el mismo patrón que el resto de la API de Rask.
La sincronización labial se ejecuta en un video traducido. Crea y dobla tu proyecto primero, e inicia la sincronización labial cuando el proyecto tenga un enlace de translated_video y el estado merging_done.
La sincronización labial usa el audio doblado del proyecto. Para usar tus propias palabras, edita el texto traducido o crea la transcripción a partir de tu propio archivo .srt, vuelve a doblar el proyecto y luego ejecuta la sincronización labial en la nueva versión.
La sincronización labial de Rask procesa grabaciones reales de hablantes reales en tu video de entrada. La generación de avatares parlantes, humanos digitales y la creación de videos con IA a partir de una imagen o un texto pertenecen a otra categoría de productos, para la cual es mejor usar una herramienta de generación de video con IA.
Usa material donde el rostro que habla se vea claramente, con buena iluminación y la boca despejada. Evita perfiles muy marcados de lado y cualquier elemento que tape los labios, como un micrófono, una mano o subtítulos. La verificación de rostros confirma que hay un rostro presente; usa la vista previa para evaluar el resultado en tu video.
La sincronización labial se cobra por separado del doblaje para cada generación de video completo. Generar una nueva versión con sincronización labial después de hacer ediciones genera un cobro adicional.
Sí. Cada cuenta incluye un minuto de sincronización labial gratis en sus créditos gratuitos. Ejecuta la tarea con is_free_lipsync configurado en true para sincronizar un minuto de tu video y revisarlo. El endpoint de créditos lo muestra como lipsync_free_minutes.
Sí. Configura is_multiple_speakers en true cuando haya más de un rostro en pantalla al mismo tiempo, por ejemplo, en entrevistas o paneles. Si el video solo muestra un rostro a la vez, configúralo en false para acelerar el procesamiento.
Llama a GET /v2/projects/{id}/lipsync. En la respuesta, lipsync_task_status cambia de started a done o failed, lipsync_task_progress va de 0 a 100, y tasks_in_lipsync_queue muestra cuántas tareas hay antes de la tuya.
El tiempo de procesamiento varía según la duración del video y la fila de sincronización labial. La posición en la fila y el valor de progreso te permiten mostrarle a tus usuarios exactamente en qué etapa está la tarea.
La sincronización labial se genera una vez por versión doblada. Después de cambiar texto, marcas de tiempo, hablantes o voces, vuelve a doblar el proyecto, espera a que aparezca merging_done y ejecuta la sincronización labial nuevamente. La nueva generación de sincronización labial se cobra por separado. Una verificación de rostros completada no necesita ejecutarse otra vez.
Si check_face_task_status o lipsync_task_status muestra failed, comunícate con [email protected] indicando tu project_id y el equipo lo revisará.
El acceso a la API está incluido en los planes de pago. Generas tu ID de cliente y tu clave secreta en la aplicación y puedes empezar a hacer llamadas de inmediato. Los términos empresariales, los precios por volumen y la cobertura de idiomas personalizados se gestionan a través de nuestro equipo.