# 1. exchange client credentials 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 once - YouTube, Drive, S3, Vimeo or direct URL
curl -X POST https://api.rask.ai/api/library/v1/media/link \
-H "Authorization: Bearer $TOKEN" \
-d '{"link": "https://youtu.be/...", "name": "Q3 launch"}'
# 3. one project per target language - they run in parallel
for lang in es-mx de-de ja-jp pt-br; do
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"$lang\"}"
done# Poll each project until merging_done, then collect the files.
while :; do
curl -s https://api.rask.ai/v2/projects/$ID \
-H "Authorization: Bearer $TOKEN" \
| jq '{status, translated_video, translation_srt_path}'
sleep 10
done멀티파트 폼 데이터로 파일을 전송하거나 YouTube, Google Drive, S3, Vimeo 또는 다이렉트 다운로드 URL의 링크를 게시하세요. 비용을 지불하기 전에 미디어 ID와 기술적 메타데이터를 얻을 수 있습니다.
미디어 ID를 video_id로 전달하고 타겟 언어를 지정하세요. 동일한 업로드 파일에서 필요한 각 언어별로 프로젝트를 생성할 수 있으며, 보유하고 있는 경우 자체 대본이나 용어집을 함께 사용할 수 있습니다.
상태(status)가 merging_done(병합 완료)에 도달할 때까지 확인한 후, 해당 언어의 번역된 동영상과 자막 파일을 다운로드하세요.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
TARGETS = ["es-mx", "de-de", "ja-jp", "pt-br"]
async def translate(client, video_id, lang):
job = await client.create_project(
data=schemas.ProjectCreate(video_id=video_id, dst_lang=lang))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
return job
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
video = await client.create_media_link(
data=schemas.MediaCreateLink(link="https://youtu.be/..."))
while video.status is not enums.MediaStatus.READY:
await asyncio.sleep(5)
video = await client.get_media(media_id=video.id)
jobs = await asyncio.gather(*(translate(client, video.id, l) for l in TARGETS))
for j in jobs:
print(j.dst_lang, j.translated_video, j.translation_srt_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}"}
video = requests.post(f"{API}/api/library/v1/media/link", headers=h,
json={"link": "https://youtu.be/..."}).json()
while video["status"] != "ready":
time.sleep(5)
video = requests.get(f"{API}/api/library/v1/media/{video['id']}", headers=h).json()
ids = [requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": video["id"], "dst_lang": lang}).json()["id"]
for lang in ["es-mx", "de-de", "ja-jp", "pt-br"]]
for pid in ids:
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
print(p["dst_lang"], p["translated_video"], p["translation_vtt_path"])// 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 get = (path) => fetch(API + path, { headers: h }).then((r) => r.json());
const post = (path, body) => fetch(API + path, { method: 'POST', headers: h, body: JSON.stringify(body) }).then((r) => r.json());
let video = await post('/api/library/v1/media/link', { link: 'https://youtu.be/...' });
while (video.status !== 'ready') { await sleep(5000); video = await get(`/api/library/v1/media/${video.id}`); }
const results = await Promise.all(['es-mx', 'de-de', 'ja-jp', 'pt-br'].map(async (dst_lang) => {
let p = await post('/v2/projects', { video_id: video.id, dst_lang });
while (p.status !== 'merging_done') { await sleep(10000); p = await get(`/v2/projects/${p.id}`); }
return p;
}));
results.forEach((p) => console.log(p.dst_lang, p.translated_video, p.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']];
$video = $json($http->post('/api/library/v1/media/link',
['headers' => $h, 'json' => ['link' => 'https://youtu.be/...']]));
while ($video['status'] !== 'ready') {
sleep(5);
$video = $json($http->get("/api/library/v1/media/{$video['id']}", ['headers' => $h]));
}
foreach (['es-mx', 'de-de', 'ja-jp', 'pt-br'] as $lang) {
$p = $json($http->post('/v2/projects', ['headers' => $h,
'json' => ['video_id' => $video['id'], 'dst_lang' => $lang]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $lang, ' ', $p['translation_srt_path'], PHP_EOL;
}<?php
use GuzzleHttp\Client;
$http = new Client(['base_uri' => 'https://api.rask.ai']);
$auth = json_decode((new Client)->post(
'https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
['auth' => [$clientId, $clientSecret],
'form_params' => ['grant_type' => 'client_credentials']]
)->getBody(), true);
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$media = json_decode($http->post('/api/library/v1/media/link',
['headers' => $h, 'json' => ['link' => 'https://youtu.be/...']])->getBody(), true);
$project = json_decode($http->post('/v2/projects',
['headers' => $h, 'json' => ['video_id' => $media['id'], 'dst_lang' => 'es-mx']])->getBody(), true);
while ($project['status'] !== 'merging_done') {
sleep(10);
$project = json_decode($http->get("/v2/projects/{$project['id']}",
['headers' => $h])->getBody(), true);
}_완료 상태. 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx 및 es-es 모두 커버할 수 있습니다. 프로젝트 기록은 glossary_version유지되므로 나중에 수정하더라도 완료된 작업이 예기치 않게 변경되지 않습니다.네. Rask 동영상 번역 API는 동영상 파일이나 링크, 그리고 목표 언어를 입력받아 음성 인식, 번역, 더빙 목소리 생성, 기존 배경 오디오 믹싱까지 수동 작업 없이 한 번에 처리합니다. 번역된 동영상, 자막 파일, 번역된 텍스트를 바로 받아보실 수 있습니다. 정확도가 중요한 경우, 발행 전에 사람이 직접 검토하는 단계를 추가할 수도 있습니다.
유료 요금제를 이용하시면 API를 사용할 수 있습니다. 앱에서 클라이언트 ID와 시크릿을 생성한 후 바로 요청을 시작하세요. 기업용 계약, 대량 이용 할인, 맞춤형 언어 지원은 당사 영업팀을 통해 문의해 주세요.
OAuth 2.0 클라이언트 자격 증명을 사용합니다. 클라이언트 ID와 시크릿을 액세스 토큰으로 교환한 후, 모든 요청 시 Bearer 토큰으로 포함하여 전송하세요. 토큰의 유효 시간은 1시간이므로 캐시에 저장해 두고 재사용하시기 바랍니다.
비동기 방식으로 작동합니다. 프로젝트를 생성하면 즉시 응답이 반환되며 번역이 시작됩니다. 상태가 merging_done이 될 때까지 GET /v2/projects/{id}로 확인(polling)하세요. 웹훅(Webhook) 전달은 엔터프라이즈 온보딩 시 제공됩니다.
없습니다. API는 요청을 제한하지 않으며 키별 할당량도 없습니다. 처리 속도는 작업 대기열의 상태에 따라 달라지며, 우선순위 처리는 기업용 계약 내용에 포함됩니다.
es-mx나 pt-br 같은 지역별 변형을 포함하여 135개 이상의 목표 언어를 지원하므로 dst_lang에 로캘을 지정할 수 있습니다. 원본 언어는 자동으로 감지되며 직접 설정할 수도 있습니다. 지원되는 전체 언어 목록은 API 문서에서 확인하실 수 있습니다. 지원 목록에 없는 언어의 경우, 당사 팀에 문의하여 가능 여부와 이용 가능한 옵션을 논의해 보세요.
네. 프로젝트마다 목표 언어가 하나씩 지정되므로, 하나의 영상 파일을 업로드한 뒤 언어별로 여러 프로젝트를 만들어 동시에 진행할 수 있습니다. 횟수 제한이 없으므로, 여러 언어로 동시 번역하는 작업은 시스템에서 생성하는 프로젝트 수에 따라서만 달라집니다.
처리 시간은 프로젝트에 따라 다릅니다. 각 프로젝트는 텍스트 변환, 번역, 목소리 생성, 영상 병합 등의 진행 상황을 실시간으로 보여주므로 사용자에게 진행 상태를 안내하고 완료된 파일을 다운로드할 수 있습니다.
MP4, MOV, MKV, AVI, WebM, M4V, 3GP 등 7가지 동영상 형식과 MP3, WAV, FLAC, M4A 등 4가지 오디오 형식을 지원합니다. 또한 YouTube, Google Drive, S3, Vimeo 또는 직접 링크를 통해 동영상을 업로드할 수도 있습니다.
네. 번역된 음성과 시간에 맞춰 싱크가 조절된 .srt 및 .vtt 형식의 자막을 동영상과 함께 다운로드할 수 있습니다. 동영상에 자막을 직접 입히는 기능은 Rask 앱에서 제공됩니다.
네. 대본을 가져와 원본 텍스트를 수정한 뒤 Rask로 다시 번역하거나, 번역된 텍스트를 직접 수정하여 원하는 표현과 어조로 맞출 수 있습니다. 그런 다음 프로젝트를 다시 더빙하세요. 용어집 기능을 사용하면 모든 언어 버전에서 브랜드 이름을 일관되게 유지할 수 있습니다.
일반 챗봇 모델은 입력한 대본을 번역해 줄 수 있습니다. 하지만 번역된 동영상을 완성하려면 텍스트 변환, 타이밍 맞추기, 목소리 생성, 오디오 믹싱, 자막 파일 작업 등이 추가로 필요합니다. Rask 동영상 번역 API는 동영상 파일 하나로 이 모든 결과물을 만들어 냅니다.
API 사용량은 동영상 분단위로 계산되며, Rask 앱과 동일한 크레딧에서 소수점 첫째 자리는 올림하여 1분 단위로 청구됩니다. 기본 제공량을 초과하는 경우 분당 3달러가 부과되며, 대량 사용 시 별도로 협의할 수 있습니다. 립싱크는 별도로 과금되며 모든 계정에 1분의 무료 미리보기가 제공됩니다. 수정 후 다시 더빙하는 경우 변경된 부분에 대해서만 비용이 청구됩니다. 신용카드 등록 없이 무료 체험부터 시작해 보세요.