支持135+种语言的视频翻译API

上传一个视频,即可将其转换为所需的各种语言。视频翻译REST API会转录语音、进行翻译并完成配音,然后返回翻译后的视频、字幕文件以及供审核的翻译文本。
135+种目标语言
.srt和.vtt格式字幕
REST + Python SDK
one upload, every language
OAuth 2.0
# 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 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" \
  -d '{"link": "https://youtu.be/...", "name": "Q3 launch"}'

# 3. one project per target language - they run in parallel
for lang in es-mx de-de ja-jp pt-br; do
  curl -X POST https://api.rask.ai/v2/projects \
    -H "Authorization: Bearer $TOKEN" \
    -d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"$lang\"}"
done
GET /v2/projects/{project_id}
polling, 10s
# Poll each project until merging_done, then collect the files.
while :; do
  curl -s https://api.rask.ai/v2/projects/$ID \
    -H "Authorization: Bearer $TOKEN" \
    | jq '{status, translated_video, translation_srt_path}'
  sleep 10
done
被全球团队广泛使用
功能特性

视频翻译API在一个项目中能实现的功能

通过一个API自动转录、翻译和配音您的视频。审核翻译文本,通过词汇表保持术语一致,并下载各平台所需的输出格式。可添加可选的唇形同步功能,单独计费。

翻译支持135+种语言

发送视频和目标语言,即可将视频翻译成es-mx、pt-br、fr-ca或任何其他支持的语言区域。系统会自动检测源语言。

说话人识别与专属声音

系统会自勼分离不同的发言人,并为每个人分配目标语言的配音,让访谈和座谈节目依然清晰易懂。您可以覆盖任何分配,或者在已知人数时直接传入该数值。

原声或AI声音

使用即时声音克隆功能保留每个发言人的原声,或者重复使用保存的自定义声音克隆,确保各个视频中的出镜人声音保持一致。这两种选项均可在支持的目标语言中使用,其余语言则由AI声音预设覆盖。

对口型

开启唇形同步,使口型与翻译后的语音相匹配。作为任何已完成项目的可选任务,此功能单独计费。系统会首先运行人脸检测,确保仅在有效的地方应用该功能。

保留背景音频

音乐、环境音和特效会与人声分离,并重新混音到新的画外音下方,让观众在不同的语言中也能听到最初的制作效果。

.srt和.vtt格式字幕

每个翻译好的视频都附带目标语言的两种格式字幕文件,且时间轴与翻译后的语音保持同步。

使用术语库进行术语控制

品牌名、产品名和专业术语在每个视频和每种语言中的翻译方式都保持一致,或者故意保留为原语言。

可编辑的翻译文本

获取源文本与翻译文本并排显示的文稿,纠正某一行或时间戳,然后重新生成。审核人员修复文本,无需任何人重新录制音频。

无限扩展

无速率限制、无并发配额、无单个密钥限流。发送您的完整目录,并行将大量内容翻译成多种语言。
查看实际效果

视频翻译API返回的内容

通过本页面的工作流程翻译出的相同片段。源视频保留原发言人,并带有法语、德语、葡萄牙语和西班牙语的翻译语音,同时背景音频保持不变。
EN 标志
En
FR 标志
周五
DE 标志
De
PT旗帜
Pt
ES 标志
Es
工作流程

从上传到翻译完成只需三个步骤

创建项目即开始翻译。随后可使用 /generate 端点在编辑项目后重新进行配音。
1

上传视频

以多部分表单数据形式发送文件,或发布来自YouTube、Google Drive、S3、Vimeo或任何直接下载网址的链接。在您消费任何费用之前,即可获取媒体ID和技术元数据。

POST /api/library/v1/media/link
2

为每种语言创建一个项目

将媒体ID作为 video_id 传入并指定目标语言。利用同一次上传,为您所需的每种语言创建一个项目,同时可附带您自己的文稿或词汇表(如果有的话)。

POST /v2/projects
3

分配声音并重新配音

读取状态直到显示merging_done,然后下载翻译后的视频和该语言的字幕文件。

GET /v2/projects/{project_id}
处理时间因项目而异。对于批量翻译,可以在同一次上传中为每个目标语言创建一个项目,通过API跟踪每个项目的进度,并在完成后下载文件。
以您为中心

需要目录以外的内容?请与我们的团队联系。

新语言、自定义声音、您自己的交付方式、更高的吞吐量:当视频翻译集成需要公开目录之外的内容时,我们的团队会评估您的需求和可用选项。

语言和声音

需要公开目录之外的语言或声音?请将您的需求和可用选项告诉我们的团队。

交付与集成

网络钩子(Webhooks)、推送到您自己的队列、直接交付到您的S3、自定义端点。告诉我们您的流水线需要什么样的数据输入方式。

数据量与吞吐量

批量大小、每次操作的目标语言以及处理优先级都是合同条款,而不是固定的产品限制。

安全与托管

数据驻留、单点登录与SAML、保留规则以及安全审查支持均作为企业版入驻流程的一部分来处理。
用例

谁在使用视频翻译API

内置视频的平台

LMS和客户教育平台、创作者与视频平台、网络研讨会与虚拟活动工具、视频托管与工作流SaaS、数字采用平台,以及帮助用户创建视频或从文本生成视频的直播购物和AI视频工具。您的用户已经在您的产品中上传了视频内容。通过API,他们可以在同一地方将视频翻译成多种语言,让视频翻译成为您的付费功能之一。

本地化和制作机构

将视频翻译连接到您现有的交付工作流中,并保留人工审核步骤。语言专家逐段审核翻译后的文本,让您的团队以原班人马为客户提供更多语言版本的服务。

内部持续视频制作

国际零售和电子商务、全球连锁企业、媒体出版商、企业大学。将翻译功能融入您的发布工作流中,让培训视频和产品内容以不同语言触达各个市场,并在源视频发生变化时随时重新生成语言版本。
客户案例

真正的团队,可衡量的成果

用具体数据看看各大公司如何使用Rask进行视频本地化。
箭头
箭头
代码

视频翻译API代码示例

每种语言的一个完整示例:身份验证、上传一次、为每个目标语言创建一个项目、等待、收集翻译后的视频和字幕文件。
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas

TARGETS = ["es-mx", "de-de", "ja-jp", "pt-br"]

async def translate(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)
    return job

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)

    video = await client.create_media_link(
        data=schemas.MediaCreateLink(link="https://youtu.be/..."))
    while video.status is not enums.MediaStatus.READY:
        await asyncio.sleep(5)
        video = await client.get_media(media_id=video.id)

    jobs = await asyncio.gather(*(translate(client, video.id, l) for l in TARGETS))
    for j in jobs:
        print(j.dst_lang, j.translated_video, j.translation_srt_path)

asyncio.run(main())
github.com/braskai/rask-sdk
Python 3.8+, async
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}"}

video = requests.post(f"{API}/api/library/v1/media/link", headers=h,
                      json={"link": "https://youtu.be/..."}).json()
while video["status"] != "ready":
    time.sleep(5)
    video = requests.get(f"{API}/api/library/v1/media/{video['id']}", headers=h).json()

ids = [requests.post(f"{API}/v2/projects", headers=h,
                     json={"video_id": video["id"], "dst_lang": lang}).json()["id"]
       for lang in ["es-mx", "de-de", "ja-jp", "pt-br"]]

for pid in ids:
    while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
        time.sleep(10)
    print(p["dst_lang"], p["translated_video"], p["translation_vtt_path"])
requests + polling
no SDK required
// 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 get = (path) => fetch(API + path, { headers: h }).then((r) => r.json());
const post = (path, body) => fetch(API + path, { method: 'POST', headers: h, body: JSON.stringify(body) }).then((r) => r.json());

let video = await post('/api/library/v1/media/link', { link: 'https://youtu.be/...' });
while (video.status !== 'ready') { await sleep(5000); video = await get(`/api/library/v1/media/${video.id}`); }

const results = await Promise.all(['es-mx', 'de-de', 'ja-jp', 'pt-br'].map(async (dst_lang) => {
  let p = await post('/v2/projects', { video_id: video.id, dst_lang });
  while (p.status !== 'merging_done') { await sleep(10000); p = await get(`/v2/projects/${p.id}`); }
  return p;
}));

results.forEach((p) => console.log(p.dst_lang, p.translated_video, p.translation_srt_path));
fetch, Node 18+
plain HTTP
<?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']];

$video = $json($http->post('/api/library/v1/media/link',
    ['headers' => $h, 'json' => ['link' => 'https://youtu.be/...']]));
while ($video['status'] !== 'ready') {
    sleep(5);
    $video = $json($http->get("/api/library/v1/media/{$video['id']}", ['headers' => $h]));
}

foreach (['es-mx', 'de-de', 'ja-jp', 'pt-br'] as $lang) {
    $p = $json($http->post('/v2/projects', ['headers' => $h,
        'json' => ['video_id' => $video['id'], 'dst_lang' => $lang]]));
    while ($p['status'] !== 'merging_done') {
        sleep(10);
        $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
    }
    echo $lang, ' ', $p['translation_srt_path'], PHP_EOL;
}
POST /v2/projects
OAuth 2.0 client credentials
<?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);
}
Guzzle 7
plain HTTP
Python是官方SDK。Node、PHP和cURL选项卡展示了针对相同端点的普通HTTP示例。
进度

翻译进度报告方式

每个项目都通过记录明确的状态机推进,因此您的用户可以为每个语言版本看到真实的、分阶段的进度条。您只需处理三组状态。

成功,在此停止

merging_done
翻译已完成。再次获取项目以检索可用于该项目的下载链接。

进行中,继续轮询

created
uploading
transcription_started
separate_background_started
determine_speakers_started
translation_started
voiceover_started
merging_started
加上匹配的 _done 状态。

失败、停止并报告

failed
upload_failed
transcription_failed
translation_failed
voiceover_failed
merging_failed
no_audio
no_words
forbidden_link
no_audio, no_words and forbidden_link are specific enough to show directly to your own user. Every error also returns a machine-readable slug for error handling.
Observed run, 3:47 source video, en → es-mx
GET /v2/projects/{project_id}
   0s  created
  11s  transcription_started
  87s  translation_started
  99s  voiceover_started
 154s  merging_started
 165s  merging_done

或者完全跳过轮询

将地址指向一个Webhook端点,每个状态转换都会以POST请求的形式发送,这样您的队列就能在变化发生的瞬间做出响应。Webhook交付是企业入驻服务的一部分。
阅读文档
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
输出结果

翻译后的视频、音频和字幕

下载每种目标语言的翻译视频以及SRT和VTT格式的字幕。在符合条件的套餐中,您还可以单独下载翻译后的语音,或下载与原始背景音频混合的语音。
字段
格式
说明
translated_video
MP4
配音视频,可直接发布
voiceover
WAV
仅翻译后的语音,无背景音,方便您自行混音
translated_audio
WAV
翻译后的语音与原始背景音频混合的效果
translation_srt_path
.srt
目标语言字幕
translation_vtt_path
.vtt
与 WebVTT 相同的字幕,适用于网页播放器
original_video
MP4
您存储的原始文件,供参考
控制

审核翻译后的文本,然后仅对修改的部分重新配音

在创建项目时,可以从自动翻译开始,或者上传您自己批准的SRT格式翻译文件。在发布前审核脚本,并仅重新生成更改的部分。API重新配音按修改的片段计费。

片段级编辑

片段级编辑
每个项目都会以片段形式展示其脚本,源文本和翻译文本并排显示,因此只需一个补丁请求即可完成修改。
获取文稿及其片段
修改源文本,我们将为您重新翻译
直接修改翻译后的文本以保留您自己的用语
调整时间戳、添加片段、删除片段
重新分配与任意发言人关联的语音

术语词汇表

术语词汇表
将术语表附加到项目中,以便品牌名称、产品名称和技术术语在所有语言版本中保持一致,或者故意保留不翻译。

一个词汇表涵盖一对语言,并适用于该目标语言的所有地区变体,因此一个西班牙语词汇表即可服务于 es-mx 和 es-es 类似内容。项目记录 glossary_version,因此后续的修改绝不会悄悄改变已完成的工作。
输入

支持的文件格式

你可以上传七种视频格式和四种音频格式中的任意一种,或者直接发送网址。如果文件格式不支持,系统会在扣除翻译时长之前自动拒绝。不符合要求的文件类型不会被扣费。

视频

7 种格式
.mp4
.mov
.mkv
.avi
.webm
.m4v
.3gp

音频

4 种格式
.mp3
.wav
.flac
.m4a

在消费前查看元数据

媒体端点会返回时长、文件大小、视频编码、帧率、分辨率、音频编码、采样率和声道布局等信息。由于视频翻译按分钟计费,你可以在操作前验证文件并预估费用。
安全与合规

随时准备接受你的安全审查

Brask Inc 获得了 SOC 2 Type II 认证,严格遵守 GDPR,并在其信任中心(Trust Center)实时发布控制状态。你的视频内容会在封闭的 AI 环境中处理。

认证

SOC 2 Type II
GDPR
CAI 及 C2PA 成员

加密

传输中使用 TLS 1.2
静态数据采用 AES-256
SSE-S3 托管密钥
密钥至少每 12 个月轮换一次

您的内容

封闭式人工智能环境
绝不用于训练通用模型
支持完整导出,没有绑定限制

访问

SSO 和 SAML
基于角色的访问控制
OAuth 2.0 客户端凭证

企业

数据本地化选项
自定义服务等级协议 (SLA)
专属客户经理

声音权益

具有使用权益的合成声音
基于授权的声音克隆
人工智能安全控制,人工参与
对比

Rask API 与你自己搭建的处理流程对比

文本翻译 API 翻译的是字符,而视频翻译还需要语音识别、时间轴控制、声音生成和混音。以下是实现相同功能的两种方式。
您所需的功能
Rask API
拼凑而成的方案
转录、翻译、合成、混音
一次调用
需要三到四个供应商以及连接它们的复杂代码
将翻译内容与视频完美对齐
包含
你自己的对齐逻辑
说话人识别与专属声音
包含
一个说话人分离供应商加上您自己编写的声音分配逻辑
保留背景音乐和音效
包含
需要您自行构建和调优的音源分离步骤
.srt和.vtt格式字幕
包含
根据您自己的时间轴数据生成
对口型
可选,单独计费
一个独立的供应商
修改某一句翻译
重新配音该片段,仅为该片段付费
重新运行流程,按文件付费
术语一致性
版本化术语表
您维护的前期和后期处理
频率限制
无
取决于你合作的最严格供应商的要求
目录之外的语言
与我们的团队协商
取决于各个供应商
常见问题解答

视频翻译 API 常见问题

找不到您要找的内容?请联系销售部门。

有没有可以自动翻译视频的 API?

如何获取 API 访问权限和 API 密钥?

如何进行视频翻译 API 的身份验证?

API 是同步的还是异步的?

速率限制是怎样的?

视频可以翻译成多少种语言?

我可以同时将一个视频翻译成多种语言吗?

视频翻译需要多长时间?

支持哪些文件格式?

除了翻译好的视频外,我还能获得字幕吗?

发布前可以编辑翻译好的文本吗?

ChatGPT 可以翻译视频吗?

视频翻译的费用是多少?

在一个下午内开始配音

今天就发出您的第一个请求,如果您需要大容量优惠条款或是罕见语种,随时与我们联系。