# 1. send your script as timed segments - one speaker per line
curl -X POST https://api.rask.ai/v2/transcriptions \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"segments": [
{"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
"src": {"text": "Welcome to the new dashboard.", "lang": "en"},
"dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}}
]}'
# 2. voice the script over your video
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\", \"transcript_id\": \"$TRANSCRIPT_ID\"}"# When status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{status, voiceover, translated_audio, translated_video}'파일이나 지원되는 미디어 URL을 사용하여 목소리를 입힐 동영상이나 오디오 녹음본을 업로드하세요. 타임라인을 통해 대본의 타이밍이 잡힙니다.
타임스탬프와 화자가 포함된 텍스트 세그먼트나 SRT 파일로 대본을 만든 다음, 해당 transcript_id와 목표 언어로 프로젝트를 생성하세요.
목소리를 확인하고 각 화자에게 사전 설정이나 복제된 목소리를 지정한 후, 필요시 다시 생성하고 더빙, 동영상, 자막 파일을 다운로드하세요.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
async def wait(client, job):
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)
script = await client.create_transcription(data=schemas.TranscriptionCreate(segments=[
schemas.SegmentCreate(speaker="SPEAKER_00", start="00:00:00,500", end="00:00:04,800",
src=schemas.SegmentTextCreatePatch(text="Welcome to the new dashboard.", lang="en"),
dst=schemas.SegmentTextCreatePatch(text="Bienvenido al nuevo panel.", lang="es-mx")),
]))
job = await wait(client, await client.create_project(data=schemas.ProjectCreate(
video_id=VIDEO_ID, dst_lang="es-mx", transcript_id=script.id)))
# pick a female AI voice preset from the library for SPEAKER_00
voices = await client.get_project_voices(project_id=job.id)
preset = next(v for v in voices if v.gender == "female")
await client.patch_project(project_id=job.id, data=schemas.ProjectPatch(voice={**job.voice, "SPEAKER_00": preset.id}))
job = await wait(client, await client.generate_project(project_id=job.id))
print(job.voiceover, job.translated_video)
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}"}
def wait(pid):
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
return p
script = requests.post(f"{API}/v2/transcriptions", headers=h, json={"segments": [
{"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
"src": {"text": "Welcome to the new dashboard.", "lang": "en"},
"dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}},
]}).json()
pid = requests.post(f"{API}/v2/projects", headers=h, json={
"video_id": VIDEO_ID, "dst_lang": "es-mx", "transcript_id": script["id"]}).json()["id"]
project = wait(pid)
voices = requests.get(f"{API}/v2/projects/{pid}/voices", headers=h).json()
preset = next(v for v in voices if v["gender"] == "female")
requests.patch(f"{API}/v2/projects/{pid}", headers=h,
json={"voice": {**project["voice"], "SPEAKER_00": preset["id"]}})
requests.post(f"{API}/v2/projects/{pid}/generate", headers=h)
print(wait(pid)["voiceover"])// 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 wait = async (id) => { let p; while ((p = await call('GET', `/v2/projects/${id}`)).status !== 'merging_done') await sleep(10000); return p; };
const script = await call('POST', '/v2/transcriptions', { segments: [
{ speaker: 'SPEAKER_00', start: '00:00:00,500', end: '00:00:04,800',
src: { text: 'Welcome to the new dashboard.', lang: 'en' },
dst: { text: 'Bienvenido al nuevo panel.', lang: 'es-mx' } },
] });
const { id } = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang: 'es-mx', transcript_id: script.id });
const project = await wait(id);
const voices = await call('GET', `/v2/projects/${id}/voices`);
const preset = voices.find((v) => v.gender === 'female');
await call('PATCH', `/v2/projects/${id}`, { voice: { ...project.voice, SPEAKER_00: preset.id } });
await call('POST', `/v2/projects/${id}/generate`);
console.log((await wait(id)).voiceover);# 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. your script as an SRT file in the target language
TRANSCRIPT_ID=$(curl -s -X POST "https://api.rask.ai/v2/transcriptions/srt?dst_lang=es-mx" \
-H "Authorization: Bearer $TOKEN" -F "dst=@script_es-mx.srt" | jq -r .id)
# 3. voice it over the video
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\": \"es-mx\", \"transcript_id\": \"$TRANSCRIPT_ID\"}" | jq -r .id)
# 4. when status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{status, voiceover, translated_video}'<?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']];
$script = $json($http->post('/v2/transcriptions', ['headers' => $h, 'json' => ['segments' => [[
'speaker' => 'SPEAKER_00', 'start' => '00:00:00,500', 'end' => '00:00:04,800',
'src' => ['text' => 'Welcome to the new dashboard.', 'lang' => 'en'],
'dst' => ['text' => 'Bienvenido al nuevo panel.', 'lang' => 'es-mx'],
]]]]));
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $videoId, 'dst_lang' => 'es-mx', 'transcript_id' => $script['id']]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $p['voiceover'];{"label": "Renata", "gender": "female", "sample_src": "https://..."} AI voice preset
{"label": "Gerardo", "gender": "male", "sample_src": "https://..."} AI voice preset
{"label": "Maria Lopez", "gender": "auto", "sample_src": "https://..."} custom voice clone
{"label": "Voice Clone", "gender": "auto", "sample_src": null} instant voice clone

es-mx 및 es-es 모두 커버할 수 있습니다. 프로젝트 기록은 glossary_version유지되므로 나중에 수정하더라도 완료된 작업이 예기치 않게 변경되지 않습니다.네, 동영상 보이스오버용으로 제공됩니다. 시간 정보가 포함된 텍스트 세그먼트나 SRT 파일과 함께 동영상을 스크립트로 전송하면, API가 화면에 맞춰 자연스러운 음성을 생성합니다. AI 목소리나 목소리 복제를 활용할 수 있으며, 동일한 프로젝트 내에서 자막과 오디오 트랙도 함께 제공됩니다.
Rask는 전체 프로젝트 단위로 음성을 생성하고 파일을 전달하므로 완성된 동영상, 교육 및 마케팅 콘텐츠에 적합합니다. 몇 초 안에 오디오가 필요한 음성 에이전트, 콜센터 및 기타 실시간 서비스에는 스트리밍 텍스트 음성 변환 API가 더 적합합니다.
프로젝트 생성이 완료되면 오디오가 전달됩니다. 이용 가능한 요금제에 따라 WAV 형식의 보이스오버, 믹싱된 오디오 및 동영상이 제공됩니다. API는 생성 과정에서 오디오 조각이나 바이트를 실시간으로 스트리밍하지는 않습니다.
각 화자, 시작 및 종료 시간(HH:MM:SS,mmm 형식), 그리고 텍스트가 포함된 세그먼트를 활용해 POST /v2/transcriptions로 대본을 생성하세요. 또한 SRT 파일을 POST /v2/transcriptions/srt에 업로드할 수도 있습니다. 그런 다음 프로젝트를 생성할 때 transcript_id를 전달하면 됩니다.
모든 지원 지역의 음성 라이브러리에는 성별이 지정된 AI 목소리 프리셋이 준비되어 있습니다. GET /v2/projects/{id}/voices를 통해 프로젝트에 사용할 수 있는 옵션을 확인하고, 음성 ID를 통해 화자별로 지정할 수 있습니다. 목소리 복제를 지원하는 언어에서는 복제된 목소리도 사용할 수 있습니다.
네. 화자의 동의를 얻어 Rask 앱에서 맞춤 목소리를 한 번 생성한 후, 지원되는 목소리 복제 언어에서 API를 통해 해당 음성 ID를 모든 화자에게 지정할 수 있습니다. 일관된 브랜드 목소리를 유지하는 데 유용합니다.
135개 이상의 언어 및 지역 옵션 중에서 선택하세요. 한 언어로 스크립트를 작성하면 Rask가 번역해주거나, 이미 목표 언어로 작성된 스크립트를 보낼 수도 있습니다. 모든 지원 지역에서 AI 목소리를 이용할 수 있습니다.
API는 세그먼트별로 일반 텍스트를 처리합니다. 발음을 조정하려면 스크립트 텍스트의 철자를 수정해 주세요. 용어집은 단어의 발음이 아니라 번역 방식을 제어합니다.
선택한 목소리와 문장 부호를 포함한 텍스트에 맞춰 음성이 생성됩니다. 실제 사람의 연기와 같은 풍부한 감정을 표현하려면 원본 화자의 목소리를 복제하는 것이 목소리 특성을 가장 잘 유지하는 방법입니다.
동영상이나 오디오 녹음 파일을 모두 사용할 수 있습니다. 원본 미디어를 업로드하고 시간 정보가 포함된 스크립트를 제공하면 타임라인에 맞춰 보이스오버가 생성됩니다. 미디어 파일 업로드는 필수입니다.
아니요. 이용량은 동영상 분 단위로 청구되며, 남은 시간에서 1분 단위로 반올림하여 차감됩니다(Rask 앱과 동일한 방식). 이용 가능한 표준 플랜의 경우 추가 1분당 3달러가 부과됩니다. 기업용 요금제는 계약에 따라 맞춤형으로 제공됩니다. 재더빙은 변경된 구간을 기준으로 청구되며, 최소 1분이 부과됩니다.
Rask 앱에서 신용카드 등록 없이 무료 체험을 시작하고 내 동영상에 적용된 목소리를 직접 확인해 보세요. API는 크리에이터 프로, 비즈니스 및 기업용 플랜에서 이용할 수 있으며, 기능은 각 플랜에 따라 제공됩니다.
API 이용은 Creator Pro, Business, Enterprise 요금제에서 제공되며, 사용 가능한 기능은 요금제에 따라 다릅니다. 앱에서 클라이언트 ID와 시크릿을 발급받으면 바로 연동을 시작할 수 있습니다. 기업용 계약, 대량 이용 할인, 맞춤형 언어 지원에 대해서는 당사 팀으로 문의해 주세요.