为资料库中的每个视频提供视频转文字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 秒内完成了处理。
为您量身打造

遇到未列出的转写量或语言?请联系我们的团队

大批量转写、列表之外的源语言、搜索索引所需的文稿格式,或是将内容发送到您自己的存储空间:我们的团队会评估您的需求和可行方案。

语言与声音

需要公共目录以外的源语言?请与我们的团队沟通您的需求和可行方案。

交付与集成

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

批量与处理量

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

安全与托管

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

谁在使用视频转写 API

内置视频的平台

学习管理系统与客户培训平台、创作者与视频平台、网络研讨会与虚拟活动工具、视频托管与工作流 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 下运营,并在其信任中心发布实时控制状态供您的安全团队查看。

认证

SOC 2 Type II
GDPR
CAI 和 C2PA 成员

加密

传输中使用 TLS 1.2
静态使用 AES-256
SSE-S3 托管密钥
密钥至少每 12 个月轮换一次

您的内容

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

访问

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

企业

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

声音权益

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

Rask API 与拼凑而成的转写工作流对比

视频文稿很少是最终结果。团队还需要说话人标签、字幕和其他语言。以下是同样工作的两种处理方式。
您需要什么
Rask API
从零散部件拼凑
来自 YouTube、Drive、Vimeo 或 S3 的视频链接
直接接收
先下载再转换
多说话人的标签
包含
说话人分离插件或手动标记
每个视频的语言
自动检测
按文件设置或单独检测
其他语言的文稿
135种以上的语言和地区选项
每种语言一个翻译 API
.srt 和 .vtt 格式的字幕
包含
字幕工具或您自己的文件编写器
修正专业术语
每个片段一个修补请求
在各个工具中编辑副本
视频的配音版本
包含在同一个项目中
文本转语音 (TTS) 供应商加上您自己的混音
速率限制
无
遵循各服务商的规定
实时会议字幕
使用流式语音转文本 API
部分服务商内置
目前尚无任何平台支持的语言
由我们来构建
不可用
常见问题解答

视频转写API:常见问题

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

Rask提供视频转写API吗?

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

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

它如何处理多个发言人?

支持哪些语言?

转写的准确度如何?

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

它会生成人工智能摘要、核心主题或情感分析吗?

它可以转写会议吗?

是否有最大文件大小限制?

视频转写如何计费?

有免费版本吗?

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

在一个下午内开始配音

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