# 1. exchange your client id and secret for a token (valid 1 hour)
curl -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials"
# 2. upload the video - file, or a YouTube, Drive, S3, Vimeo or direct 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://youtu.be/...", "name": "Q3 launch"}'
# 3. create the project - transcription, translation and dubbing start
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\"}"# Poll until merging_done, then collect the files
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{status, translated_video, voiceover, translation_srt_path}'



動画または音声ファイルをマルチパートフォームデータとして送信するか、YouTube、Googleドライブ、S3、Vimeo、または任意の直接URLからリンクを投稿します。料金が発生する前に、メディアIDとファイルメタデータを確認できます。
メディアIDを video_id として指定し、翻訳先の言語を設定します。必要に応じて、独自の文字起こしや用語集を追加することもできます。すぐに処理が開始されます。
ステータスが merging_done になるまで待ち、完了したら、吹き替え動画、音声トラック、字幕ファイル、文字起こしデータをダウンロードします。
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
async def main():
# the client exchanges your credentials for tokens and refreshes them
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://youtu.be/..."))
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="es-mx"))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
print(job.translated_video, job.translation_srt_path, job.translation_vtt_path)
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("launch.mp4", "rb") as f:
media = requests.post(f"{API}/api/library/v1/media", headers=h,
params={"kind": "video"}, 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": "de-de"}).json()["id"]
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
for field in ("translated_video", "translated_audio", "translation_srt_path"):
print(field, p[field]) # presigned links, valid for one hour// 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://youtu.be/...' });
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: 'ja-jp' });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const { translated_video, voiceover, translation_vtt_path } = p;
console.log({ translated_video, voiceover, translation_vtt_path });# 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 by link
VIDEO_ID=$(curl -s -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/..."}' | 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\": \"pt-br\"}" | jq -r .id)
# 4. wait for merging_done, then read the links
until [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" = merging_done ]; do
sleep 10
done
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{translated_video, translated_audio, translation_srt_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']];
$media = $json($http->post('/api/library/v1/media/link', ['headers' => $h, 'json' => [
'link' => 'https://youtu.be/...']]));
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' => 'fr-fr']]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $p['translated_video'], PHP_EOL, $p['translation_srt_path'], PHP_EOL; 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx および es-es 同様に。プロジェクトの記録 glossary_versionのため、後から編集しても完成した作業が勝手に変更されることはありません。Rask AI APIは、動画の多言語化を行うためのREST APIです。1つのプロジェクトで、動画内の音声を文字起こしし、翻訳してAI音声やボイスクローンで吹き替え、リップシンク(口パク合わせ)を追加し、字幕、音声トラック、文字起こしデータを返します。
AI吹き替え、動画翻訳、動画の多言語化、ボイスクローン、リップシンク、動画の音声合成(Text-to-Speech)、音声認識(Speech-to-Text)、動画の文字起こし、字幕生成などがあります。これらは1つの認証、1つのプロジェクトオブジェクト、1つの時間プールを共有しており、それぞれ詳細やコードを記載した専用ページが用意されています。
APIへのアクセスは、Creator Pro、Business、Enterpriseの各プランでご利用いただけ、機能はプランによって異なります。アプリ内でクライアントIDとシークレットを生成すれば、すぐに使い始めることができます。Enterpriseの契約条件、大量利用時の割引、カスタム言語への対応については、弊社チームまでお問い合わせください。
APIはOAuth 2.0のクライアント認証を使用します。トークンエンドポイントでクライアントIDとシークレットをアクセストークンに交換し、すべてのリクエストでBearerトークンとして送信します。トークンの有効期限は1時間です。キャッシュに保存し、期限切れになったら新しいトークンをリクエストしてください。
はい。公式のPython SDKがGitHub(braskai/rask-sdk)で提供されており、トークンの管理を行います。REST APIはどの言語からも利用可能です。このページには、Python、Node、cURL、PHPの完全なサンプルが掲載されています。
音声の入力元としては自動言語検出機能付きの75言語に対応しており、翻訳先としてはes-mxやpt-brなどの地域設定を含めて135以上の言語および地域オプションに対応しています。ボイスクローンは対応言語でのみ利用可能で、その他の言語にはAI音声のプリセットが用意されています。
利用料金は動画の分数ごとに請求され、端数は切り上げられます。料金はRaskアプリと同じ分数プールから差し引かれます。対象のスタンダードプランでは追加分数が1分あたり3ドルとなり、エンタープライズプランの価格は契約内容に合わせて個別調整されます。修正部分の再生成は変更されたセグメントに対して実行ごとに1分を最低単位として請求され、リップシンクは動画全体を生成するごとに別途請求されます。
いいえ。利用制限、同時実行数の上限、キーごとの制限はありません。そのため、膨大な動画カタログやすべての翻訳先言語の処理を並行して実行できます。
Poll GET /v2/projects/{id} for the status of each project; the statuses are documented, so you can show real progress. Webhook delivery is part of enterprise onboarding.
動画形式はMP4、MOV、MKV、AVI、WebM、M4V、3GP、音声形式はMP3、WAV、FLAC、M4Aに対応しています。また、YouTube、Googleドライブ、S3、Vimeoのリンクや、直接URLを指定することも可能です。
はい。元となるファイルと翻訳済みのSRTファイルをアップロードするか、テキストセグメントを送信し、プロジェクト作成時にtranscript_idを指定してください。その後、Raskが承認されたテキストに音声を付けます。
いいえ。APIは録画された動画や音声ファイルを処理し、ファイルとして結果を出力します。リアルタイムの音声エージェントやリアルタイム字幕が必要な場合は、ストリーミング対応の音声APIのほうが適しています。
Brask IncはSOC 2 Type IIの認証を取得し、GDPRに準拠して運営されています。トラストセンターでライブの管理ステータスを確認することも可能です。また、カスタムボイスクローンは話者の同意を得た上で作成されます。