# 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}'



ส่งไฟล์เสียงหรือวิดีโอในรูปแบบฟอร์มมัลติพาร์ท หรือโพสต์ลิงก์จาก YouTube, Google Drive, S3, Vimeo หรือ URL ตรงใดก็ได้ คุณจะได้รับรหัสมีเดียและข้อมูลเมตาของไฟล์ก่อนที่จะมีค่าใช้จ่ายใดๆ
ป้อนรหัสมีเดียเป็น 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ดังนั้นการแก้ไขในภายหลังจึงไม่ส่งผลกระทบต่อAงานที่เสร็จสมบูรณ์แล้วมี ระบบจดจำเสียงพูดเป็นขั้นตอนแรกของทุกโปรเจกต์ใน Rask เพียงอัปโหลดเสียงหรือวิดีโอ สร้างโปรเจกต์ และอ่านข้อความถอดเสียงทีละส่วนพร้อมป้ายชื่อผู้พูดและเวลาจาก GET /v2/projects/{id}/transcription โปรเจกต์เดียวกันนี้จะแปลข้อความถอดเสียงและสร้างซับไตเติลรวมถึงเสียงพากย์ด้วย
API รองรับภาษาต้นทาง 75 ภาษา คุณสามารถเว้นว่างช่อง src_lang ไว้เพื่อให้ระบบตรวจจับภาษาให้อัตโนมัติ หรือใส่รหัส 2 ตัวอักษร เช่น en หรือ de ก็ได้ ข้อความถอดเสียงสามารถแปลเป็นภาษาและภูมิภาคต่างๆ ได้มากกว่า 135 ภาษา
ได้ คุณสามารถอัปโหลดไฟล์เสียง เช่น MP3, WAV, FLAC หรือ M4A จากพอดแคสต์ การสัมภาษณ์ และการโทรที่บันทึกไว้ ซึ่งระบบจะถอดเสียงในลักษณะเดียวกับวิดีโอ
ได้ ระบบจะตรวจจับผู้พูดแต่ละคนโดยอัตโนมัติ และแต่ละส่วนจะมีป้ายชื่อผู้พูดในรูปแบบ SPEAKER_XX คุณสามารถระบุ num_speakers หากทราบจำนวนผู้พูด หรือแก้ไขชื่อผู้พูดในแต่ละส่วนผ่าน API ได้
ไม่ เวลาจะระบุเป็นระดับส่วน (Segment): แต่ละส่วนจะมีเวลาเริ่มต้นและสิ้นสุดในรูปแบบ HH:MM:SS,mmm ซึ่งเป็นเวลาที่ใช้สำหรับคำบรรยายและซับไตเติล หากคุณต้องการเวลาสำหรับทุกคำ โปรดเลือกใช้ API แปลงเสียงเป็นข้อความโดยเฉพาะ
ไม่ Rask ถอดเสียงจากไฟล์เสียงและวิดีโอที่บันทึกไว้ล่วงหน้าจนจบ สำหรับซับไตเติลแบบเรียลไทม์ บอทเสียง AI สนทนา และศูนย์บริการลูกค้า ที่ต้องแสดงข้อความขณะที่คนกำลังพูดอยู่ API แปลงเสียงเป็นข้อความแบบสตรีมมิ่งจะตอบโจทย์มากกว่า
ความแม่นยำขึ้นอยู่กับคุณภาพเสียง เช่น ไมโครโฟน สำเนียง เสียงพูดทับซ้อน และเสียงรบกวนรอบข้าง เราแนะนำให้ทดสอบ API กับไฟล์บันทึกเสียงของคุณเอง และแก้ไขส่วนต่างๆ ผ่าน API ก่อนเผยแพร่หรือแปลภาษา
ระบบการจดจำเสียงจะไม่ใช้รายการคำศัพท์เฉพาะ แต่คุณสามารถแก้ไขคำเฉพาะในข้อความถอดเสียงได้ผ่านจุดสิ้นสุด (endpoint) ของแต่ละส่วน เมื่อข้อความถอดเสียงถูกแปล ระบบคำศัพท์ (glossary) จะช่วยรักษาชื่อผลิตภัณฑ์ คำนามเฉพาะ และคำเฉพาะทางให้มีความสม่ำเสมอ
โปรเจกต์ที่เสร็จสมบูรณ์จะมีไฟล์ซับไตเติลในรูปแบบ SRT และ VTT ในภาษาเป้าหมายมาให้ ส่วนข้อความถอดเสียงภาษาต้นทางจะอยู่ในรูปแบบส่วน JSON พร้อมเวลาเริ่มต้นและสิ้นสุด ซึ่งสามารถแปลงเป็น SRT ได้ด้วยโค้ดเพียงไม่กี่บรรทัด
ได้ สำหรับแพ็กเกจที่มีฟีเจอร์นำเข้าข้อความถอดเสียง คุณสามารถระบุข้อความต้นทางที่มีอยู่ การแปลในภาษาเป้าหมายที่อนุมัติแล้ว หรือทั้งสองอย่างในรูปแบบไฟล์ SRT หรือส่วนข้อความตามเวลา เมื่อสร้างโปรเจกต์ Rask สามารถแปลสคริปต์ต้นทางของคุณหรือใช้คำแปลที่อนุมัติแล้วสำหรับการพากย์เสียงได้
ระบบจะคิดค่าใช้จ่ายตามนาทีของเสียงหรือวิดีโอ โดยปัดเศษขึ้นเป็นนาทีเต็มถัดไป ซึ่งหักมาจากโควตานาทีเดียวกันกับในแอป Rask ราคานี้รวมการถอดเสียง การแปลเสียงพากย์ และคำอتب (subtitles) แล้ว นาทีเพิ่มเติมมีราคา $3 ต่อนาทีสำหรับแพ็กเกจมาตรฐานที่ร่วมรายการ สำหรับแพ็กเกจองค์กร (Enterprise) ราคาจะเป็นไปตามข้อตกลงของคุณ หากคุณต้องการเพียงแค่ข้อความถอดเสียง การใช้ API แปลงเสียงเป็นข้อความโดยเฉพาะจะมีราคาถูกกว่า
เริ่มต้นทดลองใช้ฟรีในแอป Rask โดยไม่ต้องใช้บัตรเครดิต เพื่อทดสอบการถอดเสียงและการแปลบนไฟล์ของคุณเอง การเข้าถึงผ่าน API มีให้บริการในแพ็กเกจ Creator Pro, Business และ Enterprise โดยความสามารถจะขึ้นอยู่กับแพ็กเกจที่คุณเลือก
คุณสามารถเข้าใช้งาน API ได้ในแพ็กเกจ Creator Pro, Business และ Enterprise โดยความสามารถจะขึ้นอยู่กับแพ็กเกจของคุณ คุณสามารถสร้างรหัสลูกค้า (client ID) และรหัสลับ (secret) ได้ในแอปแล้วเริ่มใช้งานได้ทันที สำหรับเงื่อนไขของแพ็กเกจ Enterprise, ราคาตามปริมาณการใช้งาน และภาษาเฉพาะ โปรดติดต่อทีมงานของเรา