# 1. one Spanish glossary - it applies to every Spanish regional variant
curl -X POST https://api.rask.ai/v2/glossaries \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"name": "Brand terms", "src_lang": "en", "dst_lang": "es",
"entries": {"Rask Studio": "Rask Studio", "onboarding": "incorporación"}}'
# 2. a localized version per market, both with the same glossary
for lang in es-mx es-es; do
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\": \"$lang\", \"glossary_id\": \"$GLOSSARY_ID\"}"
done# Review: source and translated text, segment by segment
curl -s https://api.rask.ai/v2/projects/$ID/transcription \
-H "Authorization: Bearer $TOKEN" \
| jq '.segments[] | {speaker, src: .src.text, dst: .dst.text}'언어 쌍별로 용어집을 만들고, 반복 출연하는 발표자의 맞춤 목소리를 저장하며, 콘텐츠를 게시할 시장별 지역 설정을 선택하세요.
원본 동영상을 한 번 업로드한 다음, 용어집을 적용하거나 SRT에서 가져온 승인된 번역을 사용하여 타겟 시장별 프로젝트를 만드세요.
번역된 텍스트를 나란히 비교하며 읽고, 검토자가 지적한 부분을 수정하고, 변경된 구간만 다시 더빙한 후 현지화된 동영상과 자막을 다운로드하세요.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
MARKETS = ["es-mx", "es-es"]
async def localize(client, video_id, locale, glossary_id):
job = await client.create_project(data=schemas.ProjectCreate(
video_id=video_id, dst_lang=locale, glossary_id=glossary_id))
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)
glossary = await client.create_glossary(data=schemas.GlossaryCreate(
name="Brand terms", src_lang="en", dst_lang="es",
entries={"Rask Studio": "Rask Studio", "onboarding": "incorporación"}))
jobs = await asyncio.gather(*(localize(client, VIDEO_ID, m, glossary.id) for m in MARKETS))
for job in jobs: # review before publishing
script = await client.get_project_transcription(project_id=job.id)
for seg in script.segments[:3]:
print(job.dst_lang, seg.speaker, seg.src.text, "->", seg.dst.text)
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}"}
glossary = requests.post(f"{API}/v2/glossaries", headers=h, json={
"name": "Brand terms", "src_lang": "en", "dst_lang": "es",
"entries": {"Rask Studio": "Rask Studio", "onboarding": "incorporación"}}).json()
ids = [requests.post(f"{API}/v2/projects", headers=h, json={
"video_id": VIDEO_ID, "dst_lang": locale, "glossary_id": glossary["id"]}).json()["id"]
for locale in ["es-mx", "es-es"]]
for pid in ids:
while requests.get(f"{API}/v2/projects/{pid}", headers=h).json()["status"] != "merging_done":
time.sleep(10)
script = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()
for seg in script["segments"][:3]:
print(seg["src"]["text"], "->", seg["dst"]["text"])// 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());
const glossary = await call('POST', '/v2/glossaries', {
name: 'Brand terms', src_lang: 'en', dst_lang: 'es',
entries: { 'Rask Studio': 'Rask Studio', onboarding: 'incorporación' },
});
for (const dst_lang of ['es-mx', 'es-es']) {
let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang, glossary_id: glossary.id });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const { segments } = await call('GET', `/v2/projects/${p.id}/transcription`);
segments.slice(0, 3).forEach((s) => console.log(dst_lang, s.src.text, '->', s.dst.text));
}# 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. import the translation your reviewers approved (source and translated .srt)
TRANSCRIPT_ID=$(curl -s -X POST "https://api.rask.ai/v2/transcriptions/srt?src_lang=en&dst_lang=es-mx" \
-H "Authorization: Bearer $TOKEN" \
-F "src=@source_en.srt" -F "dst=@approved_es-mx.srt" | jq -r .id)
# 3. create the localized version from it - Rask voices the approved script
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\": \"es-mx\", \"transcript_id\": \"$TRANSCRIPT_ID\"}"<?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']];
$glossary = $json($http->post('/v2/glossaries', ['headers' => $h, 'json' => [
'name' => 'Brand terms', 'src_lang' => 'en', 'dst_lang' => 'es',
'entries' => ['Rask Studio' => 'Rask Studio', 'onboarding' => 'incorporación'],
]]));
foreach (['es-mx', 'es-es'] as $locale) {
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $videoId, 'dst_lang' => $locale, 'glossary_id' => $glossary['id']]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
$script = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
echo $locale, ': ', $script['segments'][0]['dst']['text'], 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유지되므로 나중에 수정하더라도 완료된 작업이 예기치 않게 변경되지 않습니다.동영상 현지화 API는 자체 코드를 통해 자동화 방식으로 하나의 원본 동영상을 다른 시장에 맞게 다양한 버전으로 변환해 줍니다. 번역 및 더빙된 음성, 자막, 일관된 용어 정리, 그리고 선택적인 립싱크(입모양 맞춤) 기능을 제공합니다. Rask를 사용하면 단일 REST API를 통해 각 시장별 버전을 프로젝트 단위로 생성, 검토 및 다운로드할 수 있습니다.
번역은 단순히 단어를 바꾸는 작업입니다. 반면 현지화는 특정 시장에 맞춰 동일한 동영상을 준비하는 과정으로, 해당 지역의 언어 변형, 일관성을 유지하는 브랜드 용어, 화자의 목소리, 자막, 그리고 게시 전 검토 단계까지 포함합니다. Rask API는 이 모든 과정을 하나의 작업 흐름으로 지원합니다.
네, 가능합니다. 멕시코용 es-mx, 스페인용 es-es와 같이 타겟 지역별로 프로젝트를 생성하고, 하나의 스페인어 용어집을 재사용하여 일관된 브랜드 용어를 유지할 수 있습니다. 각 시장에 맞게 표현을 검토하세요. 특정 지역의 억양이 중요한 경우 해당 지역에 맞는 AI 목소리를 선택하세요. 목소리 복제는 기본 언어 모델을 사용하므로 뚜렷한 지역별 억양이 항상 보장되지는 않습니다.
언어 쌍마다 용어집을 생성하고 프로젝트를 만들 때 추가하세요. 각 프로젝트는 사용된 용어집 버전을 기록하므로, 나중에 용어집을 수정해도 이미 완료된 작업에는 영향을 주지 않습니다. 프로젝트가 생성된 후에는 용어집을 추가할 수 없습니다.
네, SRT 업로드가 지원되는 요금제에서 가능합니다. 프로젝트 생성 시 승인된 타겟 언어의 SRT를 가져오세요(원본 언어 SRT는 선택 사항입니다). 두 파일 모두 가지고 있는 경우 함께 제공할 수도 있습니다. Rask는 사용자가 승인한 번역을 더빙에 활용합니다.
문화적 적합성은 사람이 직접 판단해야 합니다. API는 검토자가 콘텐츠를 게시하기 전에 각 세그먼트의 표현, 관용구, 예시를 해당 시장에 맞게 조정할 수 있도록 지원하며, 팀에서 모든 동영상을 직접 검토하기 어려운 경우 Rask를 통해 전문가 검수 과정을 추가할 수 있습니다.
문서화된 API 엔드포인트는 음성과 자막을 현지화합니다. 영상 속 제목처럼 화면 자체에 포함된 텍스트는 촬영된 원본 그대로 유지됩니다. 화면 텍스트 현지화가 필요한 경우 당사 팀에 문의해 주세요.
멕시코 및 유럽 스페인어, 브라질 및 유럽 포르투갈어, 캐나다 프랑스어를 포함하여 135개 이상의 언어 및 지역 옵션 중에서 선택해 현지화할 수 있습니다. 각 프로젝트에는 하나의 타겟 지역이 지정됩니다. 전체 목록은 API 문서에서 확인할 수 있으며, 그 외의 옵션에 대해서는 당사 팀과 상의하실 수 있습니다.
네, 목소리 복제를 지원하는 언어에서 가능합니다. '즉시 목소리 복제'를 사용하여 화자의 고유한 특징을 유지하거나, 자주 출연하는 진행자를 위해 저장된 '맞춤형 목소리 복제'를 사용할 수 있습니다. 복제 기능은 기본 언어 모델을 기반으로 하므로, 지역 설정을 선택한다고 해서 해당 지역의 억양이 완벽히 보장되지는 않습니다. 지역 억양이 가장 중요한 경우 제공되는 AI 목소리 사전 설정(프리셋)을 선택하세요.
립싱크는 카메라 앞에서 실제 사람이 말하는 영상에 적용할 수 있는 선택 사항입니다. 검토를 마친 현지화 버전에 립싱크를 적용해 보세요. 전체 동영상 립싱크 생성은 더빙과 별도로 청구되며, 추후 수정 후 다시 생성하는 경우에도 각각 비용이 부과됩니다.
API 사용량은 Rask 앱과 동일한 분 단위 크레딧을 사용하여, 시장별 버전의 동영상 재생 시간(분)을 기준으로 청구됩니다. 적격한 스탠다드 요금제의 경우 추가 분당 3달러가 부과됩니다. 기업용(Enterprise) 가격은 계약 내용에 따라 맞춤형으로 제공됩니다. 검토 후 재더빙할 때는 변경된 구간의 총 재생 시간을 기준으로 청구되며, 실행당 최소 1분이 적용되고 립싱크는 별도로 청구됩니다. 신용카드 등록 없이 무료 체험으로 Rask 앱에서 번역을 시작해 보세요. API를 테스트해 보려면 저희 팀에 데모를 신청해 주세요.
네. 정기적으로 대량의 콘텐츠를 다루는 경우, 저희 팀이 현재 프로세스를 분석하고 검토 및 승인 단계를 정의하며, 용어와 목소리를 설정하고, Rask를 CMS나 LMS에 연동하며, 필요한 곳에 사람의 검수를 추가하는 과정을 도와드립니다.
API 이용은 Creator Pro, Business, Enterprise 요금제에서 제공되며, 사용 가능한 기능은 요금제에 따라 다릅니다. 앱에서 클라이언트 ID와 시크릿을 발급받으면 바로 연동을 시작할 수 있습니다. 기업용 계약, 대량 이용 할인, 맞춤형 언어 지원에 대해서는 당사 팀으로 문의해 주세요.