翻訳済み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ファイルはウェブでの動画再生に使用できます。

多言語での字幕

世界中の視聴者の言語の壁を取り除きます。1回のアップロードで、es-mx、pt-br、fr-caなど、ターゲット言語ごとにプロジェクトを作成できます。元の言語は自動で検出されます。

音声コンテンツに合わせたタイミング

各字幕は、開始時間と終了時間を持つ文字起こしのセグメントに沿って表示されるため、話されているタイミングに合わせて画面にテキストが表示されます。

元の言語でのキャプション

文字起こしデータには、タイムスタンプ付きの各セグメントの元のテキストが保存されます。数行のコードを追加するだけで、同言語のキャプション用のSRTまたはVTTファイルに変換できます。

対話のための話者ラベル

各文字起こしセグメントには話者ラベルが付いているため、インタビューやパネルディスカッション、会話形式の動画のキャプションにも話者名を簡単に追加できます。

公開前のテキスト編集

API経由で任意のセグメントのテキストやタイミングを修正し、再生成できます。聞き取りにくい言葉、固有名詞、アクセントの修正は一度行うだけで、すべての形式に反映されます。

すべての言語で一貫した用語

用語集機能を使用すると、すべての字幕言語で製品名や専門用語を統一したり、必要に応じて元の言語のまま維持したりすることができます。

字幕と吹き替え版の同時生成

同じプロジェクトから翻訳済みの動画・音声トラックも取得できるため、1回のアップロードで字幕と吹き替え版の両方を作成できます。

制限なしのスケール

利用制限、同時実行数の制限、キーごとの制限はありません。すべての動画ライブラリの字幕を、複数のターゲット言語で同時に作成できます。
実際の動作を見る

1本の動画を、5つの言語に

英語、フランス語、ドイツ語、ポルトガル語、スペイン語の同じクリップ。それぞれの言語に、専用のSRTおよびVTT字幕ファイルが用意されます。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
ワークフロー

動画のアップロードから字幕ファイル作成までの3ステップ

プロジェクトを作成すると、文字起こし、翻訳、吹き替え版の作成が一度に始まります。字幕の行を編集した後は、/generate エンドポイントをご利用ください。
1

ビデオをアップロードする

動画ファイルを送信するか、YouTube、Googleドライブ、S3、Vimeoなどのリンク、または直接URLを貼り付けます。1回のアップロードで、すべての言語の字幕に対応します。

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

プロジェクトを作成する

メディアIDをvideo_idとして渡し、1プロジェクトにつき1つのターゲット言語を指定します。異なる言語のプロジェクトを同時に実行できます。

POST /v2/projects
3

字幕ファイルのダウンロード

ステータスが「merging_done」になるまで読み込んだ後、.srtおよび.vttファイルをダウンロードして、ご自身の環境に保存します。

GET /v2/projects/{project_id}
処理時間は、動画の長さ、話者の人数、ターゲット言語によって異なります。あるテストでは、3分47秒の動画が165秒で完了しました。
あなたに合わせて構築

掲載されていない字幕形式や納品方法をご希望の場合は、弊社チームまでお問い合わせください。

別の字幕フォーマット、ご自身のストレージへの配信、カタログ外の言語、または大量処理など、制作のワークフローに必要な内容と利用可能なオプションについて、当社のチームが検討いたします。

言語と音声

公開カタログにない言語の字幕が必要ですか?ご要望や利用可能なオプションについて、当社のチームにご相談ください。

配信と連携

Webhooks、独自のキューへのプッシュ、S3への直接配信、カスタムエンドポイント。パイプラインにどのようにデータを送りたいかお知らせください。

ボリュームとスループット

バッチサイズ、アクションあたりのターゲット言語、処理の優先順位はすべて契約条件であり、固定された製品の制限ではありません。

セキュリティとホスティング

データレジデンシー、SSOおよびSAML、保持ルール、セキュリティレビューのサポートは、エンタープライズ向けオンボーディングの一環として対応いたします。
ユースケース

サブタイトルAPIを利用しているのは誰か

動画機能を備えたプラットフォーム

LMSやカスタマー教育プラットフォーム、クリエイター・動画プラットフォーム、ウェビナー・バーチャルイベントツール、動画ホスティング・ワークフローSaaS、デジタルアダプションプラットフォーム、ライブコマースなど。あらゆる言語の字幕を、動画アップロードの機能として追加できます。

ローカライズおよび制作エージェンシー

1回のアップロードで、クライアントの言語ごとにSRTおよびVTTファイルを配信できます。APIを通じて担当者が行を修正すると、タイミングを再調整することなくファイルが自動的に更新されます。

自社での継続的な動画制作

国際的な小売・Eコマース、グローバル企業、メディアパブリッシャー、企業内大学など。トレーニングや製品動画をすべての市場や、音声なしで視聴するユーザーにも届くようにします。
導入事例

本物のチーム、目に見える成果

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の例を示しています。
進捗

字幕プロジェクトの進捗報告の仕組み

すべてのプロジェクトはステータスごとに管理されるため、アプリに動画をアップロードしたユーザーは、各言語の字幕の進捗状況を確認できます。対応が必要なのは3つのグループのみです。

成功、ここで完了

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">
出力

まずは字幕ファイルから、その他もすべて一緒に

完了したプロジェクトには、両方の字幕フォーマット、その背後にある文字起こしセグメント、吹き替えメディアが表示されます。ダウンロードリンクは署名付きで1時間有効ですので、ファイルを独自のストレージにコピーしてください。
項目
形式
説明
translation_srt_path
.srt
編集ソフトやほとんどの動画プラットフォームで使える、ターゲット言語の字幕
translation_vtt_path
.vtt
HTML5の動画再生やウェブプレイヤー用のWebVTT字幕
/transcription
JSON
すべてのセグメントの元のテキスト、翻訳、話者ラベル、タイムスタンプ
translated_video
MP4
音声付きバージョンも公開する場合の、吹き替え済み動画
translated_audio
WAV
元の音楽や効果音とミックスされた翻訳音声
original_video
MP4
参照用に保存された元のファイル
コントロール

字幕の1行を修正し、その部分だけを再生成する

字幕は文字起こしのセグメントに基づいています。1行のテキストやタイミングを編集して再生成すると、字幕ファイルと吹き替え版が同時に更新されます。料金は変更されたセグメントに対して発生し、実行ごとに1分間の最低料金が適用されます。

セグメント単位の編集

セグメント単位の編集
各プロジェクトの文字起こしは操作可能なセグメントとして公開されるため、間違った単語やタイミングのずれた字幕は、1つのパッチリクエストで修正できます。
文字起こしとそのセグメントを取得する
元のテキストを修正すると、自動で再翻訳されます
翻訳されたテキストを直接修正して、お好みの表現に調整できます
再生時間の調整、セグメントの追加・削除
話者に割り当てられた音声を変更する

用語集による専門用語の管理

用語集による専門用語の管理
用語集を追加することで、ブランド名や専門用語をすべての言語の字幕で統一したり、意図的に元の言語のままにしたりすることができます。

1つの用語集は1つの言語ペアをカバーし、その言語のすべての地域バリエーションに適用されるため、たとえば1つのスペイン語用用語集で es-mx および es-es 同様に機能します。プロジェクトには glossary_versionが記録されるため、後から編集を行っても、完了した作業が勝手に変更されることはありません。
入力

対応ファイル形式

対応している動画や音声のファイルをアップロードするか、対応メディアのURLを使用します。ターゲット言語ごとにプロジェクトを作成し、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か月ごとのキーローテーション

あなたのコンテンツ

クローズドAI環境
一般モデルのトレーニングには不使用
完全なエクスポート、ベンダーのロックインなし

アクセス

SSOおよびSAML
ロールベースのアクセス制御
OAuth 2.0クライアント認証情報

エンタープライズ

データ保管場所の選択肢
カスタムSLA
専任のアカウントマネージャー

音声の権利

利用権付きの合成音声
同意に基づく音声クローン
AIの安全管理、人間の確認プロセス
比較

Rask APIと自作の字幕パイプラインの比較

他言語の字幕には、文字起こし、翻訳、タイミング調整、ファイルエクスポートが必要です。ここでは、同じ結果を2つの方法で組み立てています。
必要な機能
Rask API
部品を組み合わせた場合
タイムスタンプ付きの文字起こし
含まれる
音声認識API
多言語での字幕
135以上の言語および地域オプション
翻訳APIと再タイミング調整
SRTおよびWebVTTのエクスポート
すべてのプロジェクトで両方のフォーマットに対応
自社製ファイルライター
一貫した用語の使用
用語集
カスタム後処理
1行の修正
1つのパッチリクエスト送信後、再生成を実行
すべてのファイルを自分で編集する
同じ動画の吹き替え版
同じプロジェクトに含まれる
音声合成ベンダーと自前のミキシング
利用制限
なし
提供事業者の仕様に準拠
動画に焼き込まれた字幕
Raskのウェブアプリで利用可能(APIではまだ未対応)
独自の動画レンダリング
フォント、サイズ、レイアウト
動画プレーヤーで設定
動画プレーヤーで設定
よくあるご質問

字幕APIに関するよくある質問

お探しのものが見つかりませんか?営業部までお問い合わせください。

Raskには字幕APIがありますか?

APIはどの字幕形式をサポートしていますか?

元の言語の字幕を取得できますか?

どの言語に対応していますか?

APIで動画に字幕を焼き込むことはできますか?

字幕のフォント、サイズ、レイアウトを変更することはできますか?

字幕には音楽や効果音が説明されていますか?

話者は識別されますか?

字幕の行を修正するにはどうすればよいですか?

ダウンロードリンクの有効期限はどのくらいですか?

自分で用意した字幕を使用できますか?

字幕APIの料金はどのように請求されますか?

APIの利用権とAPIキーを取得するにはどうすればよいですか?

半日で吹き替えを始めましょう

今すぐ最初のリクエストを作成し、大量利用の契約や他の誰も対応していない言語が必要な場合は、ぜひお気軽にご相談ください。