# 1. send the video as a link - YouTube, Google Drive, Vimeo, S3 or direct URL
curl -X POST https://api.rask.ai/api/library/v1/media/link \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"link": "https://youtu.be/...", "name": "camera review"}'
# 2. create the project - the language of the video is detected automatically
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\"}"# The transcript as plain text with timestamps and speakers
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq -r '.segments[] | "\(.start) \(.speaker): \(.src.text)"'멀티파트 폼 데이터 형식으로 동영상 파일을 업로드하거나 YouTube, Google Drive, Vimeo, S3 또는 직접 링크를 게시하세요. 비용이 청구되기 전에 미디어 ID와 동영상 메타데이터를 먼저 확인할 수 있습니다.
미디어 ID를 video_id로 전달하고 타겟 언어를 지정하세요. 언어를 자동으로 감지하려면 원본 언어 항목을 비워두세요. 바로 대본 추출이 시작됩니다.video_id
대본 조각이 준비되는 대로 바로 확인하여, 번역된 미디어가 처리되는 동안 녹화물 색인 작업을 먼저 시작할 수 있습니다. 프로젝트가 완료되면 자막과 미디어 파일을 다운로드하세요.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
VIDEOS = ["https://youtu.be/aaa", "https://youtu.be/bbb", "https://vimeo.com/123"]
async def transcribe(client, i, link):
media = await client.create_media_link(data=schemas.MediaCreateLink(link=link))
while media.status is enums.MediaStatus.PROCESSING:
await asyncio.sleep(5)
media = await client.get_media(media_id=media.id)
job = await client.create_project(data=schemas.ProjectCreate(video_id=media.id, dst_lang="en-us"))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
t = await client.get_project_transcription(project_id=job.id)
with open(f"video_{i}.txt", "w") as f: # plain text, one segment per line
f.write("\n".join(f"{s.speaker}: {s.src.text}" for s in t.segments))
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
await asyncio.gather(*(transcribe(client, i, v) for i, v in enumerate(VIDEOS))) # no rate limits
asyncio.run(main())import os, 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}"}
media = requests.post(f"{API}/api/library/v1/media/link", headers=h,
json={"link": "https://youtu.be/..."}).json()
project = requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": media["id"], "dst_lang": "es-mx"}).json()
while project["status"] != "merging_done":
time.sleep(10)
project = requests.get(f"{API}/v2/projects/{project['id']}", headers=h).json()
print(project["translated_video"])// 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://drive.google.com/file/d/...' });
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, dst_lang: 'fr-fr' });
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`);
const index = segments.map((s) => ({ t: s.start, speaker: s.speaker, text: s.src.text, fr: s.dst.text }));
console.log(JSON.stringify(index, null, 2)); // ready for your search index# 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 video file
VIDEO_ID=$(curl -s -X POST "https://api.rask.ai/api/library/v1/media?kind=video" \
-H "Authorization: Bearer $TOKEN" -F "[email protected]" | 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\": \"$VIDEO_ID\", \"dst_lang\": \"de-de\", \"num_speakers\": 3}" | jq -r .id)
# 4. when status is merging_done, save the transcript as plain text
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq -r '.segments[].src.text' > webinar.txt<?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://vimeo.com/123456']]));
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' => 'pt-br']]));
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]));
file_put_contents('video.txt', implode("\n", array_map(fn($s) => $s['src']['text'], $t['segments'])));no_audio, no_words and forbidden_link are specific enough to show directly to your own user, for example a video without speech.00:00:00,320 SPEAKER_00 Welcome back. Today we test three cameras in low light.
00:00:06,180 SPEAKER_01 I brought the footage from last week's night shoot.
00:00:10,940 SPEAKER_00 Let's start with the smallest sensor, the hardest case.
00:00:15,500 SPEAKER_01 At ISO 6400 the noise is visible, but the colors hold up./transcriptiontranslation_srt_pathtranslation_vtt_pathtranslated_videotranslated_audiooriginal_video

es-mx 및 es-es 모두 커버할 수 있습니다. 프로젝트 기록은 glossary_version유지되므로 나중에 수정하더라도 완료된 작업이 예기치 않게 변경되지 않습니다.네. 동영상 파일이나 링크를 전송하여 프로젝트를 생성한 다음, GET /v2/projects/{id}/transcription을 통해 화자 이름과 타임스탬프가 포함된 자막을 확인할 수 있습니다. 자막 추출은 모든 Rask 프로젝트의 첫 단계이며, 이후 번역, 자막 생성, 더빙 버전이 추가됩니다.
네. 미디어 엔드포인트에 YouTube, Google Drive, Vimeo, S3 또는 직접 다운로드 링크를 입력하면 API가 해당 동영상을 자동으로 가져옵니다. 동영상 파일을 직접 업로드할 수도 있습니다.
네. 동영상마다 프로젝트를 하나씩 만들어 병렬로 실행할 수 있습니다. API에는 호출 횟수 제한, 동시 처리 제한, 키별 속도 제한이 없으므로, 코드를 한 번만 작성하면 전체 라이브러리의 자막을 일괄로 추출할 수 있습니다.
다양한 화자가 자동으로 감지되며, 각 구간에는 SPEAKER_00과 같은 화자 표시가 지정됩니다. 화자 수를 이미 알고 있는 경우, 프로젝트를 생성할 때 num_speakers를 지정해 주세요.
이 API는 영어 등 75개 원본 언어를 지원하며 자동 언어 감지 기능이 제공됩니다. src_lang을 비워두거나 'en'과 같은 두 글자 코드를 입력하면 됩니다. 생성된 자막은 en-us, es-mx 등을 포함하여 135개 이상의 언어 및 지역 옵션으로 번역할 수 있습니다.
자막 정확도는 배경 소음, 시끄러운 환경, 겹치는 대화, 억양, 전문 용어 등 동영상 환경에 따라 달라집니다. 보유하고 있는 동영상으로 API를 테스트해 보시고, 게시하기 전에 API를 통해 필요한 구간을 수정하세요.
자막은 화자와 타임스탬프가 포함된 JSON 세그먼트 형태로 제공됩니다. 세그먼트의 텍스트를 결합하여 일반 텍스트로 만들거나, 타임스탬프를 유지하여 자막을 검색 가능하게 활용할 수 있습니다. 대상 언어의 SRT 및 VTT 자막 파일도 함께 제공됩니다.
아니요. API는 자막, 번역, 캡션 및 더빙 버전을 반환합니다. AI 기반 요약이나 회의록을 생성하려면 자막 데이터를 원하는 요약 도구에 전달하여 활용해 보세요.
네, 녹화된 파일의 경우 가능합니다. 녹화된 회의를 동영상 또는 오디오 파일로 업로드하세요. 이 API는 화상 회의 플랫폼에 직접 연동되지 않으며, 실시간 자막이나 라이브 통화의 저지연 자막 추출 기능은 제공하지 않습니다.
API 문서에는 고정된 파일 크기 제한이 명시되어 있지 않습니다. 각 프로젝트는 요금제의 제한이 적용된 후 original_duration과 duration을 보고합니다. 매우 긴 동영상이나 대용량 파일의 경우 저희 팀에 문의해 주세요.
프로젝트 비용은 동영상 분 단위로 청구되며, Rask 앱과 동일한 크레딧 풀에서 1분 미만은 올림 처리됩니다. 가격에는 자막 추출, 번역, 캡션, 더빙 버전이 모두 포함되어 있습니다. 이용 가능한 스탠다드 요금제의 경우 추가 분당 $3의 비용이 부과됩니다. 기업용(Enterprise) 가격은 계약 내용에 따라 맞춤형으로 제공됩니다.
신용카드 등록 없이 Rask 앱에서 무료 체험으로 시작하여 직접 동영상으로 자막 추출 기능을 테스트해 보세요. API 이용은 Creator Pro, Business 및 Enterprise 요금제에서 가능하며, 이용 가능한 기능은 요금제에 따라 다릅니다.
API 이용은 크리에이터 프로, 비즈니스 및 엔터프라이즈 요금제에서 가능하며, 기능은 요금제에 따라 다릅니다. 앱에서 클라이언트 ID와 시크릿을 생성한 후 바로 요청을 시작할 수 있습니다. 엔터프라이즈 요금제, 대량 할인 및 맞춤형 언어 지원에 대해서는 당사 팀으로 문의해 주세요.