ライブラリ内のすべての動画に対応する動画文字起こし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秒で完了しました。
あなたを中心に構築

リストにない大量のデータや言語での文字起こしをお考えですか?チームにお問い合わせください

大量データの文字起こし、リストにない翻訳元言語、検索インデックスに必要な文字起こしフォーマット、自社ストレージへの配信など、お客様のご要望と利用可能なオプションについて弊社のチームが検討いたします。

言語と音声

公開カタログにない翻訳元言語が必要ですか?ご要望と利用可能なオプションについて、ぜひチームにお気軽にご相談ください。

配信と連携

ウェブフック、お客様のキューへのプッシュ、S3への直接配信、カスタムエンドポイントなどに対応しています。パイプラインに必要なデータ配信方法をお知らせください。

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

バッチサイズ、1回あたりの翻訳言語数、処理の優先順位は契約内容によって異なり、固定の制限ではありません。

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

データの保存場所、SSOやSAML、データ保持ルール、セキュリティ審査のサポートなどは、エンタープライズ向けの導入プロセスの一環として対応いたします。
ユースケース

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

動画を活用するプラットフォーム

LMSやカスタマー教育プラットフォーム、クリエイターおよび動画プラットフォーム、ウェビナー・オンラインイベントツール、動画ホスティング・ワークフローSaaS、デジタルアダプションプラットフォーム、ライブコマースなど。アップロードされた動画に検索可能な文字起こしと字幕の機能をご自身のプロダクトに追加できます。

ローカライズ・制作会社

クライアントの動画をまとめて文字起こしし、話し手のラベル付きのテキストをレビュー担当者に共有し、同じプロジェクトから字幕や翻訳を納品できます。

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

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

実際のチームによる、確かな実績

Rask AIを活用した企業の動画ローカライズ実績を数字でご紹介します。
arrow
arrow
コード

動画文字起こし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
公式SDKはPythonです。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つで対応できます。
文字起こしとその部分を取得する
元のテキストを修正すると、AIが再翻訳します
翻訳されたテキストを直接修正して、お好みの表現に保つ
タイムスタンプの調整、部分の追加・削除
話者に割り当てられた音声を変更する

用語集

用語集
用語集を設定しておけば、製品名や専門用語がどの翻訳版でも一貫して正しく表示されます。また、あえて元の言語のまま残すことも可能です。

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に準拠しています。また、セキュリティチーム向けに信頼性センターでシステムの稼働状況を公開しています。

認証

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、Googleドライブ、Vimeo、S3からの動画リンク
直接受け入れられます
最初にダウンロードと変換が必要
複数話者のラベル付け機能
含まれる
話者分離の追加機能または手動でのタグ付け
各動画の言語
自動検出
ファイルごとに設定、または個別に検出
多言語での文字起こし
135以上の言語や地域に対応
言語ごとの翻訳API
.srtおよび.vtt形式のキャプション
含まれる
字幕ツールまたは専用のファイル作成ツール
専門用語の修正
セグメントごとに1回の修正リクエスト
すべてのツールでコピーを編集
動画の吹き替え版
同じプロジェクトに含まれる
音声合成(TTS)ベンダーと自前の音声ミキシング
レート制限
なし
各提供元が定めるそれぞれのルール
オンラインミーティング向けのリアルタイム字幕
ストリーミング音声認識APIを使用する
一部のプロバイダーに標準搭載
まだ誰も対応していない言語
当社が構築します
利用できません
よくあるご質問

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

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

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

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

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

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

対応している言語は何ですか?

音声起こしの精度はどれくらいですか?

プレーンテキストとして文字起こしを取得できますか?

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

会議の文字起こしはできますか?

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

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

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

API アクセスと API キーを取得するにはどうすればよいですか?

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

まずは今日最初の依頼を試してみませんか?大量の利用や、他にはない言語についての相談もお気軽にお問い合わせください。