ライブラリ内のすべての動画に対応する動画文字起こしAPI

動画ファイルやYouTube、Googleドライブ、Vimeoのリンクを送信するだけで、話者の識別とタイムスタンプが付いた検索可能な文字起こしデータを75言語で取得できます。自動言語検出機能も搭載されています。1本の動画からライブラリ全体まで文字起こしを行い、テキストや字幕を翻訳して世界中の視聴者に届けましょう。
ファイルと動画リンク
一括文字起こし
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ドライブ、Vimeo、S3、または直接リンクを貼り付けます。APIが動画を直接取得するため、手動でダウンロードする必要はありません。

複数の話者を自動で識別

複数の出演者が登場するインタビュー、パネルディスカッション、ウェビナーでも、セグメントごとに話者がラベル付けされるため、誰が何を話したのかが一目でわかります。

自動言語検出

英語を含む75の元言語で動画を文字起こしできます。元言語を指定せずに空欄にしておくと、各動画の言語が自動的に検出されます。

検索可能な文字起こしデータ

すべてのセグメントに開始時刻と終了時刻が設定されているため、ユーザーは動画内のテキストを検索し、特定のフレーズが話された瞬間に直接ジャンプできます。

多言語での文字起こし

各セグメントには135以上の言語や地域の翻訳も含まれているため、1つの文字起こしデータで世界中のさまざまな言語の視聴者に対応できます。

.srtおよび.vtt形式のキャプション

また、各プロジェクトではターゲット言語の字幕ファイルもセグメントに合わせて生成されるため、耳が不自由な方や音声をオフにして視聴する方にも最適です。

プレーンテキストまたは構造化データ

文字起こしデータをJSONセグメントとして読み込んだり、テキストをプレーンテキストにまとめて検索インデックス、記事、番組の概要、メモなどに活用できます。

専門用語の修正

APIを使用して、任意のセグメント内の名前、製品名、専門用語を修正できます。用語集を使用することで、文字起こしを翻訳する際も用語の統一性を維持できます。

制限なしのスケール

利用制限、同時実行数の上限、キーごとの制限はありません。複数の動画やライブラリ全体を対象に、一括文字起こしを並行して実行できます。
実際の動作を見る

1つの文字起こしから5つの言語バージョンへ

このクリップの文字起こしは、英語、フランス語、ドイツ語、ポルトガル語、スペイン語に翻訳され、それぞれに字幕と元の背景音声が付けられています。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
ワークフロー

動画のリンクから文字起こしまでの3つのステップ

プロジェクトを作成すると、文字起こし、翻訳、字幕の生成、音声の吹き替えが一度に実行されます。文字起こしを修正した後に /generate エンドポイントを使用してください。
1

動画を送信する

動画ファイルをマルチパートフォームデータとしてアップロードするか、YouTube、Googleドライブ、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への直接配信、カスタムエンドポイント。パイプラインにどのようにデータを送りたいかお知らせください。

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

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

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

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

動画文字起こしAPIの利用シーン

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

LMSおよび顧客教育プラットフォーム、クリエイター・動画プラットフォーム、ウェビナーおよびバーチャルイベントツール、動画ホスティングおよびワークフローSaaS、デジタル導入プラットフォーム、ライブコマンス。製品の機能として、検索可能な文字起こしや字幕を動画のアップロードに追加できます。

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

クライアントの動画をまとめて文字起こしし、話者のラベルが付いた文字起こしをレビュー担当者に共有し、同じプロジェクトから字幕や翻訳を提供します。

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

国際的な小売・Eコマース、グローバル企業、メディアパブリッシャー、企業内大学、コンテンツクリエイター。すべての動画を検索可能かつアクセスしやすくし、文字起こしを記事や説明文に再利用できます。
導入事例

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

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

動画文字起こしプロジェクトの進捗報告の仕組み

すべての動画がステータス付きのプロジェクトとして管理されるため、一括処理における各動画の進捗状況を確認できます。対応が必要なのは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 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形式の字幕ファイル、翻訳された動画と音声が提供されます。ダウンロードリンクは事前署名されており、1年間有効です。
項目
形式
説明
/transcription
JSON
すべてのセグメントの話者ラベル、タイムスタンプ、元のテキスト、翻訳
translation_srt_path
.srt
セグメントに合わせてタイミングが調整された、ターゲット言語の字幕
translation_vtt_path
.vtt
WebVTTと同じキャプション(Webプレーヤー用)
translated_video
MP4
ボイスオーバー付きの翻訳済み動画
translated_audio
WAV
翻訳された音声と元の背景音をミックスした音声
original_video
MP4
確認用に保存された元の動画
コントロール

文字起こしの名前や専門用語を修正する

自動文字起こし機能により、動画の大部分を処理できます。ただし、名前やアクセント、専門用語などは、手動での確認が必要になる場合があります。1回のリクエストで特定の箇所のテキスト、タイミング、話者を修正し、翻訳されたバージョンを再度生成できます。料金は、変更された部分(1回につき最短1分)に基づいて請求されます。

セグメント単位の編集

セグメント単位の編集
すべてのプロジェクトで文字起こしデータが細かい単位で分かれているため、聞き間違いがあった名前も、最初から文字起こしをし直す必要はなく、簡単な修正リクエストを送るだけで直せます。
文字起こしとそのセグメントを取得する
元のテキストを修正すると、自動で再翻訳されます
翻訳されたテキストを直接修正して、お好みの表現に調整できます
再生時間の調整、セグメントの追加・削除
話者に割り当てられた音声を変更する

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

用語集による専門用語の管理
用語集を設定しておけば、商品名や専門用語がどの言語に翻訳されても常に正しく表示されます。また、あえて元の言語のまま残すことも可能です。

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

対応ファイル形式

7種類の形式の動画ファイル、4種類の形式の音声ファイルの文字起こしに対応しています。また、YouTube、Googleドライブ、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か月ごとのキーローテーション

あなたのコンテンツ

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

アクセス

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

エンタープライズ

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

音声の権利

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

Rask APIと、複数のツールを組み合わせた文字起こしワークフローの比較

動画の文字起こしデータが完成形になることはほとんどありません。チームでは、話者ラベル、字幕、多言語への翻訳なども必要になります。同じ作業を2つの方法で行った場合の違いは以下の通りです。
必要な機能
Rask API
部品を組み合わせた場合
YouTube、Drive、Vimeo、S3からの動画リンク
直接対応
最初にダウンロードして変換が必要
複数の話者に対応する話者ラベル
含まれる
話者分離の追加機能または手動でのタグ付け
動画の言語
自動検出
ファイルごとに設定するか、個別に検出
他言語の文字起こし
135以上の言語および地域オプション
言語ごとの翻訳API
.srtおよび.vtt形式のキャプション
含まれる
字幕作成ツール、または自作のファイル作成ソフト
専門用語の修正
セグメントごとに1回の修正リクエスト
すべてのツールでコピーを編集
吹き替え版の動画
同じプロジェクトに含まれる
音声合成ベンダーと自前のミキシング
利用制限
なし
各プロバイダーの規定に準じます
ライブミーティング向けのリアルタイム字幕
ストリーミング音声認識APIをご利用ください
一部のプロバイダーに標準搭載されています
まだどこも対応していない言語
私たちが構築します
利用できません
よくあるご質問

動画文字起こしAPI:よくある質問

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

Raskには動画の文字起こしAPIがありますか?

YouTubeの動画や動画のリンクを文字起こしできますか?

複数の動画を同時に文字起こしできますか?

複数の話者がいる場合はどのように処理されますか?

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

文字起こしの精度はどのくらいですか?

文字起こしデータを通常のテキストとして取得できますか?

AIによる要約、主要なトピックの抽出、感情分析などは生成されますか?

ミーティングの文字起こしはできますか?

ファイルサイズの制限はありますか?

動画の文字起こしはどのように課金されますか?

無料プランはありますか?

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

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

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