# 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



Nahrávejte vstupní video nebo odešlete veřejnou URL adresu, vytvořte projekt s cílovým jazykem a vyčkejte na dokončení sloučení (merging_done). Synchronizace rtů vyžaduje přeložené video tohoto projektu.
Úkol kontroly obličeje ověří, že je ve videu alespoň jeden obličej. Obvykle se spouští automaticky. Pokud se nespustil, spusťte jej pro projekt sami.
Spusťte úlohu synchronizace rtů, sledujte postup lipsync_task_progress od 0 do 100 a poté stáhněte video z 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 a es-es stejně tak. Projekt uchovává záznamy glossary_version, takže pozdější úpravy nikdy nepozorovaně nezmění hotovou práci.Ano. Rask API pro synchronizaci rtů funguje s každým videem, které má dabing. Zkontrolujte, zda je ve videu vidět obličej, spusťte proces synchronizace rtů a po dokončení si video stáhněte. Ověřování využívá přihlašovací údaje klienta OAuth 2.0, takže integrace API funguje stejně jako zbytek Rask API.
Synchronizace rtů probíhá u přeloženého videa. Nejprve vytvořte a odebujte svůj projekt a synchronizaci rtů spusťte, jakmile bude mít projekt odkaz na přeložené video a stav merging_done.
Synchronizace rtů využívá dabovaný zvuk projektu. Pokud chcete použít vlastní text, upravte přeložený text nebo vytvořte přepis z vlastního souboru .srt, projekt znovu odebujte a poté spusťte synchronizaci rtů pro novou verzi.
Rask synchronizuje rty u skutečných záběrů reálných mluvčích ve vašem videu. Generování mluvících avatarech, digitálních lidí a generování videa pomocí AI na základě obrázku nebo textu spadá do jiné kategorie a lépe pro ně poslouží nástroj pro generování videa pomocí AI.
Použijte záběry, kde je mluvící obličej zřetelně vidět, s dobrým osvětlením a nezakrytými ústy. Vyhněte se výrazným profilům ze strany a všemu, co zakrývá rty, jako je mikrofon, ruka nebo titulky. Kontrola obličeje potvrdí jeho přítomnost; pomocí náhledu si můžete výsledek na svém videu vyzkoušet.
Synchronizace rtů se účtuje odděleně od dabingu pro každé vygenerování celého videa. Vytvoření nové verze se synchronizovanými rty po úpravách znamená další poplatek za synchronizaci.
Ano. Každý účet má v rámci bezplatných kreditů jednu minutu synchronizace obličeje zdarma. Spusťte úlohu s nastavením hodnoty true pro parametr is_free_lipsync, abyste mohli synchronizovat jednu minutu videa a zkontrolovat ji. Koncový bod pro kredity ji zobrazuje jako lipsync_free_minutes.
Ano. Pokud může být na obrazovce současně vidět více tváří – například v rozhovorech nebo debatách –, nastavte parametr is_multiple_speakers na hodnotu true. Pokud je v každém okamžiku vidět pouze jedna tvář, nastavte jej na hodnotu false, čímž urychlíte zpracování.
Zavolejte příkaz GET /v2/projects/{id}/lipsync. V odpovědi se stav lipsync_task_status změní ze spuštěného (started) na hotovo (done) nebo selhal (failed), hodnota lipsync_task_progress poroste od 0 do 100 a tasks_in_lipsync_queue ukáže, kolik úloh je před tou vaší.
Doba zpracování závisí na délce videa a frontě pro synchronizaci. Pozice ve frontě a ukazatel průběhu vám umožní přesně informovat uživatele o stavu úlohy.
Synchronizace obličeje se generuje jednou pro každou dabovanou verzi. Jakmile změněný text, časová razítka, mluvčí nebo hlasy upravíte, projekt znovu odevzdejte k dabingu, vyčkejte na stav merging_done a znovu spusťte synchronizaci obličeje. Nové generování synchronizace se účtuje zvlášť. Kontrola obličeje, která již proběhla, se nemusí spouštět znovu.
Pokud stav check_face_task_status nebo lipsync_task_status ukazuje chybu, kontaktujte podporu na adrese [email protected] spolu s ID vašeho projektu (project_id) a náš tým se na to podívá.
Přístup k API je součástí placených tarifů. V aplikaci si vygenerujete ID klienta a tajný klíč a můžete hned začít volat. Firemní podmínky, velkoobchodní ceny a vlastní jazykové varianty řeší náš tým.