# 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 형식의 시작 시간과 종료 시간을 가집니다. 이는 캡션과 자막에 사용되는 타이밍입니다. 모든 단어의 타임스탬프가 필요하다면 전용 STT API를 이용하시는 것이 좋습니다.
아니요. Rask는 이미 녹음된 완성된 오디오와 동영상을 텍스트로 변환합니다. 사람이 말하는 동안 텍스트가 바로 나타나야 하는 실시간 자막, 음성 에이전트, 대화형 AI, 콜센터 등의 경우에는 스트리밍 STT API가 더 적합합니다.
정확도는 오디오 상태에 따라 다릅니다. 마이크 품질, 억양, 겹치는 목소리, 배경 소음 등이 모두 영향을 미칩니다. 직접 녹음한 샘플로 API를 테스트해 보시고, 게시하거나 번역하기 전에 API를 통해 구간을 수정해 보세요.
인식 과정에 별도의 사용자 정의 단어장 목록은 사용되지 않습니다. 구간 엔드포인트를 통해 텍스트 내 특정 단어를 직접 수정할 수 있습니다. 텍스트가 번역될 때 용어집 기능을 통해 제품 이름, 고유명사, 전문 용어가 일관되게 유지됩니다.
완료된 프로젝트에는 대상 언어로 된 SRT 및 VTT 자막 파일이 포함됩니다. 원본 언어 텍스트는 시작 및 종료 시간이 포함된 JSON 구간으로 제공되며, 몇 줄의 코드로 SRT로 변환할 수 있습니다.
네. 텍스트 가져오기 기능이 포함된 요금제를 이용하시면, 프로젝트 생성 시 기존 원본 텍스트, 검토된 대상 언어 번역본, 또는 이 둘을 SRT 파일이나 타임스탬프가 포함된 텍스트 구간 형태로 제공할 수 있습니다. Rask를 통해 원본 스크립트를 번역하거나 검토된 번역본을 더빙에 활용할 수 있습니다.
프로젝트 비용은 오디오나 동영상 분단위로 청구되며, Rask 앱과 동일한 분 단위 공용 풀에서 남은 시간에서 올림하여 계산됩니다. 요금에는 자막 생성, 번역, 성우 녹음, 자막이 포함됩니다. 이용 가능한 일반 요금제에서는 추가 1분당 3달러가 부과됩니다. 기업용 요금은 계약 내용에 따라 맞춤으로 제공됩니다. 텍스트 변환만 필요하신 경우, 전용 음성 텍스트 변환 API를 더 저렴하게 이용하실 수 있습니다.
Rask 앱에서 신용카드 등록 없이 무료 체험을 시작하고 내 파일로 텍스트 변환과 번역을 테스트해 보세요. API는 Creator Pro, Business, Enterprise 요금제에서 이용하실 수 있으며, 이용 가능한 기능은 요금제에 따라 다릅니다.
API 이용은 Creator Pro, Business, Enterprise 요금제에서 가능하며, 요금제에 따라 제공되는 기능이 다릅니다. 앱에서 클라이언트 ID와 시크릿을 생성하고 즉시 연동을 시작할 수 있습니다. 기업용 조건, 대량 할인, 맞춤형 언어 지원은 당사 팀으로 문의해 주세요.