适用于各个市场的视频本地化 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格式的字幕,采用目标语言,且字幕时间与本地化后的语音同步。

各市场发言人的声音

在访谈和对话中,“即时语音克隆”功能会保留每位发言者在支持语言中的原声;而保存的“自定义语音克隆”则能让经常出镜的主持人始终保持一致的嗓音。其余情况则由AI语音预设来处理。

发布前请审核

审校人员会将源文本与译文并排对照阅读,修正不符合市场需求的内容,并仅对修改后的片段进行重新配音。

无限扩展

无速率限制、无并发配额、无按密钥限流。当版本发布到各个市场时,可并行生成数百个本地化版本。
查看实际效果

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

同一段视频被本地化为法语、德语、葡萄牙语和西班牙语版本:对话部分采用角色克隆后的声音进行翻译,同时保留了原始的背景音频。
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)。

语言和声音

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

交付与集成

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

数据量与吞吐量

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

安全与托管

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

谁会使用视频本地化 API

内置视频的平台

学习管理平台(LMS)和客户教育平台、内容创作者及视频平台、网络研讨会和虚拟活动工具、视频托管及工作流SaaS、数字化采用平台、直播购物。在产品中提供支持区域语言选项的本地化版本,让您的用户无需离开平台即可触达全球受众并开拓新市场。

本地化和制作机构

为多个客户提供本地化服务,每个品牌配有专属术语表,每个项目均设有审核环节。将语言专家审核通过的译文以SRT文件形式提交,并通过单一视频本地化工作流交付配音视频、字幕及可选的唇形同步内容。

内部持续视频制作

国际零售与电子商务、全球特许经营、媒体出版商、企业大学。针对各地区,对营销视频、视频广告、在线学习及产品视频内容进行本地化处理,确保品牌术语保持一致,并在源视频发生变更时创建更新版本。
客户案例

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

用具体数据看看各大公司如何使用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)运营,其“信任中心”会实时公布控制状态。数据驻留选项是企业入驻流程的一部分。

认证

SOC 2 Type II
GDPR
CAI 及 C2PA 成员

加密

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

您的内容

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

访问

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

企业

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

声音权益

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

Rask API 与自行搭建的本地化工作流

视频本地化将翻译、配音、字幕、术语和审校整合到一个制作工作流中。以下是同一工作流的两种实现方式。
您所需的功能
Rask API
拼凑而成的方案
地区语言选项
135种以上语言和地区选项
各厂商对区域设置的支持情况各不相同
各版本中的品牌术语
按语言对划分的带版本号的术语表
您维护的查找和替换脚本
审阅人员已批准的译文
以SRT格式导入,然后配音
手动对齐视频
各市场发言人的声音
即时且可定制的语音克隆
每种语言配备独立的语音供应商
背景音乐与音效
保留在本地化语音中
您构建的音源分离步骤
.srt和.vtt格式字幕
包含
根据您自己的时间轴数据生成
镜头前画面的口型对位
可选,按生成完整视频的次数计费
一个独立的供应商
审阅后修改一行内容
仅对已修改的片段重新配音
重新渲染完整版本
频率限制
无
取决于你合作的最严格供应商的要求
工作流设计与人工质量保证
可通过我们的团队获取
分别招聘和管理
常见问题解答

视频本地化 API:常见问题

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

什么是视频本地化 API?

视频本地化与视频翻译有何不同?

我可以将一个视频本地化为同一语言的多个地区版本吗?

如何确保不同本地化版本中的品牌名称保持一致?

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

该 API 是否支持文化相关的内容?

该 API 会翻译屏幕上的文本吗?

支持哪些语言和地区?

在每个市场中,我能否保留演讲者的声音?

口型同步在本地化工作流程中扮演什么角色?

视频本地化的费用是多少?

拉斯克能协助设计我们的本地化工作流程吗?

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

在一个下午内开始配音

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