适用于翻译视频的语音克隆 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的所有功能

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

即时声音克隆

每个发言者都能获得源视频中他们自己声音的克隆版,无需录制音频样本。在支持的目标语言中默认分配。

自定义声音克隆

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

每位发言者一个声音

发言者会自动分离,每个人都保留自己克隆的声音,因此采访、座谈会和播客依然易于收听。

对口型

在任何完成的项目中,将口型动作与克隆的声音相匹配,作为可选任务,单独计费。人脸检测会优先运行,因此你只在适用的地方应用它。

保留背景音频

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

AI语音预设

对于没有声音克隆功能的语言,或者当库存声音更合适时,为任何发言者选择具有固定性别的AI语音预设。

跨语言的声音辨识度

克隆版以原发言者的声音说西班牙语、法语或日语听起来依然像原演讲者,从而向全球观众展现原汁原味的声线。

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

为发言者分配不同的声音并重新生成。仅对更改的片段计费,因此无需任何人重新录制任何内容。

无限扩展

无速率限制、无并发配额、无每个密钥的限制。以任何体量,并行使用克隆声音为你完整的目录配音。
查看实际效果

聆听五种语言中的同一位发言者

英语原声,然后是法语、德语、葡萄牙语和西班牙语的克隆声音。每个发言者都保留自己的声音,背景音频保持不变。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
工作流程

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

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

上传视频

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

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

创建项目

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

POST /v2/projects
3

分配声音并重新配音

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

PATCH /v2/projects/{project_id}
处理时间因项目而异。当您更改说话者的声音时,系统只会对该说话者的片段进行重新配音并计费。
以您为中心

需要目录以外的配音吗?请联系我们的团队

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

语言和声音

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

交付与集成

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

数据量与吞吐量

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

安全与托管

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

谁会使用语音克隆API

内置视频的平台

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

本地化和制作机构

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

内部持续视频制作

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

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

用具体数据看看各大公司如何使用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 框架下运营,其信任中心会实时发布控制状态。定制声音克隆是在经过说话者同意的情况下创建的,为了确保数据安全,您的音频绝不会用于训练通用模型。

认证

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
拼凑而成的方案
克隆源视频中的每个说话者
默认提供即时声音克隆
收集并上传每个说话者的样本
可重复使用的定制声音
通过 voice_id 使用定制声音克隆
您自己构建并维护的语音库
转录、翻译、合成、混音
单一 API
需要三到四个供应商以及连接它们的复杂代码
说话者检测,每个说话者对应一个声音
包含
一个说话人分离供应商加上您自己编写的声音分配逻辑
保留背景音乐和音效
包含
需要您自行构建和调优的音源分离步骤
不支持声音克隆的语言
AI语音预设
其他文字转语音服务商
对口型
可选,单独计费
一个独立的供应商
更改其中一个说话者的声音
重新为此说话者配音,仅按修改的片段计费
重新运行整个文件的处理流程
频率限制
无
取决于你合作的最严格供应商的要求
目录之外的声音或语言
与我们的团队协商
取决于各个供应商
常见问题解答

声音克隆 API:常见问题

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

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

语音克隆功能在API中是如何工作的?

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

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

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

哪些语言支持声音克隆?

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

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

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

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

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

当您拥有源视频的版权并获得说话人的同意时,您可以在商业内容中发布使用克隆声音的配音视频。有关适用于您方案的详细信息,请查阅Rask服务条款。

声音克隆的费用是多少?

在一个下午内开始配音

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