# 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 파일에서 대본을 생성한 후, 대본 ID(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 앱과 동일한 분 단위 공용 풀에서 차감됩니다(올림 처리). 대상이 되는 스탠다드 요금제의 경우 추가 분당 $3의 비용이 청구됩니다. 기업용(Enterprise) 가격은 계약 내용에 따라 맞춤으로 제공됩니다. 재더빙은 변경된 세그먼트를 기준으로 청구되며, 실행당 최소 1분이 부과됩니다.
신용카드 등록 없이 Rask 앱에서 무료 체험을 시작하고 내 동영상에서 목소리를 직접 확인해 보세요. API 이용은 Creator Pro, Business, Enterprise 요금제에서 가능하며, 요금제에 따라 제공되는 기능이 다릅니다.
API 이용은 Creator Pro, Business, Enterprise 요금제에서 가능하며, 요금제에 따라 제공되는 기능이 다릅니다. 앱에서 클라이언트 ID와 시크릿을 생성하고 즉시 연동을 시작할 수 있습니다. 기업용 조건, 대량 할인, 맞춤형 언어 지원은 당사 팀으로 문의해 주세요.