用于翻译后 SRT 和 VTT 文件的字幕 API

只需上传一次视频,即可获取与口语内容时间完美同步的、每种目标语言的SRT和WebVTT字幕文件。通过API修正任意行,然后下载更新后的文件,用于您的播放器、应用或视频编辑软件。
SRT和WebVTT
135种以上语言和地区选项
REST + Python SDK
upload, create, download
OAuth 2.0
# 1. upload the video once - YouTube, Drive, S3, Vimeo or direct URL
curl -X POST https://api.rask.ai/api/library/v1/media/link \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"link": "https://example.com/onboarding.mp4", "name": "onboarding"}'

# 2. one project per subtitle language
for lang in es-mx fr-fr ja-jp; 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\"}"
done
GET /v2/projects/{project_id}
.srt + .vtt
# When status is merging_done, download both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o onboarding.es-mx.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o onboarding.es-mx.vtt "$(echo $P | jq -r .translation_vtt_path)"
被全球团队广泛使用
功能特性

字幕API返回的所有内容

从视频或音频录音(包括播客和采访)中创建翻译后的SRT和WebVTT文件。为每个项目选择目标语言,即可获取字幕文件以及文稿、翻译和配音内容。

SRT和WebVTT文件

每个完成的项目都会返回目标语言的.srt文件和.vtt文件:SRT适用于视频编辑软件和绝大多数平台,WebVTT适用于网页视频播放。

其他语言的字幕

打破各个市场的观众的语言障碍:通过同一次上传,为每个目标语言(如es-mx、pt-br或fr-ca)创建一个项目。源语言会自动检测。

与口语内容精准同步

每个字幕都对应一个带有开始和结束时间的文稿片段,因此每一行都会在被说出的同时显示在屏幕上。

原文语言字幕

文稿包含带有时间戳的每个片段的源文本。只需几行代码,即可将其转换为SRT或VTT文件,用于同语言字幕。

对话的发言人标签

每个文稿片段都带有发言人标签,因此您可以为采访、座谈会和对话的字幕添加发言人身份标识。

发布前编辑行内容

通过API修正任意片段的文本或时间并重新生成。模糊不清的词语、姓名和口音只需修正一次,即可应用到所有格式中。

各种语言的术语保持一致

术语表可确保产品名称和技术术语在所有字幕语言中保持一致,或者有意保持为原文语言。

字幕和配音版本

同一个项目还会返回翻译后的视频和音频轨道,因此只需上传一次即可获得字幕和配音版本。

无限扩展

无速率限制、无并发配额、无每密钥限流。可同时为您的整个视频库生成所有目标语言的字幕。
查看实际效果

一个视频,五个语言版本

相同的片段支持英语、法语、德语、葡萄牙语和西班牙语。每个语言版本都附带专属的 SRT 和 VTT 字幕文件。
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

下载字幕文件

持续读取状态,直到显示 merging_done,然后下载 .srt 和 .vtt 文件并保存在本地。

GET /v2/projects/{project_id}
处理时间取决于视频长度、说话人数以及目标语言。在一次实际测试中,一个 3 分 47 秒的视频在 165 秒内完成了处理。
以您为中心

需要列表中未列出的字幕格式或交付方式吗?请联系我们的团队

无论是其他字幕格式、交付到您自己的存储空间、目录之外的语言还是更高的吞吐量,我们的团队都能评估您的制作工作流程需求并提供可用选项。

语言和声音

需要公开目录以外的语言字幕?请将您的需求和可用选项告知我们的团队。

交付与集成

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

数据量与吞吐量

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

安全与托管

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

谁会使用字幕API

内置视频的平台

学习管理系统(LMS)和客户教育平台、创作者与视频平台、网络研讨会与虚拟活动工具、视频托管与工作流 SaaS、数字采用平台以及直播购物。让每种语言的字幕成为您视频上传功能的一部分。

本地化和制作机构

只需上传一次,即可为每个客户提供 SRT 和 VTT 文件。审阅者通过 API 修正文案,文件即可自动更新,无需重新调整时间轴。

内部持续视频制作

国际零售与电商、全球连锁企业、媒体出版商、企业大学。让培训和产品视频内容触达每个市场,并方便无声观看的受众。
客户案例

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

用具体数据看看各大公司如何使用Rask进行视频本地化。
箭头
箭头
代码

字幕 API 代码示例

每种语言的完整示例:上传视频、为每种语言创建一个字幕项目、等待处理完成,然后保存 .srt 和 .vtt 文件,或将其添加到 HTML5 播放器中。
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio, urllib.request
from rask_sdk import clients, enums, schemas

LANGS = ["es-mx", "fr-fr", "ja-jp"]

async def subtitle(client, video_id, lang):
    job = await client.create_project(data=schemas.ProjectCreate(video_id=video_id, dst_lang=lang))
    while job.status is not enums.ProjectStatus.MERGING_DONE:
        await asyncio.sleep(10)
        job = await client.get_project(project_id=job.id)
    # links are presigned for one hour - save the files right away
    urllib.request.urlretrieve(job.translation_srt_path, f"video.{lang}.srt")
    urllib.request.urlretrieve(job.translation_vtt_path, f"video.{lang}.vtt")

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
    media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://example.com/onboarding.mp4"))
    while media.status is enums.MediaStatus.PROCESSING:
        await asyncio.sleep(5)
        media = await client.get_media(media_id=media.id)
    await asyncio.gather(*(subtitle(client, media.id, l) for l in LANGS))

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

pid = requests.post(f"{API}/v2/projects", headers=h,
                    json={"video_id": VIDEO_ID, "dst_lang": "de-de"}).json()["id"]
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
    time.sleep(10)

# translated subtitles: download the files
open("video.de-de.vtt", "wb").write(requests.get(p["translation_vtt_path"]).content)

# original-language captions: build a WebVTT file from the transcript segments
segs = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
cues = [f"{s['start'].replace(',', '.')} --> {s['end'].replace(',', '.')}\n{s['src']['text']}" for s in segs]
open("video.en.vtt", "w").write("WEBVTT\n\n" + "\n\n".join(cues) + "\n")
requests + polling
same-language captions
// no dependencies, Node 18+ global fetch
import { writeFile } from 'node:fs/promises';
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 langs = ['es-mx', 'pt-br', 'ko-kr'];
const tracks = await Promise.all(langs.map(async (dst_lang) => {
  let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang });
  while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
  const file = `subs/${dst_lang}.vtt`;
  await writeFile(file, await ((await fetch(p.translation_vtt_path)).text()));
  return `<track kind="subtitles" srclang="${dst_lang}" src="/${file}">`;
}));
console.log(tracks.join('\n'));   // paste inside your <video> element
fetch, Node 18+
HTML5 track elements
# 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 project for one subtitle language
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\": \"it-it\"}" | jq -r .id)

# 3. wait for merging_done
until [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" = merging_done ]; do
  sleep 10
done

# 4. save both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o video.it-it.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o video.it-it.vtt "$(echo $P | jq -r .translation_vtt_path)"
download .srt and .vtt
shell script
<?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']];

foreach (['es-mx', 'tr-tr'] as $lang) {
    $p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
        'video_id' => $videoId, 'dst_lang' => $lang]]));
    while ($p['status'] !== 'merging_done') {
        sleep(10);
        $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
    }
    // presigned links, valid for one hour
    file_put_contents("video.$lang.srt", file_get_contents($p['translation_srt_path']));
    file_put_contents("video.$lang.vtt", file_get_contents($p['translation_vtt_path']));
}
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">
输出结果

优先获取字幕文件,其他内容同步进行

每个完成的项目都会提供两种字幕格式、背后的转写片段以及配音媒体。下载链接经过预签名且在一小时内有效,请及时将文件复制到您自己的存储空间。
字段
格式
说明
translation_srt_path
.srt
目标语言字幕,适用于剪辑软件和大多数视频平台
translation_vtt_path
.vtt
用于 HTML5 视频播放和网页播放器的 WebVTT 字幕
/transcription
JSON
每个片段的原文、翻译、发言人标签和时间戳
translated_video
MP4
配音视频(如果您还发布了语音版本)
translated_audio
WAV
将翻译后的语音与原始音乐和音效进行混音
original_video
MP4
您存储的原始文件,供参考
控制

修改一行字幕,只需重新生成该部分

字幕来自转写片段。您可以编辑某一行文本或时间,然后重新生成,字幕文件和配音版本会同时更新。费用按修改的片段计算,每次运行最低一分钟。

片段级编辑

片段级编辑
每个项目都将其转写公开为可寻址的片段,因此只需一个补丁请求即可修复错别字或延迟的字幕。
获取文稿及其片段
修改源文本,我们将为您重新翻译
直接修改翻译后的文本以保留您自己的用语
调整时间戳、添加片段、删除片段
重新分配与任意发言人关联的语音

术语词汇表

术语词汇表
附加术语表,确保品牌名称和专业术语在各种语言的字幕中保持一致,或者故意保留原语言。

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

支持的文件格式

上传支持的视频或音频录音,或使用支持的媒体链接。为每个目标语言创建一个项目并下载其 SRT 和 WebVTT 文件。

视频

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
拼凑而成的方案
带时间戳的转写
包含
语音转文字 API
其他语言的字幕
135种以上语言和地区选项
翻译 API 加重新对时
导出 SRT 和 WebVTT
每个项目中均包含这两种格式
您自己的文件编写器
术语一致
术语表
自定义后处理
纠正一行内容
发送一个补丁请求,然后重新生成
手动编辑每个文件
同一视频的配音版本
包含在同一个项目中
文本转语音供应商加上您自己的混音
频率限制
无
由您的服务商决定
字幕已嵌入视频中
在Rask网页应用中,API暂不支持
您自己的视频渲染
字体、大小和布局
在您的视频播放器中设置
在您的视频播放器中设置
常见问题解答

字幕API:常见问题

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

Rask有字幕API吗?

API返回哪些字幕格式?

我可以获取原始语言的字幕吗?

支持哪些语言?

API可以将字幕嵌入视频中吗?

我可以更改字幕的字体、大小或布局吗?

字幕会描述音乐和音效吗?

能识别不同的说话人吗?

如何修改字幕行?

下载链接的有效期是多久?

我可以使用自己的字幕吗?

字幕API是如何计费的?

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

在一个下午内开始配音

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