# 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 el 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 del rostro confirma que hay al menos un rostro en el video. Por lo general, se inicia de forma automática. Si no ha comenzado, ejecútala tú mismo una vez para el proyecto.
Ejecuta la tarea de sincronización labial, sigue el progreso en lipsync_task_progress del 0 al 100 y, después, 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 proyecto registra glossary_version, de modo que las ediciones posteriores nunca modifiquen el trabajo finalizado en segundo plano.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 de 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 aplica a 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 utiliza 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 utiliza grabaciones reales de personas reales en tu video de entrada. La generación de avatares parlantes, humanos digitales y videos con AI a partir de una imagen o texto pertenece a otra categoría de producto, para la cual es mejor usar una herramienta de generación de video con AI.
Usa material donde el rostro que habla se vea con claridad, buena iluminación y la boca sin obstrucciones. Evita perfiles muy marcados y cualquier elemento que cubra los labios, como un micrófono, una mano o subtítulos. La verificación de rostros confirma que hay una cara 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 en todo el video. Generar una nueva versión con sincronización labial después de hacer ediciones genera un costo adicional por este concepto.
Sí. Cada cuenta incluye un minuto gratis de sincronización labial dentro de 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 aparezca más de un rostro en pantalla al mismo tiempo, como 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 mostrar a tus usuarios el estado exacto de la tarea.
La sincronización labial se genera una vez por cada 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 de nuevo. 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, contacta a [email protected] con 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 para 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.