# 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동영상 파일을 업로드하거나 공개 URL을 입력한 후, 목표 언어로 프로젝트를 만들고 완료될 때까지 기다리세요. 립싱크를 진행하려면 해당 프로젝트의 번역된 동영상이 필요합니다.
얼굴 확인 작업은 동영상에 최소 한 명 이상의 얼굴이 있는지 확인합니다. 보통 자동으로 시작되지만, 시작되지 않았다면 프로젝트에서 직접 한 번 실행해 주세요.
립싱크 작업을 실행하고 진행 상황이 0에서 100까지 올라가는 것을 확인한 후, 결과 파일 경로에서 동영상을 다운로드하세요.
# 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 및 es-es 모두 커버할 수 있습니다. 프로젝트 기록은 glossary_version유지되므로 나중에 수정하더라도 완료된 작업이 예기치 않게 변경되지 않습니다.네. Rask 싱크 API는 프로젝트에서 더빙된 모든 동영상에 적용됩니다. 동영상에 얼굴이 포함되어 있는지 확인하고, 싱크 작업을 시작한 뒤 작업이 완료되면 싱크가 완료된 동영상을 다운로드하세요. 인증에는 OAuth 2.0 클라이언트 자격 증명이 사용되므로, 다른 Rask API와 동일한 방식으로 연동할 수 있습니다.
싱크는 번역된 동영상을 바탕으로 실행됩니다. 먼저 프로젝트를 생성하여 더빙한 후, 프로젝트에 번역된 동영상 링크가 생성되고 상태가 '병합 완료(merging_done)'로 표시되면 싱크를 시작하세요.
싱크 기능은 프로젝트의 더빙된 오디오를 사용합니다. 원하는 문구를 사용하려면 번역된 텍스트를 수정하거나 자막 파일(.srt)을 통해 대본을 만든 뒤 프로젝트를 다시 더빙하고, 새 버전에 싱크를 실행하세요.
Rask 싱크는 입력한 동영상에 등장하는 실제 인물의 실제 영상을 활용합니다. 이미지나 텍스트 프롬프트를 이용한 말하는 아바타 생성, 디지털 휴먼, AI 동영상 생성은 다른 제품군에 해당하며, 이러한 기능에는 AI 동영상 생성 도구가 더 적합합니다.
말하는 사람의 얼굴이 선명하게 보이고, 조명이 좋으며, 입술이 가려지지 않은 영상을 사용하세요. 측모가 너무 강한 영상이나 마이크, 손, 자막 등으로 입술이 가려진 영상은 피해야 합니다. 얼굴 감지 기능을 통해 얼굴이 있는지 확인할 수 있으며, 미리보기를 통해 영상에 적용된 결과를 확인해 보세요.
입모양 맞추기(립싱크)는 더빙과 별개로 전체 영상 제작 시마다 요금이 청구됩니다. 수정 후 입모양 맞춘 버전을 다시 만들면 추가 요금이 부과됩니다.
네. 모든 계정의 무료 크레딧에 1분의 무료 입모양 맞추기 시간이 포함되어 있습니다. is_free_lipsync를 true로 설정하여 작업을 실행하면 영상 1분을 무료로 맞추고 확인할 수 있습니다. 크레딧 조회에서 lipsync_free_minutes로 확인할 수 있습니다.
네. 인터뷰나 패널 토론처럼 화면에 여러 사람이 동시에 나올 수 있는 경우 is_multiple_speakers를 true로 설정하세요. 영상에 항상 한 사람만 나온다면 처리 속도를 높이기 위해 false로 설정하세요.
GET /v2/projects/{id}/lipsync를 호출해 보세요. 응답에서 lipsync_task_status는 started에서 done 또는 failed로 바뀌고, lipsync_task_progress는 0에서 100까지 올라가며, tasks_in_lipsync_queue를 통해 내 앞의 대기 작업 수를 확인할 수 있습니다.
처리 시간은 영상 길이와 대기열 상태에 따라 다릅니다. 대기 순서와 진행률을 통해 사용자에게 작업 상태를 정확하게 보여줄 수 있습니다.
입모양 맞추기는 더빙된 버전당 한 번 생성됩니다. 텍스트, 시간, 화자 또는 목소리를 변경한 후 프로젝트를 다시 더빙하고, 병합 완료(merging_done)를 기다린 다음 입모양 맞추기를 다시 실행하세요. 새로운 입모양 맞추기는 별도로 청구됩니다. 얼굴 검사가 이미 완료된 경우 다시 실행할 필요는 없습니다.
얼굴 검사 상태(check_face_task_status)나 입모양 맞추기 상태(lipsync_task_status)가 실패로 표시되면 project_id와 함께 [email protected]로 문의해 주시면 팀에서 확인해 드리겠습니다.
유료 요금제를 이용하시면 API를 사용할 수 있습니다. 앱에서 클라이언트 ID와 시크릿을 생성한 후 바로 요청을 시작하세요. 기업용 계약, 대량 이용 할인, 맞춤형 언어 지원은 당사 영업팀을 통해 문의해 주세요.