# 1. exchange your client id and secret for a token (valid 1 hour)
curl -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials"
# 2. upload the video - file, or a YouTube, Drive, S3, Vimeo or direct 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://youtu.be/...", "name": "Q3 launch"}'
# 3. create the project - transcription, translation and dubbing start
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"es-mx\"}"# Poll until merging_done, then collect the files
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{status, translated_video, voiceover, translation_srt_path}'



멀티파트 폼 데이터(multipart form data) 형식으로 동영상이나 오디오 파일을 전송하거나, YouTube, Google Drive, S3, Vimeo 또는 기타 직접 URL 링크를 게시하세요. 비용을 지불하기 전에 미디어 ID와 파일 메타데이터를 먼저 확인할 수 있습니다.
미디어 ID를 video_id로 전달하고 목표 언어를 설정하세요. 선택사항으로 자체 대본이나 용어집을 첨부할 수 있습니다. 처리가 즉시 시작됩니다.
상태가 merging_done에 도달할 때까지 확인한 후, 더빙된 동영상, 오디오 트랙, 자막 파일 및 대본을 다운로드하세요.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
async def main():
# the client exchanges your credentials for tokens and refreshes them
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://youtu.be/..."))
while media.status is enums.MediaStatus.PROCESSING:
await asyncio.sleep(5)
media = await client.get_media(media_id=media.id)
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)
print(job.translated_video, job.translation_srt_path, job.translation_vtt_path)
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("launch.mp4", "rb") as f:
media = requests.post(f"{API}/api/library/v1/media", headers=h,
params={"kind": "video"}, 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": "de-de"}).json()["id"]
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
for field in ("translated_video", "translated_audio", "translation_srt_path"):
print(field, p[field]) # presigned links, valid for one hour// 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://youtu.be/...' });
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, dst_lang: 'ja-jp' });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const { translated_video, voiceover, translation_vtt_path } = p;
console.log({ translated_video, voiceover, translation_vtt_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. upload by link
VIDEO_ID=$(curl -s -X POST https://api.rask.ai/api/library/v1/media/link \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"link": "https://youtu.be/..."}' | 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\": \"$VIDEO_ID\", \"dst_lang\": \"pt-br\"}" | jq -r .id)
# 4. wait for merging_done, then read the links
until [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" = merging_done ]; do
sleep 10
done
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{translated_video, translated_audio, translation_srt_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']];
$media = $json($http->post('/api/library/v1/media/link', ['headers' => $h, 'json' => [
'link' => 'https://youtu.be/...']]));
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' => 'fr-fr']]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $p['translated_video'], PHP_EOL, $p['translation_srt_path'], PHP_EOL; 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx 및 es-es 모두 커버할 수 있습니다. 프로젝트 기록은 glossary_version유지되므로 나중에 수정하더라도 완료된 작업이 예기치 않게 변경되지 않습니다.Rask AI API는 동영상 현지화를 위한 REST API입니다. 하나의 프로젝트 안에서 동영상의 음성을 텍스트로 변환하고, 번역하며, AI 목소리나 목소리 복제로 더빙하고, 필요에 따라 립싱크를 추가하여 자막, 오디오 트랙, 스크립트를 반환합니다.
AI 더빙, 동영상 번역, 동영상 현지화, 목소리 복제, 립싱크, 동영상용 텍스트 음성 변환(TTS), 음성 텍스트 변환(STT), 동영상 전사 및 자막 기능을 제공합니다. 하나의 인증, 하나의 프로젝트 객체, 하나의 시간 풀을 공유하며, 각 기능별 상세 페이지와 코드가 제공됩니다.
API 이용은 Creator Pro, Business, Enterprise 요금제에서 제공되며, 사용 가능한 기능은 요금제에 따라 다릅니다. 앱에서 클라이언트 ID와 시크릿을 발급받으면 바로 연동을 시작할 수 있습니다. 기업용 계약, 대량 이용 할인, 맞춤형 언어 지원에 대해서는 당사 팀으로 문의해 주세요.
API는 OAuth 2.0 클라이언트 인증 정보를 사용합니다. 토큰 엔드포인트에서 클라이언트 ID와 시크릿을 액세스 토큰으로 교환한 후, 모든 요청 시 Bearer 토큰으로 전송하세요. 토큰은 1시간 동안 유효하므로 캐시해 두고 만료되면 새로 요청하세요.
네, 공식 Python SDK는 GitHub(braskai/rask-sdk)에 있으며 토큰을 자동으로 관리해 줍니다. REST API는 모든 언어에서 작동하며, 이 페이지에는 Python, Node, cURL, PHP로 작성된 전체 예제가 있습니다.
자동 언어 감지 기능이 포함된 75개 언어의 원본 오디오와, es-mx 또는 pt-br 같은 135개 이상의 타겟 언어 및 지역 옵션을 지원합니다. 목소리 복제는 지원되는 언어에서 가능하며, 나머지는 AI 목소리 프리셋으로 커버됩니다.
사용량은 동영상 1분 단위로 청구되며(1분 미만은 올림 처리), Rask 앱과 동일한 분 단위 풀에서 차감됩니다. 적격한 스탠다드 플랜의 경우 추가 시간은 분당 $3이며, 엔터프라이즈 가격은 계약에 맞춰 맞춤형으로 제공됩니다. 다시 생성할 때는 변경된 세그먼트를 기준으로 실행당 최소 1분이 청구되며, 싱크 작업은 전체 동영상 생성 시마다 별도로 청구됩니다.
아니요. 사용량 제한이나 동시 처리 할당량, 키별 제한이 없으므로 전체 카탈로그와 모든 타겟 언어를 동시에 병렬로 처리할 수 있습니다.
Poll GET /v2/projects/{id} for the status of each project; the statuses are documented, so you can show real progress. Webhook delivery is part of enterprise onboarding.
MP4, MOV, MKV, AVI, WebM, M4V, 3GP 형식의 동영상, MP3, WAV, FLAC, M4A 형식의 오디오, 혹은 유튜브, 구글 드라이브, S3, 비메오 링크나 다이렉트 URL을 지원합니다.
네. 원본 및 번역된 SRT 파일을 업로드하거나 텍스트 세그먼트를 전송한 후 프로젝트 생성 시 transcript_id를 전달하시면 됩니다. 그러면 Rask가 승인된 텍스트로 목소리를 생성합니다.
아니요. API는 녹화된 동영상 및 오디오 파일을 처리하여 결과물을 파일로 제공합니다. 라이브 음성 에이전트나 실시간 자막의 경우 스트리밍 음성 API가 더 적합합니다.
Brask Inc는 SOC 2 Type II 인증을 보유하고 있으며 GDPR을 준수합니다. 트러스트 센터에서 실시간으로 상태를 확인할 수 있습니다. 맞춤형 목소리 복제는 화자의 동의 하에만 생성됩니다.