# 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)"'



Nahrajte videokorpus jako multipart data, nebo vložte odkaz na YouTube, Google Drive, Vimeo, S3 či přímý odkaz. Než cokoliv utratíte, získáte ID médií a metadata videa.
Předejte ID média jako video_id a zvolte cílový jazyk. Pro automatické rozpoznání jazyka nechte zdrojový jazyk prázdný. Přepis se spustí okamžitě.video_id
Čtěte části přepisu, jakmile jsou k dispozici, abyste mohli začít indexovat záznam, zatímco zpracování přeložených médií pokračuje. Po dokončení projektu si stáhněte soubory s titulky a médii.
# 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 a es-es stejně tak. Projekt uchovává záznamy glossary_version, takže pozdější úpravy nikdy nepozorovaně nezmění hotovou práci.Ano. Odešlete videokoubor nebo odkaz, vytvořte projekt a získejte přepis s označením mluvčích a časovými značkami pomocí požadavku GET /v2/projects/{id}/transcription. Přepis je první fází každého projektu v Rasku, ke které se následně přidá překlad, titulky a dabovaná verze.
Ano. Vložte odkaz na YouTube, Google Drive, Vimeo, S3 nebo přímý odkaz ke stažení do koncového bodu pro média a API video samo stáhne. Můžete také nahrávat videokoubory přímo.
Ano. Pro každé video vytvořte jeden projekt a spusťte je paralelně. API nemá žádné limity požadavků, kvóty pro souběžný provoz ani omezení rychlosti na klíč, takže hromadný přepis celé knihovny zvládnete pomocí jedné smyčky ve vašem kódu.
Různí mluvčí jsou detekováni automaticky a každý segment obsahuje označení mluvčího, například SPEAKER_00. Pokud znáte počet mluvčích, předejte parametr num_speakers při vytváření projektu.
API přepisuje 75 zdrojových jazyků včetně angličtiny s automatickou detekcí jazyka: nechte pole src_lang prázdné nebo předejte dvoupísmenný kód, například en. Přepisy lze přeložit do více než 135 jazyků a regionálních variant, jako je en-us nebo es-mx.
Přesnost závisí na videu: roli hraje okolní hluk, hlučné prostředí, mluvení přes sebe, přízvuky a odborná terminologie. Vyzkoušejte API na vlastních videích a případné chyby v segmentech opravte přes API ještě před zveřejněním.
Přepis má podobu segmentů ve formátu JSON obsahujících mluvčí a časové značky. Spojením textu jednotlivých segmentů získáte čistý text, případně můžete zachovat časové značky pro snadné vyhledávání v přepisu. Titulky ve formátech SRT a VTT jsou k dispozici v cílovém jazyce.
Ne. API vrací přepis, překlad, titulky a dabovanou verzi. Chcete-li vytvořit souhrny nebo zápisy ze schůzek generované umělou inteligencí, předejte přepis nástroji pro tvorbu souhrnů dle vašeho výběru.
Ano, ze záznamů. Nahrát můžete nahranou schůzku jako video nebo zvukový soubor. API se nepřipojuje k platformám pro schůzky a nenabízí titulky v reálném čase ani přepis živých hovorů s nízkou latencí.
V dokumentaci k API není uveden pevný limit velikosti souboru. U každého projektu se po uplatnění limitů vašeho tarifu zobrazují hodnoty original_duration a duration. V případě velmi dlouhých videí nebo velkého objemu dat kontaktujte náš tým.
Projekty se účtují po minutách videa zaokrouhlených nahoru na celé minuty ze stejného fondu minut jako v aplikaci Rask. Cena zahrnuje přepis, překlad, titulky a dabovanou verzi. Další minuty stojí 3 USD za minutu u platných standardních tarifů. Ceny pro firemní zákazníky (Enterprise) se přizpůsobují vaší smlouvě.
Vyzkoušejte si přepis na vlastních videích díky bezplatné zkušební verzi v aplikaci Rask, aniž byste potřebovali platební kartu. Přístup k API je k dispozici v tancích Creator Pro, Business a Enterprise a jeho možnosti závisí na vašem tarifu.
Přístup k rozhraní API je k dispozici u tarifů Creator Pro, Business a Enterprise, přičemž jeho možnosti závisejí na vašem předplatném. V aplikaci si vygenerujete ID klienta a tajný klíč a můžete hned začít. Tarify Enterprise, velkoobjemové ceny a vlastní jazykové varianty řešíme individuálně přes náš tým.