用于视频配音的文字转语音API

发送带有视频或音频录制的定时脚本,生成与时间轴对齐的语音。从声音库或声音克隆中选择135多种语言和地区的人工智能声音,并在同一个项目中下载配音、视频和字幕。
脚本转配音
人工智能声音与声音克隆
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会为目标语言中的该精确脚本生成语音。

声音库

每个目标区域都有预设性别的人工智能声音预设。通过声音端点为项目列出这些声音,并通过声音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 更适合已发布的视频,而不是实时对话。
为您量身打造

找不到所需的声音?请联系我们的团队

品牌专属声音、目录之外的语言、更高吞吐量或您自己的交付方式:当配音集成需要公共目录之外的内容时,我们的团队会评估您的需求和可用选项。

语言与声音

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

交付与集成

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

批量与处理量

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

安全与托管

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

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

内置视频的平台

学习管理系统与客户教育平台、创作者与视频平台、网络研讨会与虚拟活动工具、视频托管与工作流 SaaS、数字采用平台、直播带货。让用户无需离开您的产品,即可输入或上传剧本并获取多语言视频配音。

本地化和制作机构

使用人工智能声音或客户的自定义声音为客户视频批准剧本配音,并交付纯语音 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 个月轮换一次

您的内容

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

访问

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

企业

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

声音权益

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

Rask API 与您自己搭建的配音流程对比

流式文本转语音 API 可以将文本转换为音频字节以便实时使用。而已发布视频的配音还需要时间轴、每个说话人的声音、混音、字幕以及通常所需的翻译。以下是同一段配音的两种制作方式。
您需要什么
Rask API
从零散部件拼凑
与视频时间匹配的文稿
带有开始和结束时间的片段
您自己的对齐逻辑
为每个发言人或角色分配声音
每个项目的声音映射
按请求管理的声音 ID
保持一致的品牌声音
自定义语音克隆
单独的声音克隆供应商
其他语言的相同文稿
在同一项目中进行翻译
翻译 API 加上新的时间轴
背景音乐和音效
在配音下方进行混音
您自己的混音步骤
.srt 和 .vtt 格式字幕
包含
根据您自己的时间数据生成
纯语音音频轨道
符合条件的套餐支持 WAV 格式
需要您自行拼接的音频块
修改某一行
重新生成更改的片段
重新合成并混音文件
速率限制
无
无论您的服务提供商执行何种规则
支持流式传输的实时语音代理
使用流式文字转语音API
为此而生
常见问题解答

文字转语音API:常见问题

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

Rask提供文字转语音API吗?

我可以将其用于语音代理或呼叫中心吗?

该API支持流式音频输出吗?

如何发送我的脚本?

有哪些可用声音?

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

支持哪些语言?

你们支持SSML标签或自定义发音吗?

我可以控制情感和表现力吗?

生成语音必须需要视频吗?

收费是按字符计算的吗?

有免费层级或免费额度吗?

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

在一个下午内开始配音

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