用于音频和视频文件的语音转文本 API

上传预先录制的音频或视频,即可获得包含说话者标签和每个片段时间戳的转写文本,支持75种源语言以及自动语言检测。在同一个项目中即可将其翻译成135种以上的语言和地区选项,并生成字幕和配音。
说话者区分
75种源语言
REST + Python SDK
upload, transcribe, read
OAuth 2.0
# 1. upload an audio or video file by link
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/interview.mp3", "name": "interview"}'

# 2. create the project - speech recognition starts automatically
#    src_lang is optional: leave it out and the language is detected
curl -X POST https://api.rask.ai/v2/projects \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{\"video_id\": \"$MEDIA_ID\", \"dst_lang\": \"es-mx\"}"
GET /v2/projects/{project_id}/transcription
segments
# Read the transcript: one object per segment
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
  | jq '.segments[] | {speaker, start, end, text: .src.text}'
被全球团队广泛使用
功能特性

语音转文字API返回的所有内容

语音识别是每个Rask项目的第一步。转写文本会以带有说话者标签和时间戳的片段形式返回,在同一个项目中即可直接进行编辑、翻译、添加字幕和配音。

转写音频和视频文件

上传预先录制的音频或视频,或者粘贴链接,API即可按片段将语音转换为书面文字。

说话者区分

系统会自动检测不同的说话者,并且每个片段都会带有诸如SPEAKER_00之类的说话者标签。如果您知道说话者的数量,可以将其传入,或者稍后更正标签。

每个片段的时间戳

每个片段都具有HH:MM:SS,mmm格式的开始和结束时间,方便用于录音内部的字幕、搜索和导航。

75种源语言

支持75种源语言的多语言功能。不填源语言则会自动检测,也可以使用双字母代码进行设置。

在同一个片段中进行翻译

每个片段都包含源文本及其在135种以上语言和地区选项中的翻译,因此转写文本和翻译可以按行保持对应。

.srt和.vtt格式字幕

每个完成的项目都包含目标语言的字幕文件,并与转写片段的时间相匹配。无需寻找其他字幕供应商。

翻译中的领域专业术语

术语表可在转写文本翻译时保持产品名称、专有名词和领域专用词汇的一致性,或者根据需要保持原文。

通过API编辑转写文本

修改字词、调整时间戳、重新分配说话者、添加或删除片段。审核人员可以直接修正最终的转写文本,而无需从头开始。

无限扩展

无速率限制、无并发配额、无单密钥节流。可并行对整个音频和视频库进行批量转写。
查看实际效果

看一个转写文本如何变成五个语言版本

同一个剪辑片段被转写、翻译并配音为英语、法语、德语、葡萄牙语和西班牙语,同时完好保留了原始背景音频。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
工作流程

从音频文件到转写文本的三个请求

创建项目会同时启动语音识别,接着进行翻译和配音。编辑文稿后,请使用 /generate 端点。
1

上传音频或视频

以多部分表单数据发送音频或视频文件,或者发布来自YouTube、Google Drive、S3、Vimeo或任何直接网址的链接。在您消耗任何额度之前,您将获得一个媒体ID和文件元数据。

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

创建项目

将媒体ID作为 video_id 传入,并指定目标语言。如果您知道源语言或说话人数,也可以一并添加。识别工作将立即开始。

POST /v2/projects
3

阅读文稿

一旦文稿片段可用,即可开始阅读文稿,同时翻译后的媒体内容会继续处理。项目完成后,下载字幕和媒体文件。

GET /v2/projects/{id}/transcription
识别处理的是完整的预录制文件,而非实时音频。处理时间取决于文件长度、说话人数和目标语言。
以您为中心

需要列表中未列出的语言或格式吗?请联系我们的团队

不在列表中的源语言、您的平台所期望的文稿格式、更高的吞吐量或您自己的交付方式:我们的团队会评估您的集成需求和可用选项。

语言和声音

需要公开目录之外的语言?欢迎与我们的团队沟通您的具体需求以及可行的选项。

交付与集成

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

数据量与吞吐量

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

安全与托管

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

谁会使用语音转文本API来处理视频?

内置视频的平台

学习管理系统(LMS)和客户教育平台、创作者与视频平台、网络研讨会与虚拟活动工具、视频托管与工作流SaaS、数字采用平台、直播购物。为您的产品添加录制视频的文稿、字幕和翻译版本等功能。

本地化和制作机构

使用带有说话人标签的文稿作为审阅者的初稿,通过API修正片段,并在同一个项目中提供字幕、翻译和配音版本。

内部持续视频制作

国际零售与电商、全球连锁企业、媒体出版商、企业大学。转录录制的培训、网络研讨会和访谈,然后为每个市场发布字幕和语言版本。
客户案例

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

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

语音转文字API代码示例

每种语言的一个完整示例:上传音频或视频文件、创建项目、等待,然后读取带有说话人和时间戳的文稿片段。
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas

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/interview.mp3"))
    while media.status is enums.MediaStatus.PROCESSING:
        await asyncio.sleep(5)
        media = await client.get_media(media_id=media.id)

    # src_lang omitted: the source language is detected automatically
    job = await client.create_project(data=schemas.ProjectCreate(video_id=media.id, dst_lang="es-mx"))
    while job.status is not enums.ProjectStatus.MERGING_DONE:
        await asyncio.sleep(10)
        job = await client.get_project(project_id=job.id)

    transcript = await client.get_project_transcription(project_id=job.id)
    for seg in transcript.segments:
        print(seg.start, seg.end, seg.speaker, seg.src.text)

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

with open("interview.mp3", "rb") as f:
    media = requests.post(f"{API}/api/library/v1/media", headers=h,
                          params={"kind": "audio"}, files={"data": f}).json()
while media["status"] == "processing":
    time.sleep(5)
    media = requests.get(f"{API}/api/library/v1/media/{media['id']}", headers=h).json()

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

# write the source transcript as an .srt file
segments = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
with open("interview_en.srt", "w") as out:
    for i, s in enumerate(segments, 1):
        out.write(f"{i}\n{s['start']} --> {s['end']}\n{s['speaker']}: {s['src']['text']}\n\n")
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());

let media = await call('POST', '/api/library/v1/media/link', { link: 'https://example.com/webinar.mp4' });
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, src_lang: 'en', dst_lang: 'de-de' });
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`);
segments.forEach((s) => console.log(`[${s.start}] ${s.speaker}: ${s.src.text}`));
console.log(p.translation_vtt_path);   // German subtitles for your player
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 audio file
MEDIA_ID=$(curl -s -X POST "https://api.rask.ai/api/library/v1/media?kind=audio" \
  -H "Authorization: Bearer $TOKEN" -F "data=@podcast_episode.mp3" | 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\": \"$MEDIA_ID\", \"dst_lang\": \"fr-fr\"}" | jq -r .id)

# 4. when status is merging_done, read the transcript with speaker labels
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
  | jq -r '.segments[] | "\(.start) \(.speaker): \(.src.text)"'
local file upload
audio file, multipart
<?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://example.com/interview.mp3']]));
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' => 'es-mx']]));
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]));
foreach ($t['segments'] as $s) {
    echo $s['start'], ' ', $s['speaker'], ': ', $s['src']['text'], PHP_EOL;
}
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 具体到足以直接向您自己的用户展示。
Two speakers
GET /v2/projects/{id}/transcription
{"segments": [
  {"speaker": "SPEAKER_00", "start": "00:00:00,320", "end": "00:00:07,316", "status": "done",
   "src": {"text": "Thanks for joining us. Let's start with the new release.", "lang": "en"},
   "dst": {"text": "Gracias por acompañarnos. Empecemos con la nueva versión.", "lang": "es-mx"}},
  {"speaker": "SPEAKER_01", "start": "00:00:07,640", "end": "00:00:11,900", "status": "done",
   "src": {"text": "Sure. The biggest change is the reporting view.", "lang": "en"},
   "dst": {"text": "Claro. El cambio más grande es la vista de reportes.", "lang": "es-mx"}}
]}

或者完全跳过轮询

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

文稿片段、字幕和翻译后的媒体

从转录端点读取JSON格式的文稿片段。完成的项目还会在目标语言中提供SRT和VTT格式的字幕文件、翻译后的视频,并且在符合条件的套餐中,提供作为单独WAV音轨的翻译语音。
字段
格式
说明
segments
JSON
文稿:每个片段的原文、译文、说话人标签、开始和结束时间
voiceover
WAV
仅翻译后的语音,无背景音(适用于符合条件的套餐)
translated_audio
WAV
翻译后的语音与原始背景音频混合的效果
translation_srt_path
.srt
目标语言的字幕,已与片段进行时间轴对齐
translation_vtt_path
.vtt
与 WebVTT 相同的字幕,适用于网页播放器
translated_video
MP4
带配音的翻译视频
控制

逐段修正字幕文稿

语音识别为您提供初稿。您可以通过每个片段发送一个请求来修正单词、时间戳或说话人标签,然后重新生成翻译版本。系统会根据修改后的片段收取费用,每次运行最低按一分钟计费。

片段级编辑

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

术语词汇表

术语词汇表
在翻译文稿时,术语表可以确保品牌名称、专有名词和专业术语在每个版本中保持一致,或者故意保留为原语言。

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

支持的文件格式

转写播客、访谈和通话录音等音频文件,或是任何支持格式的视频,也可以发送网址。如果提交了不支持的文件,API 会在扣除时长之前将其拒绝。

视频

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 与语音转文字 API 加上您自己的工作流的对比

语音转文字 API 可以将音频转换为文字。当这些文字需要变成字幕、翻译和配音版本时,剩下的就是工作流的工作了。以下是相同结果的两种实现方式。
您所需的功能
Rask API
拼凑而成的方案
带有说话人标签的字幕文稿
包含
包含在大多数语音转文字 API 中
时间戳
按片段
在许多语音转文字 API 中按单词计费
文稿翻译
同一项目,支持 135 种以上的语言和地区选项
独立的翻译 API
.srt和.vtt格式字幕
包含在目标语言中
根据您自己的时间数据构建
配音音频和视频
包含
文本转语音供应商加上您自己的混音
修正片段
发送一个补丁请求,然后重新生成
编辑并重新同步您自己的副本
频率限制
无
由您的提供商制定的任何规则
实时转写实时音频
使用流式语音转文字API
为此而生
仅需文字记录,价格最实惠
专用的语音转文字API成本更低
按音频小时数计费
常见问题解答

语音转文字API:常见问题

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

Rask有语音转文字API吗?

它可以识别哪些语言?

我可以只转录没有视频的音频文件吗?

它支持发言人区分(双工/多发言人分离)功能吗?

API会返回精确到每个词的时间戳吗?

它支持实时转录吗?

转录的准确率怎么样?

我可以添加自定义词汇或专业术语吗?

我可以将文字记录导出为SRT文件吗?

我可以使用自己提供的文字记录吗?

转写服务是如何计费的?

有免费体验吗?

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

在一个下午内开始配音

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