用于翻译后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 秒内处理完成。
为您量身打造

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

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

语言与声音

需要公共目录以外语言的字幕?请与我们的团队沟通您的需求和可用选项。

交付与集成

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

批量与处理量

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

安全与托管

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

谁在使用字幕 API

内置视频的平台

学习管理系统与客户培训平台、创作者与视频平台、网络研讨会与虚拟活动工具、视频托管与工作流程 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 个月轮换一次

您的内容

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

访问

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

企业

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

声音权益

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

Rask API 与您自己构建的字幕处理流程对比

另一种语言的字幕需要经过转写、翻译、时间轴对齐和文件导出。以下是实现相同结果的两种方式。
您需要什么
Rask API
从零散部件拼凑
带有时间戳的转写
包含
语音转文本API
其他语言字幕
135种以上的语言和地区选项
翻译 API 加上重新对齐时间轴
导出 SRT 和 WebVTT
每个项目均包含这两种格式
您自己的文件编写器
术语一致
词汇表
自定义后处理
纠正一行内容
发送一次修补请求,然后重新生成
手动编辑每个文件
同一视频的配音版本
包含在同一个项目中
文本转语音 (TTS) 供应商加上您自己的混音
速率限制
无
由您的供应商规定
内嵌到视频中的字幕
目前仅在 Rask 网页端应用中可用,暂不支持 API
您自己的视频渲染
字体、大小和排版
在您的视频播放器中设置
在您的视频播放器中设置
常见问题解答

字幕 API:常见问题

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

Rask 提供字幕 API 吗?

API 返回哪些字幕格式?

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

支持哪些语言?

API 可以将字幕烧录到视频中吗?

我可以更改字幕的字体、大小或排版吗?

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

会识别说话人吗?

如何修改字幕行?

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

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

字幕 API 如何计费?

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

在一个下午内开始配音

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