# 1. exchange client credentials 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 by link - YouTube, Drive, S3, Vimeo or direct URL
curl -X POST https://api.rask.ai/api/library/v1/media/link \
-H "Authorization: Bearer $TOKEN" \
-d '{"link": "https://youtu.be/...", "name": "Q3 launch"}'# 3. create the dubbing project - this starts the dub
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" \
-d '{
"video_id": "b8f7835d-e8c9-4ff4-8e34-5c336d818319",
"dst_lang": "es-mx",
"name": "Q3 launch"
}'# Poll the project until status is merging_done.while :; do
curl -s https://api.rask.ai/v2/projects/$ID \
-H "Authorization: Bearer $TOKEN" | jq .status
sleep 10done以多部分表单数据发送文件,或发布链接。支持的链接来源有YouTube、Google Drive、S3、Vimeo以及任何直接下载网址。在您花费任何费用之前,系统会返回媒体ID和完整的技术元数据。
将媒体ID作为video_id传入,并指定目标语言。可选择附加您自己的文稿或词汇表。配音立即开始。
读取status直到显示merging_done,然后下载配音视频、音频轨道和字幕文件。
# pip install git+https://github.com/braskai/rask-sdk
import asyncio
from rask_sdk import RaskSDKClient
async def main():
client = RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
media = await client.upload_media_link(link="https://youtu.be/...")
project = await client.create_project(video_id=media.id, dst_lang="es-mx")
while project.status != "merging_done":
await asyncio.sleep(10)
project = await client.get_project(project.id)
print(project.translated_video, project.translation_srt_path)
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 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 media = await fetch(`${API}/api/library/v1/media/link`, {
method: 'POST', headers: h,
body: JSON.stringify({ link: 'https://youtu.be/...' }),
}).then(r => r.json());
let project = await fetch(`${API}/v2/projects`, {
method: 'POST', headers: h,
body: JSON.stringify({ video_id: media.id, dst_lang: 'es-mx' }),
}).then(r => r.json());
while (project.status !== 'merging_done') {
await new Promise(r => setTimeout(r, 10000));
project = await fetch(`${API}/v2/projects/${project.id}`, { headers: h }).then(r => r.json());
}
console.log(project.translated_video);# 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" \
-d '{"link": "https://youtu.be/..."}' | jq -r .id)
# 3. create the dubbing project
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"es-mx\"}" | jq -r .id)
# 4. poll, then download
while [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" != "merging_done" ]; do
sleep 10
done<?php
use GuzzleHttp\Client;
$http = new Client(['base_uri' => 'https://api.rask.ai']);
$auth = json_decode((new Client)->post(
'https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
['auth' => [$clientId, $clientSecret],
'form_params' => ['grant_type' => 'client_credentials']]
)->getBody(), true);
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$media = json_decode($http->post('/api/library/v1/media/link',
['headers' => $h, 'json' => ['link' => 'https://youtu.be/...']])->getBody(), true);
$project = json_decode($http->post('/v2/projects',
['headers' => $h, 'json' => ['video_id' => $media['id'], 'dst_lang' => 'es-mx']])->getBody(), true);
while ($project['status'] !== 'merging_done') {
sleep(10);
$project = json_decode($http->get("/v2/projects/{$project['id']}",
['headers' => $h])->getBody(), true);
} 0s created
12s transcription_started
70s translation_started
95s voiceover_started
150s merging_started
170s merging_done

es-mx 和 es-es 类似内容。项目记录 glossary_version,因此后续的修改绝不会悄悄改变已完成的工作。付费套餐已包含 API 访问权限。你可以在应用中生成客户端 ID 和密钥,并立即开始调用。如需企业级条款、大容量定价和定制语言覆盖,请联系我们的团队。
OAuth 2.0客户端凭证:使用您的客户端ID和密钥来交换一个短期的bearer令牌。令牌有效期为一小时,请将其缓存并重复使用。
异步处理。创建项目后会立即返回并开始配音。轮询 GET /v2/projects/{id},直到状态变为 merging_done。Webhook传送属于企业版入驻流程的一部分。
每个请求都会按发送时的状态接受。处理吞吐量取决于处理队列的深度,而处理优先级是企业条款的一部分。
支持135种以上的目标语言,包括西班牙语、法语、德语、葡萄牙语、印地语、日语和韩语,并在重要的地方提供区域变体,因此dst_lang使用es-mx而不是es。源语言会自动检测,或者您也可以手动设置。源语言和目标语言代码的完整列表可在API文档中查看。对于目录以外的语言,请联系我们的团队探讨可行性和可选方案。
即时语音克隆会使用源视频中说话人的声音来支持目标语言。若要使用可重复使用的自定义语音克隆,请在征得说话人同意的前提下,在Rask应用中创建它,然后通过API进行指定。最终效果取决于源音频、所选语言以及声音本身。
这取决于视频长度、说话人数、目标语言以及队列深度。每个项目都会报告其在各个阶段(从转写到合并)的状态,以便您向用户展示真实的进度。
支持七种视频格式(MP4、MOV、MKV、AVI、WebM、M4V、3GP)和四种音频格式(MP3、WAV、FLAC、M4A)。你还可以直接导入 YouTube、Google Drive、S3、Vimeo 链接或直接网址,而无需上传。
系统会自动检测并从源音频中分离说话者,并为目标语言中的每个人分配各自的配音。你可以覆盖每个说话者的分配,或者在创建项目时传入 num_speakers(如果已知人数)。
是的。您可以上传一个.srt文件来生成转写内容,并在创建项目时传入其ID。您还可以让API进行转写,然后逐段编辑文稿。
每个完成的项目都会提供与视频、音频轨道相配套的 .srt 和 .vtt 格式字幕文件,且字幕时间与配音保持一致。
我们提供在GitHub上发布的官方异步Python SDK,具有稳定且向后兼容的接口。对于其他语言,可以根据发布的OpenAPI规范生成客户端。此外,还有一个用于无代码工作流的n8n节点。
仅按更改的内容计费。编辑和添加的分段持续时间会相加并向上取整到最接近的分钟,因此纠正几行文字大约只需花费一分钟。