用于翻译视频的语音克隆API

当你的视频使用其他语言时,保留每位发言者的原声。该API会自动从源视频中克隆每个声音,或使用你创建过的一次性自定义语音克隆,并返回带有克隆语音、音轨和字幕的配音视频。
即时语音克隆
自定义语音克隆
REST + Python SDK
clone, assign, re-dub
OAuth 2.0
# 1. create the dub - each speaker gets an Instant Voice Clone by default
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"}'

# 2. list the voices available in this project
curl https://api.rask.ai/v2/projects/$ID/voices \
  -H "Authorization: Bearer $TOKEN"
#  "label": "Voice Clone", "gender": "auto"         instant clone
#  "label": "Maria Lopez", "sample_src": "https://..."  your custom clone

# 3. assign your custom clone - include every speaker in the map
curl -X PATCH https://api.rask.ai/v2/projects/$ID \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"voice": {"SPEAKER_00": "<custom_voice_id>", "SPEAKER_01": "<voice_id>"}}'
GET /v2/projects/{project_id}
polling, 10s
# 4. re-dub with the new voices, then poll until merging_done
curl -X POST https://api.rask.ai/v2/projects/$ID/generate \
  -H "Authorization: Bearer $TOKEN"
while :; do
  curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq .status
  sleep 10
done
受到全球团队的信赖
功能特性

语音克隆API的所有功能

在每个翻译版本和多种语言中,克隆源视频中的每个发言者,或者使用你创建过的一次性自定义语音克隆。为不支持语音克隆的语言选择人工智能语音预设。可添加可选的唇形同步功能,需单独计费。

即时语音克隆

每位发言者都会获得源视频中他们自己声音的克隆版,无需录制音频样本。在支持的目标语言中,系统会默认指定此功能。

自定义语音克隆

使用清晰的音频样本在Rask应用中创建一个可重复使用的声音,或者将现有项目中的发言者声音保存到你的语音克隆库中。在征得发言者同意的前提下,可在支持的目标语言的各个API项目中重复使用该声音。

每位发言者一个声音

系统会自动分离发言者,每个人都会保留自己的克隆声音,因此访谈、座谈会和播客依然清晰易懂。

对口型

在任何已完成的项目中,将口型动作与克隆的声音进行匹配是一项可选任务,需单独计费。系统会首先进行人脸检测,因此你只需将其应用在有效的地方。

保留背景音频

音乐、房间音调和效果音与语音分离,并重新混合到克隆的声音下方,因此最终结果保留了原始制作的音质。

人工智能语音预设

对于不支持语音克隆的语言,或者当预设声音更合适时,可为任何发言者选择带有固定性别的人工智能语音预设。

跨语言的语音辨识度

克隆版可以用原发言者的声音说西班牙语、法语或日语,因此对于全球观众来说,主持人听起来依然是那个人。

更换声音,重新为一位发言者配音

为某位发言人分配不同的声音,然后重新生成。只有发生变化的片段才会计费,因此无需任何人重新录制。

无限扩展

无速率限制、无并发配额、无按键限流。您可以并行使用克隆的语音为整个目录配音,音量不限。
查看实际效果

听一位演讲者用五种语言发言

首先是英语的原始语音,随后是法语、德语、葡萄牙语和西班牙语的克隆语音。每位说话者都保留了自己的声音,背景音频也保持不变。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
工作流程

从源视频到克隆声音的三个步骤

创建项目后,系统会立即使用即时声音克隆开始配音。更改声音或编辑脚本后,请使用 /generate 端点。
1

上传视频

以多部分表单数据形式发送文件,或发布来自YouTube、Google Drive、S3、Vimeo或任何直接URL的链接。此视频中的语音将作为每个即时声音克隆的语音样本。

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

创建项目

将媒体ID作为 video_id 传递并指定目标语言。每个检测到的发言人都会在支持的语言中获得一个即时声音克隆,配音将立即开始。

POST /v2/projects
3

分配声音并重新配音

列出项目的声音,为任意发言人分配自定义克隆或预设,然后调用 /generate,并在配音完成后下载文件。

PATCH /v2/projects/{project_id}
处理时间因项目而异。当您更改发言人的声音时,系统只会对该发言人的片段进行重新配音并计费。
为您量身打造

需要目录之外的声音?请联系我们的团队

对于尚不支持的语言的声音克隆、更大的自定义声音库或您自己的交付方式:当语音项目需要公共目录之外的内容时,我们的团队会评估您的需求和可行方案。

语言与声音

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

交付与集成

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

批量与处理量

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

安全与托管

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

谁在集成声音克隆API

内置视频的平台

学习管理系统与客户教育平台、创作者与视频平台及其移动应用、网络研讨会与虚拟活动工具、视频托管与工作流SaaS、数字采用平台以及直播购物。让创作者和讲师在所有支持的声音克隆语言中保持他们自己的声音。为其他目标语言使用人工智能语音预设,并将多语言配音打造为您平台的功能。

本地化和制作机构

为每个客户视频提供使用原始演讲者声音的定制配音。为每个常驻演讲者保留一个自定义声音克隆(需获得授权),并通过API在每个项目中重复使用,无需任何人重新录制。

企业内部持续视频制作

国际零售与电子商务、全球连锁企业、媒体出版商、企业大学。培训师、高管和产品专家只需录制一次,即可在支持的目标语言中使用其克隆的声音,并在培训视频、产品更新和内部消息的其他市场版本中使用人工智能语音预设。
客户案例

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

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

声音克隆API代码示例

每种语言提供一个完整的示例:身份验证、上传、使用即时声音克隆进行配音、为发言人分配自定义克隆、重新配音以及下载。
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas

async def wait(client, job):
    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)

    # first dub: every speaker gets an Instant Voice Clone
    job = await wait(client, await client.create_project(
        data=schemas.ProjectCreate(video_id=video.id, dst_lang="es-mx")))

    # assign a custom clone to SPEAKER_00, keep the other speakers as they are
    voices = await client.get_project_voices(project_id=job.id)
    custom = next(v for v in voices if v.label == "Maria Lopez")
    voice_map = {**job.voice, "SPEAKER_00": custom.id}
    await client.patch_project(project_id=job.id, data=schemas.ProjectPatch(voice=voice_map))

    job = await wait(client, await client.generate_project(project_id=job.id))
    print(job.translated_video, job.voiceover)

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}"}

def wait(pid):
    while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
        time.sleep(10)
    return p

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()

pid = requests.post(f"{API}/v2/projects", headers=h,
                    json={"video_id": video["id"], "dst_lang": "es-mx"}).json()["id"]
project = wait(pid)

voices = requests.get(f"{API}/v2/projects/{pid}/voices", headers=h).json()
custom = next(v for v in voices if v["label"] == "Maria Lopez")
voice_map = {**project["voice"], "SPEAKER_00": custom["id"]}   # every speaker stays in the map

requests.patch(f"{API}/v2/projects/{pid}", headers=h, json={"voice": voice_map})
requests.post(f"{API}/v2/projects/{pid}/generate", headers=h)
print(wait(pid)["translated_video"])
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 wait = async (id) => { let p; while ((p = await call('GET', `/v2/projects/${id}`)).status !== 'merging_done') await sleep(10000); return p; };

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

const { id } = await call('POST', '/v2/projects', { video_id: video.id, dst_lang: 'es-mx' });
const project = await wait(id);

const voices = await call('GET', `/v2/projects/${id}/voices`);
const custom = voices.find((v) => v.label === 'Maria Lopez');
await call('PATCH', `/v2/projects/${id}`, { voice: { ...project.voice, SPEAKER_00: custom.id } });
await call('POST', `/v2/projects/${id}/generate`);

console.log((await wait(id)).translated_video);
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. create the dub - Instant Voice Clones are assigned by default
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\": \"es-mx\"}" | jq -r .id)

# 3. after merging_done: read the current voice map and the voice options
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq .voice
curl -s https://api.rask.ai/v2/projects/$ID/voices -H "Authorization: Bearer $TOKEN" | jq '.[] | {id, label, gender}'

# 4. assign voices for every speaker, then re-dub
curl -s -X PATCH https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -d '{"voice": {"SPEAKER_00": "<custom_voice_id>", "SPEAKER_01": "<voice_id>"}}'
curl -s -X POST https://api.rask.ai/v2/projects/$ID/generate -H "Authorization: Bearer $TOKEN"
PATCH /v2/projects/{id}
OAuth 2.0 client credentials
<?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']];

$wait = function ($id) use ($http, $h, $json) {
    do { sleep(10); $p = $json($http->get("/v2/projects/$id", ['headers' => $h])); }
    while ($p['status'] !== 'merging_done');
    return $p;
};

$id = $json($http->post('/v2/projects', ['headers' => $h,
    'json' => ['video_id' => $videoId, 'dst_lang' => 'es-mx']]))['id'];
$project = $wait($id);

$voices = $json($http->get("/v2/projects/$id/voices", ['headers' => $h]));
$custom = current(array_filter($voices, fn($v) => $v['label'] === 'Maria Lopez'));
$map = array_merge($project['voice'], ['SPEAKER_00' => $custom['id']]);

$http->patch("/v2/projects/$id", ['headers' => $h, 'json' => ['voice' => $map]]);
$http->post("/v2/projects/$id/generate", ['headers' => $h]);
echo $wait($id)['translated_video'];
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格式翻译字幕的配音视频。在符合条件的套餐中,您还可以单独下载WAV格式的克隆声音轨,或与原始背景音频混合的音轨。
字段
格式
说明
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 与您自主搭建的语音处理流程对比

文字转语音克隆 API 可以为发送的文本配音。而翻译视频中的克隆声音还需要经过转写、翻译、说话人分离、时间轴调整和混音。以下是实现相同结果的两种不同方式。
您需要什么
Rask API
从零散部件拼凑
克隆源视频中的每一位说话人
默认即时声音克隆
收集并上传每位说话人的样本
可重复使用的定制声音
通过 voice_id 实现定制声音克隆
您自己构建并维护的语音库
语音转文字、翻译、合成、混音
一个 API
三到四个供应商以及它们之间的代码
说话人检测及每人对应一个声音
包含
说话人分离供应商加上您自己的声音分配逻辑
保留背景音乐和音效
包含
由您自行构建和调优的源分离步骤
不支持声音克隆的语言
人工智能语音预设
其他文字转语音供应商
对口型
可选,单独计费
独立的供应商
更改其中一位说话人的声音
重新为该说话人配音,仅按修改的片段计费
为整个文件重新运行处理流程
速率限制
无
无论您的供应商有多严格
目录之外的语音或语言
与我们的团队讨论
取决于各个供应商
常见问题解答

声音克隆 API:常见问题

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

是否有用于声音克隆的 API?

API 的声音克隆功能是如何工作的?

即时声音克隆与定制声音克隆有什么区别?

我可以通过 API 创建定制声音克隆吗?

自定义声音克隆需要什么样的音频?

哪些语言支持声音克隆?

我能将声音克隆API用作文字转语音吗?

配音完成后,如何更改说话者的声音?

我可以保存多少个自定义声音?

克隆声音需要征得同意吗?

克隆的声音能保留说话者的情感和口音吗?

我可以将克隆的声音用于商业用途吗?

声音克隆的费用是多少?

在一个下午内开始配音

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