为资料库中的每个视频提供视频转文字API

发送视频文件或YouTube、Google Drive和Vimeo链接,即可获取带有说话人标签和时间戳的可搜索文字记录,支持75种语言和自动语言检测。您可以转写单个视频或整个资料库,然后将文字记录和字幕翻译给全球观众。
文件和视频链接
批量转写
REST + Python SDK
link in, transcript out
OAuth 2.0
# 1. send the video as a link - YouTube, Google Drive, Vimeo, S3 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://youtu.be/...", "name": "camera review"}'

# 2. create the project - the language of the video is detected automatically
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\"}"
GET /v2/projects/{project_id}/transcription
plain text
# The transcript as plain text with timestamps and speakers
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
  | jq -r '.segments[] | "\(.start) \(.speaker): \(.src.text)"'
被全球团队广泛使用
功能特性

视频转文字API的功能

发送视频文件或链接,即可为资料库中的每个视频获取包含说话人和时间戳的文字记录。同一个项目即可将每份文字记录转化为翻译、字幕和配音版本。

通过文件或链接转写视频

上传视频文件或发布YouTube、Google Drive、Vimeo、S3或直接链接。API会自动获取视频,无需您自行下载。

多说话人识别与标注

访谈、圆桌会议和网络研讨会等包含多位说话人的内容,会在每个片段上附带说话人标签,让您随时了解谁说了什么。

自动语言检测

支持将75种源语言的视频转写为文字(包括英语)。无需指定源语言,系统会自动检测每个视频的语言。

可搜索的文字记录

每个片段都有开始和结束时间,方便用户搜索视频中的文字内容,并直接跳转到特定短语说出的那一刻。

多语言文字记录

每个片段还包含135种以上语言和地区选项的翻译,因此一份文字记录即可服务于使用其他语言的全球受众。

.srt和.vtt格式字幕

每个项目还会返回目标语言的字幕文件,并与片段精准对齐,方便听障人士或静音观看的观众使用。

纯文本或结构化数据

以JSON片段形式读取文字记录,或将文本合并为纯文本,用于搜索索引、文章、节目简介和笔记。

纠正专业术语

通过API修复任意片段中的名称、产品术语和专业词汇。词汇表可确保文字记录翻译时术语保持一致。

无限扩展

无速率限制,无并发配额,无单密钥节流。可同时对多个视频或整个资料库进行批量转写。
查看实际效果

从一个文字记录转为五个语言版本

这段视频的文字记录已被翻译为英语、法语、德语、葡萄牙语和西班牙语版本,每个版本都带有字幕和原始背景音频。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
工作流程

从视频链接到文字记录的三个请求

创建项目时会依次进行转写、翻译、生成字幕和配音版本。校对完文字记录后,请使用 /generate 端点。
1

发送视频

以多部分表单数据上传视频文件,或发布 YouTube、Google Drive、Vimeo、S3 或直接链接。在产生任何费用之前,你将获得媒体 ID 和视频元数据。

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

创建项目

将媒体 ID 作为 video_id 传递,并设置目标语言。源语言留空则自动检测语言。转写将立即开始。video_id

POST /v2/projects
3

阅读文稿

在文字记录片段可用时立即读取,以便在翻译媒体继续处理的同时开始为录音建立索引。项目完成后,下载字幕和媒体文件。

GET /v2/projects/{id}/transcription
转写适用于录制的视频,不适用于实时直播。处理时间取决于视频长度和发言人数:在一次观察到的运行中,一个 3 分 47 秒的视频在 165 秒内完成了处理。
以您为中心

有大批量转写需求,或是需要我们未列出的语言?请联系我们的团队

大批量转写、列表之外的源语言、搜索索引所需的文字记录格式,或交付到你自己的存储空间:我们的团队将评估你的需求和可用选项。

语言和声音

需要公共目录之外的源语言?请联系我们的团队,了解你的需求和可用选项。

交付与集成

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

数据量与吞吐量

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

安全与托管

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

谁在使用视频转写 API

内置视频的平台

LMS 和客户教育平台、创作者与视频平台、网络研讨会和虚拟活动工具、视频托管与工作流 SaaS、数字采用平台、直播购物。为上传的视频添加可搜索的文字记录和字幕,作为你产品的一项功能。

本地化和制作机构

批量转写客户视频,向审核人员提供带发言人标签的文字记录,并通过同一项目交付字幕和翻译。

内部持续视频制作

国际零售与电商、全球连锁企业、媒体出版商、企业大学、内容创作者。让每个视频都可搜索、易访问,并重复使用文字记录来制作文章和简介。
客户案例

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

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

视频转写 API 代码示例

每种语言的一个完整示例:通过链接或文件发送视频,等待处理,然后保存纯文本文字记录或按时间戳进行搜索。
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas

VIDEOS = ["https://youtu.be/aaa", "https://youtu.be/bbb", "https://vimeo.com/123"]

async def transcribe(client, i, link):
    media = await client.create_media_link(data=schemas.MediaCreateLink(link=link))
    while media.status is enums.MediaStatus.PROCESSING:
        await asyncio.sleep(5)
        media = await client.get_media(media_id=media.id)
    job = await client.create_project(data=schemas.ProjectCreate(video_id=media.id, dst_lang="en-us"))
    while job.status is not enums.ProjectStatus.MERGING_DONE:
        await asyncio.sleep(10)
        job = await client.get_project(project_id=job.id)
    t = await client.get_project_transcription(project_id=job.id)
    with open(f"video_{i}.txt", "w") as f:   # plain text, one segment per line
        f.write("\n".join(f"{s.speaker}: {s.src.text}" for s in t.segments))

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
    await asyncio.gather(*(transcribe(client, i, v) for i, v in enumerate(VIDEOS)))   # no rate limits

asyncio.run(main())
github.com/braskai/rask-sdk
bulk, async
import os, 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}"}

media = requests.post(f"{API}/api/library/v1/media/link", headers=h,
                      json={"link": "https://youtu.be/..."}).json()

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

while project["status"] != "merging_done":
    time.sleep(10)
    project = requests.get(f"{API}/v2/projects/{project['id']}", headers=h).json()

print(project["translated_video"])
requests
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());

let media = await call('POST', '/api/library/v1/media/link', { link: 'https://drive.google.com/file/d/...' });
while (media.status === 'processing') { await sleep(5000); media = await call('GET', `/api/library/v1/media/${media.id}`); }

let p = await call('POST', '/v2/projects', { video_id: media.id, dst_lang: 'fr-fr' });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }

const { segments } = await call('GET', `/v2/projects/${p.id}/transcription`);
const index = segments.map((s) => ({ t: s.start, speaker: s.speaker, text: s.src.text, fr: s.dst.text }));
console.log(JSON.stringify(index, null, 2));   // ready for your search index
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. upload a local video file
VIDEO_ID=$(curl -s -X POST "https://api.rask.ai/api/library/v1/media?kind=video" \
  -H "Authorization: Bearer $TOKEN" -F "[email protected]" | jq -r .id)

# 3. create the project once the media status is ready
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\": \"de-de\", \"num_speakers\": 3}" | jq -r .id)

# 4. when status is merging_done, save the transcript as plain text
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
  | jq -r '.segments[].src.text' > webinar.txt
local video file
multipart upload
<?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']];

$media = $json($http->post('/api/library/v1/media/link', ['headers' => $h, 'json' => [
    'link' => 'https://vimeo.com/123456']]));
while ($media['status'] === 'processing') {
    sleep(5);
    $media = $json($http->get("/api/library/v1/media/{$media['id']}", ['headers' => $h]));
}

$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
    'video_id' => $media['id'], 'dst_lang' => 'pt-br']]));
while ($p['status'] !== 'merging_done') {
    sleep(10);
    $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}

$t = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
file_put_contents('video.txt', implode("\n", array_map(fn($s) => $s['src']['text'], $t['segments'])));
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 and forbidden_link are specific enough to show directly to your own user, for example a video without speech.
Plain text transcript, two speakers
jq -r on /transcription
00:00:00,320  SPEAKER_00  Welcome back. Today we test three cameras in low light.
00:00:06,180  SPEAKER_01  I brought the footage from last week's night shoot.
00:00:10,940  SPEAKER_00  Let's start with the smallest sensor, the hardest case.
00:00:15,500  SPEAKER_01  At ISO 6400 the noise is visible, but the colors hold up.

或者完全跳过轮询

将地址指向一个Webhook端点,每个状态转换都会以POST请求的形式发送,这样您的队列就能在变化发生的瞬间做出响应。Webhook交付是企业入驻服务的一部分。
阅读文档
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
输出结果

你将为每个视频获得什么

每个完成的项目都会提供 JSON 格式的文字记录片段、目标语言的 SRT 和 VTT 格式字幕文件,以及翻译后的视频和音频。下载链接经过预签名,有效期为一小时。
字段
格式
说明
/transcription
JSON
每个片段的发言人标签、时间戳、源文本和翻译
translation_srt_path
.srt
目标语言的字幕,与片段时间精确对齐
translation_vtt_path
.vtt
与 WebVTT 相同的字幕,适用于网页播放器
translated_video
MP4
带配音的翻译视频
translated_audio
WAV
翻译后的语音与原始背景音频混合的效果
original_video
MP4
存储的源视频,供参考
控制

修正文稿中的姓名和专业术语

自动转写可以处理大部分视频内容。有时,姓名、口音和专业术语仍需人工核对。只需通过一次请求即可纠正文本、时间轴或特定片段的发言人,然后重新生成翻译版本。系统将按修改的片段计费,每次运行最低一分钟。

片段级编辑

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

术语词汇表

术语词汇表
添加词汇表后,产品名称和专业术语在每个翻译文稿中都会保持一致,或者也可以刻意保留原语言。

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

支持的文件格式

支持转写七种格式的视频文件和四种格式的音频录音,或者发送来自 YouTube、Google Drive 或 Vimeo 等主流平台的链接。系统会在扣除时长之前拒绝不支持的文件。

视频

7 种格式
.mp4
.mov
.mkv
.avi
.webm
.m4v
.3gp

音频

4 种格式
.mp3
.wav
.flac
.m4a

在消费前查看元数据

媒体端点会返回时长、文件大小、视频编码、帧率、分辨率、音频编码、采样率和声道布局。您可以提前验证文件并估算费用,因为项目是按视频分钟数计费的。
安全与合规

在安全审计控制下保护您的视频和文稿

Brask Inc 拥有 SOC 2 Type II 认证并遵循 GDPR,同时在信任中心(Trust Center)公布实时控制状态,以保障您安全团队的需要。

认证

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
拼凑而成的方案
来自 YouTube、Drive、Vimeo 或 S3 的视频链接
直接接受
先下载再转换
多说话人的发言人标签
包含
说话人分离插件或手动标记
每个视频的语言
自动检测
按文件设置或单独检测
其他语言的文稿
135种以上语言和地区选项
每种语言一个翻译 API
.srt和.vtt格式字幕
包含
字幕工具或您自己的文件编写器
修正专业术语
每个片段一个补丁请求
在每个工具中编辑副本
视频配音版本
包含在同一个项目中
文本转语音供应商加上您自己的混音
频率限制
无
具体取决于各服务商的规定
实时会议字幕
使用流式语音转文字API
部分服务商内置
尚无人支持的语言
我们来构建
不可用
常见问题解答

视频转写API:常见问题

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

Rask提供视频转写API吗?

我可以转写YouTube视频或视频链接吗?

我可以同时转写多个视频吗?

它如何处理多发言人?

支持哪些语言?

转录的准确率怎么样?

我可以获取纯文本格式的转写吗?

它能生成人工智能摘要、关键主题或情感分析吗?

它可以转写会议吗?

文件大小有限制吗?

视频转写如何计费?

有免费体验吗?

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

在一个下午内开始配音

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