# 1. upload an audio or video file by link
curl -X POST https://api.rask.ai/api/library/v1/media/link \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"link": "https://example.com/interview.mp3", "name": "interview"}'
# 2. create the project - speech recognition starts automatically
# src_lang is optional: leave it out and the language is detected
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$MEDIA_ID\", \"dst_lang\": \"es-mx\"}"# Read the transcript: one object per segment
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq '.segments[] | {speaker, start, end, text: .src.text}'멀티파트 폼 데이터 형식으로 오디오나 동영상 파일을 전송하거나, 유튜브, 구글 드라이브, S3, 비메오 또는 기타 직접 링크를 입력하세요. 비용이 청구되기 전에 미디어 ID와 파일 정보를 먼저 확인할 수 있습니다.
미디어 ID를 video_id로 입력하고 목표 언어를 설정하세요. 알고 있다면 원본 언어나 화자 수도 함께 지정할 수 있습니다. 바로 인식이 시작됩니다.
번역된 미디어가 처리되는 동안, 대본 조각이 준비되는 대로 바로 내용을 확인할 수 있습니다. 작업이 완료되면 자막과 미디어 파일을 다운로드하세요.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://example.com/interview.mp3"))
while media.status is enums.MediaStatus.PROCESSING:
await asyncio.sleep(5)
media = await client.get_media(media_id=media.id)
# src_lang omitted: the source language is detected automatically
job = await client.create_project(data=schemas.ProjectCreate(video_id=media.id, dst_lang="es-mx"))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
transcript = await client.get_project_transcription(project_id=job.id)
for seg in transcript.segments:
print(seg.start, seg.end, seg.speaker, seg.src.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}"}
with open("interview.mp3", "rb") as f:
media = requests.post(f"{API}/api/library/v1/media", headers=h,
params={"kind": "audio"}, files={"data": f}).json()
while media["status"] == "processing":
time.sleep(5)
media = requests.get(f"{API}/api/library/v1/media/{media['id']}", headers=h).json()
pid = requests.post(f"{API}/v2/projects", headers=h, json={
"video_id": media["id"], "dst_lang": "es-mx", "num_speakers": 2}).json()["id"]
while requests.get(f"{API}/v2/projects/{pid}", headers=h).json()["status"] != "merging_done":
time.sleep(10)
# write the source transcript as an .srt file
segments = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
with open("interview_en.srt", "w") as out:
for i, s in enumerate(segments, 1):
out.write(f"{i}\n{s['start']} --> {s['end']}\n{s['speaker']}: {s['src']['text']}\n\n")// 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());
let media = await call('POST', '/api/library/v1/media/link', { link: 'https://example.com/webinar.mp4' });
while (media.status === 'processing') { await sleep(5000); media = await call('GET', `/api/library/v1/media/${media.id}`); }
let p = await call('POST', '/v2/projects', { video_id: media.id, src_lang: 'en', dst_lang: 'de-de' });
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.forEach((s) => console.log(`[${s.start}] ${s.speaker}: ${s.src.text}`));
console.log(p.translation_vtt_path); // German subtitles for your player# 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. upload a local audio file
MEDIA_ID=$(curl -s -X POST "https://api.rask.ai/api/library/v1/media?kind=audio" \
-H "Authorization: Bearer $TOKEN" -F "data=@podcast_episode.mp3" | jq -r .id)
# 3. create the project once the media status is ready
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$MEDIA_ID\", \"dst_lang\": \"fr-fr\"}" | jq -r .id)
# 4. when status is merging_done, read the transcript with speaker labels
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq -r '.segments[] | "\(.start) \(.speaker): \(.src.text)"'<?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']];
$media = $json($http->post('/api/library/v1/media/link', ['headers' => $h, 'json' => [
'link' => 'https://example.com/interview.mp3']]));
while ($media['status'] === 'processing') {
sleep(5);
$media = $json($http->get("/api/library/v1/media/{$media['id']}", ['headers' => $h]));
}
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $media['id'], 'dst_lang' => 'es-mx']]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
$t = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
foreach ($t['segments'] as $s) {
echo $s['start'], ' ', $s['speaker'], ': ', $s['src']['text'], PHP_EOL;
}{"segments": [
{"speaker": "SPEAKER_00", "start": "00:00:00,320", "end": "00:00:07,316", "status": "done",
"src": {"text": "Thanks for joining us. Let's start with the new release.", "lang": "en"},
"dst": {"text": "Gracias por acompañarnos. Empecemos con la nueva versión.", "lang": "es-mx"}},
{"speaker": "SPEAKER_01", "start": "00:00:07,640", "end": "00:00:11,900", "status": "done",
"src": {"text": "Sure. The biggest change is the reporting view.", "lang": "en"},
"dst": {"text": "Claro. El cambio más grande es la vista de reportes.", "lang": "es-mx"}}
]}

es-mx 및 es-es 모두 커버할 수 있습니다. 프로젝트 기록은 glossary_version유지되므로 나중에 수정하더라도 완료된 작업이 예기치 않게 변경되지 않습니다.네. 음성 인식을 모든 Rask 프로젝트의 첫 번째 단계입니다. 오디오나 동영상을 업로드하고 프로젝트를 만든 다음, GET /v2/projects/{id}/transcription에서 화자 이름과 타임스탬프가 포함된 구간별 텍스트를 확인할 수 있습니다. 동일한 프로젝트에서 텍스트를 번역하고 자막과 더빙된 오디오도 제공합니다.
이 API는 75개 원본 언어를 지원합니다. 원본 언어(src_lang)를 비워두면 자동으로 감지되며, en이나 de 같은 두 글자 코드를 입력할 수도 있습니다. 텍스트는 135개 이상의 언어 및 지역 옵션으로 번역할 수 있습니다.
네. 팟캐스트, 인터뷰, 통화 녹음 등 MP3, WAV, FLAC, M4A 형식의 오디오 파일을 업로드하면 동영상과 같은 방식으로 텍스트가 변환됩니다.
네. 서로 다른 화자를 자동으로 감지하며, 각 구간에는 SPEAKER_XX 형식의 화자 표시가 지정됩니다. 전체 화자 수를 알고 있다면 num_speakers 값을 입력하고, API를 통해 특정 구간의 화자를 수정할 수도 있습니다.
아니요. 타임스탬프는 구간 단위로 제공되며, 각 구간의 시작과 끝 시간이 HH:MM:SS,mmm 형식으로 표시됩니다. 이는 캡션과 자막에서 사용하는 방식입니다. 모든 단어에 대한 타임스탬프가 필요하다면 전용 음성 텍스트 변환 API를 이용해 보세요.
아니요. Rask는 완성된 사전 녹음 오디오와 동영상을 변환합니다. 사람이 말하는 동안 실시간으로 텍스트가 표시되어야 하는 실시간 자막, 음성 에이전트, 대화형 AI, 콜센터 등의 경우에는 스트리밍 음성 텍스트 변환 API가 더 적합합니다.
정확도는 마이크 성능, 억양, 겹치는 음성, 배경 소음 등 오디오 환경에 따라 달라집니다. 보유하고 계신 녹음 파일 샘플로 API를 테스트해 보시고, 번역이나 공개 전에 API를 통해 필요한 구간을 수정해 보세요.
인식 기능에 사용자 지정 단어 목록을 별도로 입력할 수는 없습니다. 구간 엔드포인트를 통해 텍스트 내 특정 단어를 직접 수정할 수 있습니다. 텍스트가 번역될 때 용어집 기능을 통해 제품 이름, 고유명사, 전문 용어를 일관되게 유지할 수 있습니다.
완성된 프로젝트에는 목표 언어로 된 SRT 및 VTT 형식의 자막 파일이 포함됩니다. 원본 언어 텍스트는 시작 및 종료 시간이 포함된 JSON 구간 형식으로 제공되며, 몇 줄의 코드로 SRT 파일로 변환할 수 있습니다.
네. 대본 가져오기 기능이 포함된 요금제의 경우, 프로젝트를 만들 때 기존 원본 대본, 승인된 번역본 또는 둘 다를 SRT 파일이나 시간 동기화된 텍스트로 제공할 수 있습니다. Rask는 원본 대본을 번역하거나 승인된 번역본을 사용해 더빙을 진행할 수 있습니다.
프로젝트 비용은 오디오나 동영상 분단위로 청구되며, 1분 미만은 올림 처리되어 Rask 앱과 동일한 크레딧에서 차감됩니다. 가격에는 대본 추출, 번역, 성우 녹음, 자막이 포함됩니다. 기본 요금제 이용 시 추가 분당 3달러가 부과됩니다. 기업용 요금제는 계약에 따라 맞춤형으로 제공됩니다. 대본만 필요한 경우, 전용 음성 인식 API를 더 저렴하게 이용할 수 있습니다.
Rask 앱에서 신용카드 등록 없이 무료 체험을 시작하고 내 파일로 대본 추출과 번역을 테스트해 보세요. API는 크리에이터 프로, 비즈니스, 엔터프라이즈 요금제에서 이용할 수 있으며, 기능은 요금제에 따라 다릅니다.
API 이용은 Creator Pro, Business, Enterprise 요금제에서 제공되며, 사용 가능한 기능은 요금제에 따라 다릅니다. 앱에서 클라이언트 ID와 시크릿을 발급받으면 바로 연동을 시작할 수 있습니다. 기업용 계약, 대량 이용 할인, 맞춤형 언어 지원에 대해서는 당사 팀으로 문의해 주세요.