# 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를 통해 직접 생성, 검토 및 다운로드할 수 있는 프로젝트로 관리할 수 있습니다.
번역은 단순히 단어를 바꾸는 작업입니다. 반면 현지화는 지역별 언어 variant, 항상 일관되게 유지되는 브랜드 용어, 화자의 목소리, 자막, 그리고 발행 전 검토 단계까지 거쳐 특정 시장에 맞게 동영상 전체를 최적화하는 작업입니다. Rask API는 이 모든 과정을 하나의 워크플로우로 지원합니다.
네, 가능합니다. 멕시코용 es-mx, 스페인용 es-es와 같이 타겟 지역별로 프로젝트를 각각 생성하고, 하나의 스페인어 용어집을 재사용하여 브랜드 용어의 일관성을 유지할 수 있습니다. 각 시장에 맞게 문구를 검토해 보세요. 지역 악센트가 중요한 경우 해당 지역에 맞는 AI 음성 프리셋을 선택하세요. 목소리 복제(Voice Cloning) 기능은 기본 언어 모델을 사용하므로 특정 지역의 악센트까지 완벽하게 보장하지는 않습니다.
언어 쌍별로 용어집을 생성하고 프로젝트를 만들 때 이를 첨부하면 됩니다. 각 프로젝트에는 사용된 용어집 버전이 기록되므로, 나중에 용어집을 수정하더라도 이미 완료된 작업에는 영향을 주지 않습니다. 단, 프로젝트가 생성된 후에는 용어집을 추가할 수 없습니다.
네, SRT 업로드가 지원되는 요금제에서 가능합니다. 프로젝트를 생성할 때 검토가 완료된 타겟 언어 SRT를 가져오시면 됩니다. 원본 언어 SRT는 선택 사항입니다. 두 파일이 모두 있다면 함께 제공하셔도 됩니다. Rask는 승인된 번역본을 더빙에 활용합니다.
문화적 적합성에는 사람의 판단이 필요합니다. API는 콘텐츠를 발행하기 전에 검토자가 각 세그먼트의 표현, 관용구, 예시를 해당 시장에 맞게 수정할 수 있도록 모든 데이터를 제공합니다. 또한 팀에서 모든 동영상을 직접 검토하기 어려운 경우, Rask 워크플로우에 인적 품질 검수(QA)를 추가할 수도 있습니다.
현재 제공되는 API 엔드포인트는 음성과 자막을 현지화합니다. 영상 속 제목처럼 화면 자체에 포함된 텍스트는 촬영된 원본 그대로 유지됩니다. 화면 속 텍스트 현지화가 워크플로우에 반드시 필요한 경우 당사 팀으로 문의해 주세요.
멕시코 및 유럽 스페인어, 브라질 및 유럽 포르투갈어, 캐나다 프랑스어를 포함해 135개 이상의 언어 및 지역 옵션으로 현지화할 수 있습니다. 각 프로젝트는 하나의 타겟 지역을 설정합니다. 전체 목록은 API 문서에서 확인할 수 있으며, 이외의 옵션에 대해서는 당사 팀과 상담하실 수 있습니다.
네, 음성 복제를 지원하는 언어에서 가능합니다. '간편 목소리 복제(Instant Voice Clone)'를 사용하여 화자의 고유한 목소리를 유지하거나, 자주 출연하는 진행자를 위해 저장된 '맞춤 목소리 복제(Custom Voice Clone)'를 이용할 수 있습니다. 목소리 복제는 기본 언어 모델을 기반으로 하므로, 지역 로케일을 선택한다고 해서 해당 지역의 악센트가 그대로 구현되는 것은 아닙니다. 지역 악센트가 가장 중요한 경우 사용 가능한 AI 음성 프리셋을 선택하세요.
립싱크는 실제 사람이 카메라 앞에서 말하는 영상에 적용하는 선택 사항입니다. 검토를 마친 현지화 버전에 적용해 보세요. 전체 동영상 립싱크 생성 비용은 추후 수정에 따른 생성을 포함하여 더빙 비용과 별도로 청구됩니다.
API 사용량은 Rask 앱과 동일한 분 단위 크레딧 풀을 사용하여, 각 시장별 동영상 길이를 기준으로 청구됩니다. 적격한 스탠다드 요금제의 경우 추가 분당 $3의 비용이 부과됩니다. 기업용(Enterprise) 가격은 계약 내용에 따라 맞춤형으로 제공됩니다. 검토 후 재더빙 시에는 변경된 세그먼트의 총 길이를 기준으로 (실행당 최소 1분) 청구되며, 립싱크 비용은 별도로 부과됩니다. 신용카드 등록 없이 무료 체험을 통해 Rask 앱에서 현지화를 직접 경험해 보세요. API를 평가해보고 싶으시다면 당사 팀에 데모를 신청해 주세요.
네. 번역량이 지속적으로 발생하는 경우, 저희 팀이 현재 프로세스를 분석하고, 검토 및 승인 단계를 설정하며, 용어와 목소리를 구성하고, Rask를 CMS나 LMS에 연동하며, 필요한 경우 사람이 직접 품질을 검수할 수 있도록 도와드립니다.
API 이용은 Creator Pro, Business, Enterprise 요금제에서 가능하며, 요금제에 따라 제공되는 기능이 다릅니다. 앱에서 클라이언트 ID와 시크릿을 생성하고 즉시 연동을 시작할 수 있습니다. 기업용 조건, 대량 할인, 맞춤형 언어 지원은 당사 팀으로 문의해 주세요.