用于视频旁白的文本转语音 API

提交带有时间轴的脚本以及视频或音频录音,即可生成与时间轴同步的语音。您可以从语音库中选择AI语音或语音克隆,支持135多种语言和地区选项,并可从同一项目中下载配音、视频和字幕。
脚本转旁白
AI语音和语音克隆
REST + Python SDK
script in, voiceover out
OAuth 2.0
# 1. send your script as timed segments - one speaker per line
curl -X POST https://api.rask.ai/v2/transcriptions \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"segments": [
    {"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
     "src": {"text": "Welcome to the new dashboard.", "lang": "en"},
     "dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}}
  ]}'

# 2. voice the script over your video
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\": \"es-mx\", \"transcript_id\": \"$TRANSCRIPT_ID\"}"
GET /v2/projects/{project_id}
voiceover links
# When status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
  | jq '{status, voiceover, translated_audio, translated_video}'
被全球团队广泛使用
功能特性

文本转语音 API 为视频提供的所有功能

将书面脚本转化为与画面相匹配的配音:为每位发言者匹配合适的嗓音,根据您的片段调整配音时长,并整合背景音效、字幕和翻译,所有内容均整合在一个项目中。可选配嘴型同步功能,费用另计。

您的剧本,朗读版

根据您提供的文本片段或 SRT 文件生成字幕稿,该 API 便会根据该字幕稿生成目标语言的语音内容。

语音库

每个目标语言环境都包含具有固定性别的 AI 语音预设。可通过“voices”端点列出某个项目的语音预设,并根据语音 ID 为每位说话者分配一个语音预设。

自定义语音和语音克隆

在支持语音克隆的语言中,您可以使用已保存的“自定义语音克隆”作为统一的品牌声音,或者通过“即时语音克隆”保留屏幕上发言者本人的声音。

与画面同步

每个片段都有开始和结束时间,因此每句台词都能准确地出现在视频中的相应位置。

角色配音和对话

为每句台词指定一位说话者,并为每位说话者指定一种声音,这样对话或角色配音才能清晰且保持一致。

135种以上语言和地区选项

用一种语言编写脚本,再用另一种语言配音:Rask 负责翻译,并且为每个目标地区都提供 AI 配音服务。

纯人声音轨

对于符合条件的计划,您可以下载无背景音的语音音频(WAV格式),以便自行编辑;或者下载完整混音版本和最终视频。

编辑一行,重新生成一行

修改一个片段的文本或一位说话者的声音,然后重新生成。无需重新录制任何内容,仅对修改过的片段收取费用。

无限扩展

无速率限制、无并发配额、无按键限流。语音长篇内容与完整视频目录可并行处理。
查看实际效果

聆听一幅画作用五种语言讲述的故事

同一段视频配有英语、法语、德语、葡萄牙语和西班牙语的配音,配音与画面同步,且原始背景音效保持不变。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
工作流程

从剧本到配音的三个步骤

创建项目后,系统将开始为您的脚本生成语音。修改文本或语音后,请使用/generate端点。
1

上传视频或音频

请上传与您的旁白对应的视频或音频文件,可以是本地文件或受支持的媒体网址。其时间轴将显示脚本的对白时间点。

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

请发送您的剧本

根据带有时间戳和发言者信息的文本片段,或根据 SRT 文件生成字幕稿,然后使用该字幕稿的 transcript_id 和目标语言创建项目。

POST /v2/transcriptions
3

选择语音并下载

列出配音员名单,为每位配音员分配一个预设或克隆音色,如有需要请重新生成,然后下载配音、视频和字幕文件。

GET /v2/projects/{id}/voices
处理时间因项目而异。该 API 会为整个项目生成语音内容并以文件形式提供,因此更适合已发布的视频,而非实时对话。
以您为中心

需要库中没有的配音吗?请联系我们的团队

品牌声音、目录以外的语言、更高的处理量或您自己的交付方式:当配音整合需要目录以外的内容时,我们的团队会根据您的需求评估可选方案。

语言和声音

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

交付与集成

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

数据量与吞吐量

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

安全与托管

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

谁会在视频中使用文本转语音 API

内置视频的平台

学习管理平台(LMS)和客户教育平台、内容创作与视频平台、网络研讨会和虚拟活动工具、视频托管及工作流SaaS、数字化采用平台、直播购物。让用户无需离开您的产品,即可输入或上传脚本,为视频获取多语言配音。

本地化和制作机构

为客户的视频配音脚本进行审核,可采用AI语音或客户指定的自定义语音,并交付纯语音的WAV文件供您自行混音。审核后如需修改某句台词,只需重新生成该片段即可。

内部持续视频制作

国际零售与电子商务、全球特许经营、媒体出版商、企业大学。根据书面脚本为培训、产品及营销视频录制旁白,并在产品变更时更新文本。
客户案例

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

用具体数据看看各大公司如何使用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)

    script = await client.create_transcription(data=schemas.TranscriptionCreate(segments=[
        schemas.SegmentCreate(speaker="SPEAKER_00", start="00:00:00,500", end="00:00:04,800",
            src=schemas.SegmentTextCreatePatch(text="Welcome to the new dashboard.", lang="en"),
            dst=schemas.SegmentTextCreatePatch(text="Bienvenido al nuevo panel.", lang="es-mx")),
    ]))

    job = await wait(client, await client.create_project(data=schemas.ProjectCreate(
        video_id=VIDEO_ID, dst_lang="es-mx", transcript_id=script.id)))

    # pick a female AI voice preset from the library for SPEAKER_00
    voices = await client.get_project_voices(project_id=job.id)
    preset = next(v for v in voices if v.gender == "female")
    await client.patch_project(project_id=job.id, data=schemas.ProjectPatch(voice={**job.voice, "SPEAKER_00": preset.id}))

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

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

script = requests.post(f"{API}/v2/transcriptions", headers=h, json={"segments": [
        {"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
         "src": {"text": "Welcome to the new dashboard.", "lang": "en"},
         "dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}},
    ]}).json()

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

voices = requests.get(f"{API}/v2/projects/{pid}/voices", headers=h).json()
preset = next(v for v in voices if v["gender"] == "female")
requests.patch(f"{API}/v2/projects/{pid}", headers=h,
               json={"voice": {**project["voice"], "SPEAKER_00": preset["id"]}})
requests.post(f"{API}/v2/projects/{pid}/generate", headers=h)
print(wait(pid)["voiceover"])
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; };

const script = await call('POST', '/v2/transcriptions', { segments: [
  { speaker: 'SPEAKER_00', start: '00:00:00,500', end: '00:00:04,800',
    src: { text: 'Welcome to the new dashboard.', lang: 'en' },
    dst: { text: 'Bienvenido al nuevo panel.', lang: 'es-mx' } },
] });

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

const voices = await call('GET', `/v2/projects/${id}/voices`);
const preset = voices.find((v) => v.gender === 'female');
await call('PATCH', `/v2/projects/${id}`, { voice: { ...project.voice, SPEAKER_00: preset.id } });
await call('POST', `/v2/projects/${id}/generate`);
console.log((await wait(id)).voiceover);
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. your script as an SRT file in the target language
TRANSCRIPT_ID=$(curl -s -X POST "https://api.rask.ai/v2/transcriptions/srt?dst_lang=es-mx" \
  -H "Authorization: Bearer $TOKEN" -F "dst=@script_es-mx.srt" | jq -r .id)

# 3. voice it over the video
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\", \"transcript_id\": \"$TRANSCRIPT_ID\"}" | jq -r .id)

# 4. when status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
  | jq '{status, voiceover, translated_video}'
POST /v2/transcriptions/srt
script from an SRT file
<?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']];

$script = $json($http->post('/v2/transcriptions', ['headers' => $h, 'json' => ['segments' => [[
    'speaker' => 'SPEAKER_00', 'start' => '00:00:00,500', 'end' => '00:00:04,800',
    'src' => ['text' => 'Welcome to the new dashboard.', 'lang' => 'en'],
    'dst' => ['text' => 'Bienvenido al nuevo panel.', 'lang' => 'es-mx'],
]]]]));

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

while ($p['status'] !== 'merging_done') {
    sleep(10);
    $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $p['voiceover'];
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 具体到足以直接向您自己的用户展示。
Voice options in a project, es-mx
GET /v2/projects/{project_id}/voices
{"label": "Renata",      "gender": "female", "sample_src": "https://..."}   AI voice preset
{"label": "Gerardo",     "gender": "male",   "sample_src": "https://..."}   AI voice preset
{"label": "Maria Lopez", "gender": "auto",   "sample_src": "https://..."}   custom voice clone
{"label": "Voice Clone", "gender": "auto",   "sample_src": null}            instant voice clone

或者完全跳过轮询

将地址指向一个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
您存储的原始文件,供参考
控制

修改一行或一个语音,仅重新生成该部分

您的脚本以片段形式存储。编辑一行文本或更改一位说话者的声音后,重新生成,系统仅对已修改的片段计费,每次运行最低计费单位为一分钟。

片段级编辑

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

术语词汇表

术语词汇表
当 Rask 将您的脚本翻译成其他语言时,术语表会确保品牌名称和技术术语在每个版本中保持一致,或者根据需要保留原文表述。

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

支持的文件格式

请上传您配音所对应的视频(支持任何格式),或提供视频链接。字幕文件可通过 API 以文本片段形式提交,或以 SRT 文件形式提交。

视频

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
拼凑而成的方案
与视频同步的脚本
带有开始和结束时间的片段
你自己的对齐逻辑
为每位发言者或角色配音
每个项目的语音映射
按请求管理的语音ID
一致的品牌声音
自定义声音克隆
一家独立的克隆服务商
同一脚本的其他语言版本
同一项目中的翻译
翻译 API 以及新的计时功能
背景音乐与音效
在画外音的伴奏下混音
您自己的混音步骤
.srt和.vtt格式字幕
包含
根据您自己的时间轴数据生成
纯人声音轨
符合条件的计划中的WAV
由您自行拼接的音频片段
修改一行
重新生成已修改的片段
对该文件进行重新合成和重新混音
频率限制
无
由您的提供商制定的任何规则
支持流媒体的真人客服
使用流式文本转语音(TTS)API
为此而生
常见问题解答

文本转语音 API:常见问题

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

Rask 提供语音合成 API 吗?

我可以用它来处理语音客服或呼叫中心吗?

该 API 是否支持音频流输出?

我该如何提交剧本?

有哪些语音可供选择?

我可以使用自定义语音吗?

支持哪些语言?

是否支持 SSML 标签或自定义发音?

我能控制情绪和表达方式吗?

生成语音需要视频吗?

是按字符计价吗?

有免费套餐或免费积分吗?

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

在一个下午内开始配音

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