面向所有市场的视频本土化API

将一个源视频转化为适合各个市场的本土化版本:准确的区域语言、统一的品牌术语、原声配音、字幕以及可选的唇形同步。只需一个API即可运行本土化工作流,在发布前由您的团队审核文稿。
135种以上的语言和地区选项
术语表与审核
REST + Python SDK
one source, two Spanish markets
OAuth 2.0
# 1. one Spanish glossary - it applies to every Spanish regional variant
curl -X POST https://api.rask.ai/v2/glossaries \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"name": "Brand terms", "src_lang": "en", "dst_lang": "es",
       "entries": {"Rask Studio": "Rask Studio", "onboarding": "incorporación"}}'

# 2. a localized version per market, both with the same glossary
for lang in es-mx es-es; 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\", \"glossary_id\": \"$GLOSSARY_ID\"}"
done
GET /v2/projects/{project_id}/transcription
review
# Review: source and translated text, segment by segment
curl -s https://api.rask.ai/v2/projects/$ID/transcription \
  -H "Authorization: Bearer $TOKEN" \
  | jq '.segments[] | {speaker, src: .src.text, dst: .dst.text}'
受到全球团队的信赖
功能特性

视频本土化API涵盖的内容

本土化不只是翻译音频轨。该API将区域语言选项、术语控制、声音、字幕和审核整合到每个市场的统一工作流中。还可添加可选的唇形同步(需单独计费)。

135种以上的语言和地区选项

针对特定地区进行本土化:如美式西班牙语(es-mx)或欧式西班牙语(es-es)、巴式葡萄牙语(pt-br)或欧式葡萄牙语(pt-pt)、加拿大法语(fr-ca)或欧式法语(fr-fr)。每个项目采用一个目标区域设置,并自动检测源语言。

术语控制

术语表可确保品牌名称和品牌术语在每个本土化版本中保持一致。一个术语表即可涵盖某种语言的所有区域变体,并且每个项目都会记录其使用的术语表版本。

您已审核的翻译

从自动翻译开始,或者导入审核人员已通过SRT文件批准的翻译,然后让Rask进行配音。

真人出镜视频的唇形同步

当视频中有真人出镜时,使口型与本土化语音相匹配。此为可选功能,每个完整视频的生成均单独计费。

保留背景音频

原音频中的音乐、环境音和音效保留在本土化语音下方的混音中,确保各个市场听到相同的制作效果。

字幕与说明文字

每个本土化版本都附带SRT和VTT格式的字幕,采用目标语言并与本土化语音精确同步。

跨市场的演讲者声音

在访谈和对话中,“即时声音克隆”可在支持的语言中保留每个说话者的声音,而保存的“自定义声音克隆”则可让固定出场的主持人保持一致的声音。人工智能声音预设则涵盖其余需求。

发布前审核

审核人员可以并排阅读源文本和翻译文本,修正不适合该市场的内容,并仅对修改过的内容重新配音。

无限扩展

无频率限制、无并发配额、无每个密钥的节流限制。当产品向所有市场发布时,可并行生成数百个本土化版本。
查看实际效果

一个源视频,针对四个市场进行本土化

同一个片段被本土化为法语、德语、葡萄牙语和西班牙语:使用演讲者克隆声音的翻译语音,同时保持原背景音频不变。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
工作流程

视频本土化工作流的三大步骤

设置一次规则,即可应用规则为每个新视频进行本土化。创建项目即可开始本土化;审核修改后,请使用 /generate 端点。
1

设置本土化规则

为每组语言创建词汇表,为常用出镜人员保存专属声音,并为你要发布的每个市场选择对应地区的语言偏好。

POST /v2/glossaries
2

针对每个市场创建专属版本

只需上传一次源视频,然后利用词汇表或导入已审核的 SRT 翻译文件,为每个目标市场分别创建项目。

POST /v2/projects
3

审核并发布

对照阅读翻译文本,编辑审阅人员标记的内容,为修改后的片段重新配音,然后下载本土化视频和字幕。

GET /v2/projects/{id}/transcription
处理时间视项目而定。审核后重新配音的费用按修改片段的总时长计算,每次运行最低一分钟。
为您量身打造

需要批量处理本土化? 与我们的团队一起规划工作流程

面对固定的大量需求、多位审阅人员,或者你自己的 CMS 或 LMS 系统:我们的团队可以帮你设计本土化工作流程、配置专业术语和审核阶段,并在你的团队无法审阅所有视频时提供人工质量保证(QA)。

语言与声音

需要公开目录之外的语言或声音?请与我们的团队讨论您的需求和可行选项。

交付与集成

Webhook、推送到您自己的队列、直接交付到您的 S3、自定义端点。告诉我们您的流水线需要哪种对接方式。

批量与处理量

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

安全与托管

数据驻留、SSO 和 SAML、保留规则以及安全审查支持均作为企业入驻流程的一部分进行处理。
用例

谁会使用视频本土化 API

内置视频的平台

学习管理系统(LMS)和客户教育平台、创作者及视频平台、网络研讨会和虚拟活动工具、视频托管与工作流 SaaS、数字采用平台以及直播购物。在你的产品中提供带有多语言选项的本土化版本,让你的用户无需离开平台即可触达全球受众和新市场。

本地化和制作机构

为多个客户运行本土化流程,每个品牌使用各自的词汇表,每个项目设置独立的审核步骤。导入语言专家审核过的 SRT 文件,通过一个视频 localization 工作流交付配音视频、字幕和可选的口型同步。

企业内部持续视频制作

跨国零售与电商、全球连锁品牌、媒体出版商和企业大学。为每个地区本土化营销视频、视频广告、在线学习和产品视频内容,确保品牌术语前后一致,并在源视频更改时创建更新版本。
客户案例

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

用数据了解各大公司如何通过Rask进行视频本土化。
箭头
箭头
代码

视频本土化 API 代码示例

每种语言提供一个完整示例:创建一个词汇表,将一个源视频本土化为两个西班牙语市场版本,并读取翻译文本以供审核。
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas

MARKETS = ["es-mx", "es-es"]

async def localize(client, video_id, locale, glossary_id):
    job = await client.create_project(data=schemas.ProjectCreate(
        video_id=video_id, dst_lang=locale, glossary_id=glossary_id))
    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)

    glossary = await client.create_glossary(data=schemas.GlossaryCreate(
        name="Brand terms", src_lang="en", dst_lang="es",
        entries={"Rask Studio": "Rask Studio", "onboarding": "incorporación"}))

    jobs = await asyncio.gather(*(localize(client, VIDEO_ID, m, glossary.id) for m in MARKETS))

    for job in jobs:   # review before publishing
        script = await client.get_project_transcription(project_id=job.id)
        for seg in script.segments[:3]:
            print(job.dst_lang, seg.speaker, seg.src.text, "->", seg.dst.text)

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

glossary = requests.post(f"{API}/v2/glossaries", headers=h, json={
    "name": "Brand terms", "src_lang": "en", "dst_lang": "es",
    "entries": {"Rask Studio": "Rask Studio", "onboarding": "incorporación"}}).json()

ids = [requests.post(f"{API}/v2/projects", headers=h, json={
          "video_id": VIDEO_ID, "dst_lang": locale, "glossary_id": glossary["id"]}).json()["id"]
       for locale in ["es-mx", "es-es"]]

for pid in ids:
    while requests.get(f"{API}/v2/projects/{pid}", headers=h).json()["status"] != "merging_done":
        time.sleep(10)
    script = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()
    for seg in script["segments"][:3]:
        print(seg["src"]["text"], "->", seg["dst"]["text"])
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 call = (method, path, body) => fetch(API + path, { method, headers: h, body: body && JSON.stringify(body) }).then((r) => r.json());

const glossary = await call('POST', '/v2/glossaries', {
  name: 'Brand terms', src_lang: 'en', dst_lang: 'es',
  entries: { 'Rask Studio': 'Rask Studio', onboarding: 'incorporación' },
});

for (const dst_lang of ['es-mx', 'es-es']) {
  let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang, glossary_id: glossary.id });
  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.slice(0, 3).forEach((s) => console.log(dst_lang, s.src.text, '->', s.dst.text));
}
fetch, Node 18+
plain HTTP
# 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. import the translation your reviewers approved (source and translated .srt)
TRANSCRIPT_ID=$(curl -s -X POST "https://api.rask.ai/v2/transcriptions/srt?src_lang=en&dst_lang=es-mx" \
  -H "Authorization: Bearer $TOKEN" \
  -F "src=@source_en.srt" -F "dst=@approved_es-mx.srt" | jq -r .id)

# 3. create the localized version from it - Rask voices the approved script
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\": \"es-mx\", \"transcript_id\": \"$TRANSCRIPT_ID\"}"
POST /v2/transcriptions/srt
approved translation from SRT
<?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']];

$glossary = $json($http->post('/v2/glossaries', ['headers' => $h, 'json' => [
    'name' => 'Brand terms', 'src_lang' => 'en', 'dst_lang' => 'es',
    'entries' => ['Rask Studio' => 'Rask Studio', 'onboarding' => 'incorporación'],
]]));

foreach (['es-mx', 'es-es'] as $locale) {
    $p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
        'video_id' => $videoId, 'dst_lang' => $locale, 'glossary_id' => $glossary['id']]]));
    while ($p['status'] !== 'merging_done') {
        sleep(10);
        $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
    }
    $script = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
    echo $locale, ': ', $script['segments'][0]['dst']['text'], PHP_EOL;
}
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 和 forbidden_link 足够具体,可以直接向你自己的用户展示。
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
您存储的源文件,供参考
控制

确保各个市场的品牌术语和措辞保持一致

本土化质量源于审核流程。审核人员会检查每一个片段,纠正不适合当地市场的用词,并仅对这些片段重新配音。通过使用术语表,可以将这些翻译决定延续到下一个视频中,从而在各个市场保持品牌一致性。

片段级编辑

片段级编辑
每个项目都会以片段形式展示其文字记录,包含原文和译文,因此审核人员的修改只需进行一次调整即可。
获取文字记录及其片段
修改源文本,我们将重新翻译
直接修改翻译后的文本以保留您自己的措辞
调整时间戳、添加片段、删除片段
重新指定分配给任何发言者的声音

术语词汇表

术语词汇表
为每个项目附加一个术语表,以便品牌名称和产品术语在每个本地化版本中都能以相同的方式翻译,或者刻意保留原语言。

一个词汇表涵盖一对语言,并适用于该目标语言的所有区域变体,因此一个西班牙语词汇表即可服务于 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)公布实时控制状态。数据驻留选项是企业入驻流程的一部分。

认证

SOC 2 Type II
GDPR
CAI 和 C2PA 成员

加密

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

您的内容

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

访问

单点登录和SAML
基于角色的访问控制
OAuth 2.0客户端凭证

企业

数据驻留选项
自定义SLA
专属客户经理

声音权益

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

Rask API 与您自主搭建的本土化工作流程的对比

视频本土化将翻译、配音、字幕、术语和审核整合到一个制作流程中。以下是同一工作流程的两种不同搭建方式。
您需要什么
Rask API
从零散部件拼凑
区域语言选项
135种以上的语言和地区选项
各供应商支持的语言区域有所不同
每个版本中的品牌术语
针对不同语言对的版本化术语表
您需要维护的查找和替换脚本
经您审核人员批准的翻译
导入 SRT 后进行配音
与视频进行手动对齐
跨市场的演讲者声音
即时及自定义的声音克隆
每种语言对应一个独立的配音供应商
背景音乐和音效
保留在本地化语音下方
由您自行构建的音源分离步骤
.srt 和 .vtt 格式的字幕
包含
根据您自己的时间数据生成
真人出镜视频的唇形同步
可选功能,按整个视频的生成次数计费
独立的供应商
审核后修改台词
仅重新配音修改过的片段
重新渲染整个版本
速率限制
无
无论您的供应商有多严格
工作流程设计和人工质量保证
我们的团队可提供此服务
单独招聘和管理
常见问题解答

视频本土化API:常见问题

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

什么是视频本土化API?

视频本土化与视频翻译有什么区别?

我可以将一个视频本土化以适应同一语言的不同地区吗?

如何在不同本土化版本中保持品牌名称一致?

我可以使用我们已经批准的翻译吗?

API能处理文化背景差异吗?

API会翻译屏幕上的文字吗?

支持哪些语言和地区?

我可以在每个市场都保留说话者的声音吗?

口型同步如何融入本土化工作流程?

视频本土化需要多少费用?

Rask 可以帮我们设计本土化工作流程吗?

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

在一个下午内开始配音

今天就发出您的第一个请求,如果您需要大批量合作条款或其他人没有的语言,请与我们联系。