# 1. upload the video once - YouTube, Drive, S3, Vimeo 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://example.com/onboarding.mp4", "name": "onboarding"}'
# 2. one project per subtitle language
for lang in es-mx fr-fr ja-jp; do
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\": \"$lang\"}"
done# When status is merging_done, download both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o onboarding.es-mx.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o onboarding.es-mx.vtt "$(echo $P | jq -r .translation_vtt_path)"



ส่งวิดีโอเป็นไฟล์ หรือวางลิงก์จาก YouTube, Google Drive, S3, Vimeo หรือ URL ใดก็ได้ อัปโหลดเพียงครั้งเดียวใช้ได้กับทุกภาษาของคำบรรยาย
ส่งรหัสสื่อเป็น video_id และเลือกภาษาเป้าหมายหนึ่งภาษาต่อโปรเจกต์ โปรเจกต์สำหรับภาษาต่างๆ จะทำงานพร้อมกัน
ตรวจสอบสถานะจนกระทั่งขึ้นว่า merging_done จากนั้นดาวน์โหลดไฟล์ .srt และ .vtt มาเก็บบันทึกไว้ฝั่งของคุณ
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio, urllib.request
from rask_sdk import clients, enums, schemas
LANGS = ["es-mx", "fr-fr", "ja-jp"]
async def subtitle(client, video_id, lang):
job = await client.create_project(data=schemas.ProjectCreate(video_id=video_id, dst_lang=lang))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
# links are presigned for one hour - save the files right away
urllib.request.urlretrieve(job.translation_srt_path, f"video.{lang}.srt")
urllib.request.urlretrieve(job.translation_vtt_path, f"video.{lang}.vtt")
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/onboarding.mp4"))
while media.status is enums.MediaStatus.PROCESSING:
await asyncio.sleep(5)
media = await client.get_media(media_id=media.id)
await asyncio.gather(*(subtitle(client, media.id, l) for l in LANGS))
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}"}
pid = requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": VIDEO_ID, "dst_lang": "de-de"}).json()["id"]
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
# translated subtitles: download the files
open("video.de-de.vtt", "wb").write(requests.get(p["translation_vtt_path"]).content)
# original-language captions: build a WebVTT file from the transcript segments
segs = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
cues = [f"{s['start'].replace(',', '.')} --> {s['end'].replace(',', '.')}\n{s['src']['text']}" for s in segs]
open("video.en.vtt", "w").write("WEBVTT\n\n" + "\n\n".join(cues) + "\n")// no dependencies, Node 18+ global fetch
import { writeFile } from 'node:fs/promises';
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());
const langs = ['es-mx', 'pt-br', 'ko-kr'];
const tracks = await Promise.all(langs.map(async (dst_lang) => {
let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const file = `subs/${dst_lang}.vtt`;
await writeFile(file, await ((await fetch(p.translation_vtt_path)).text()));
return `<track kind="subtitles" srclang="${dst_lang}" src="/${file}">`;
}));
console.log(tracks.join('\n')); // paste inside your <video> element# 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. create the project for one subtitle language
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\": \"it-it\"}" | jq -r .id)
# 3. wait for merging_done
until [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" = merging_done ]; do
sleep 10
done
# 4. save both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o video.it-it.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o video.it-it.vtt "$(echo $P | jq -r .translation_vtt_path)"<?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']];
foreach (['es-mx', 'tr-tr'] as $lang) {
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $videoId, 'dst_lang' => $lang]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
// presigned links, valid for one hour
file_put_contents("video.$lang.srt", file_get_contents($p['translation_srt_path']));
file_put_contents("video.$lang.vtt", file_get_contents($p['translation_vtt_path']));
} 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx และ es-es เช่นเดียวกัน บันทึกของโปรเจกต์ glossary_versionเพื่อให้การแก้ไขภายหลังไม่ไปกระทบงานที่เสร็จสมบูรณ์แล้วโดยไม่รู้ตัวมีค่ะ/ครับ ทุกโปรเจกต์ของ Rask จะส่งออกไฟล์ซับไตเติลในรูปแบบ SRT และ WebVTT ในภาษาปลายทาง เพียงอัปโหลดวิดีโอ สร้างโปรเจกต์สำหรับแต่ละภาษาที่ต้องการ แล้วดาวน์โหลดไฟล์เมื่อโปรเจกต์เสร็จสมบูรณ์
รองรับ 2 รูปแบบสำหรับทุกโปรเจกต์ ได้แก่ ไฟล์ SRT และไฟล์ WebVTT (VTT) ในภาษาปลายทาง นอกจากนี้ยังมีสคริปต์ในรูปแบบ JSON ที่ระบุเวลา (Timestamps) ให้ใช้งาน หากแพลตฟอร์มของคุณต้องการรูปแบบคำบรรยายอื่น
ไฟล์ซับไตเติลจะอยู่ในภาษาปลายทาง หากต้องการคำบรรยายในภาษาต้นฉบับ คุณสามารถดูข้อมูลจากส่วนของสคริปต์ ซึ่งจะมีข้อความต้นฉบับพร้อมเวลาเริ่มต้นและสิ้นสุด ทำให้แปลงเป็นไฟล์ SRT หรือ VTT ได้ด้วยโค้ดเพียงไม่กี่บรรทัด
ซับไตเติลรองรับมากกว่า 135 ภาษาและสำเนียงระดับภูมิภาค เช่น สเปน-เม็กซิโก โปรตุเกส-บราซิล และฝรั่งเศส-แคนาดา จากภาษาต้นฉบับกว่า 75 ภาษา แต่ละโปรเจกต์จะเลือกได้ 1 ภาษาปลายทาง คุณสามารถสร้างหลายโปรเจกต์จากไฟล์ที่อัปโหลดครั้งเดียวเพื่อทำหลายภาษาได้
ยังไม่ได้ค่ะ/ครับ ปัจจุบัน API จะส่งออกเป็นไฟล์ซับไตเติลสำหรับนำไปใช้ในเครื่องเล่นวิดีโอหรือโปรแกรมตัดต่อของคุณ หากต้องการวิดีโอที่ฝังซับไตเติลแล้ว ให้ใช้งานผ่านเว็บแอปพลิเคชันของ Rask
ไฟล์ซับไตเติลจะมีเพียงข้อความและเวลา ส่วนแบบอักษร ขนาด สี และตำแหน่ง จะถูกกำหนดในเครื่องเล่นวิดีโอ แอป หรือโปรแกรมตัดต่อของคุณ ซึ่งช่วยให้ไฟล์ซับไตเติลไฟล์เดียวสามารถนำไปใช้ได้ทุกที่
ไฟล์ซับไตเติลจะมีเฉพาะบทสนทนาที่มีการพูด ส่วนคำอธิบายเสียงดนตรีและเอฟเฟกต์เสียงสำหรับผู้มีปัญหาทางการได้ยินจะยังไม่ได้สร้างขึ้นโดยอัตโนมัติ คุณสามารถเพิ่มส่วนนี้ได้ในขั้นตอนการแก้ไขคำบรรยายของคุณเอง
ทุกส่วนของสคริปต์จะมีป้ายกำกับผู้พูดในรูปแบบ SPEAKER_XX ทำให้คุณสามารถใส่ชื่อผู้พูดได้เมื่อต้องการทำคำบรรยายสำหรับการสัมภาษณ์หรือบทสนทนา
แก้ไขข้อความหรือจังหวะเวลาของส่วนนั้นผ่าน API แล้วสร้างโปรเจกต์ใหม่อีกครั้ง ไฟล์คำบรรยายจะอัปเดตไปพร้อมกับเวอร์ชันพากย์เสียง การสร้างใหม่จะคิดค่าใช้จ่ายตามส่วนที่มีการเปลี่ยนแปลง โดยมีขั้นต่ำหนึ่งนาทีต่อการทำหนึ่งครั้ง
ลิงก์ดาวน์โหลดได้รับการลงนามล่วงหน้าและใช้งานได้เป็นเวลาหนึ่ง ساعت โปรดบันทึกไฟล์ไว้ในพื้นที่จัดเก็บของคุณเอง หรือเรียกดูโปรเจกต์ใหม่อีกครั้งเพื่อรับลิงก์ชุดใหม่
ได้ สำหรับแพ็กเกจที่มีฟีเจอร์นำเข้าบทบรรยาย คุณสามารถอัปโหลดคำบรรยายในภาษาต้นทาง, ไฟล์ SRT ภาษาเป้าหมายที่ได้รับการอนุมัติแล้ว หรือทั้งสองอย่างเมื่อสร้างโปรเจกต์ ใช้คำบรรยายที่มีอยู่เป็นต้นทาง หรือเก็บคำแปลที่คุณอนุมัติแล้วสำหรับคำบรรยายและเสียงพากย์ในภาษาเป้าหมาย
โปรเจกต์จะถูกคิดค่าใช้จ่ายตามความยาวของวิดีโอเป็นนาที โดยปัดเศษขึ้นเป็นจำนวนเต็ม จากโควตานาทีกองกลางเดียวกันกับแอป Rask ราคารวมบริการถอดเสียง แปลภาษา คำบรรยาย และเวอร์ชันพากย์เสียงแล้ว นาทีส่วนเกินมีราคา $3 ต่อนาที สำหรับแพ็กเกจมาตรฐานที่รองรับ ส่วนราคาสำหรับองค์กรจะปรับเปลี่ยนตามข้อตกลงของคุณ
การเข้าถึง API มีให้บริการในแพ็กเกจ Creator Pro, Business และ Enterprise โดยความสามารถจะขึ้นอยู่กับแพ็กเกจของคุณ คุณสามารถสร้างรหัสลูกค้าและรหัสลับได้ในแอปและเริ่มใช้งานได้ทันที สำหรับเงื่อนไขระดับองค์กร ราคาส่ง และการรองรับภาษาเฉพาะ โปรดติดต่อทีมงานของเรา