動画ナレーション向けテキスト読み上げAPI

動画や音声データと一緒にタイミングを合わせた原稿を送信すると、タイムラインに沿った音声が生成されます。135以上の言語や地域から、音声ライブラリのAI音声またはボイスクローンを選択し、同じプロジェクトからナレーション、動画、字幕をダウンロードできます。
原稿からナレーションを作成
AI音声と音声クローン
REST + Python SDK
script in, voiceover out
OAuth 2.0
# 1. send your script as timed segments - one speaker per line
curl -X POST https://api.rask.ai/v2/transcriptions \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"segments": [
    {"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
     "src": {"text": "Welcome to the new dashboard.", "lang": "en"},
     "dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}}
  ]}'

# 2. voice the script over your video
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\", \"transcript_id\": \"$TRANSCRIPT_ID\"}"
GET /v2/projects/{project_id}
voiceover links
# When status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
  | jq '{status, voiceover, translated_audio, translated_video}'
世界中のチームで利用されています
機能一覧

動画用テキスト読み上げAPIでできること

作成した原稿を映像にぴったりのナレーションに変換します。話者ごとに適した声を選び、セグメントのタイミング調整、背景音声、字幕、翻訳を1つのプロジェクトでまとめて行えます。別料金でリップシンク(口パク合わせ)の追加も可能です。

原稿を音声に

独自のテキストセグメントやSRTファイルから文字起こしを作成すると、APIが対象言語でその原稿通りの音声を生成します。

音声ライブラリ

対象地域ごとに性別が設定されたAI音声のプリセットが用意されています。音声エンドポイントを使ってプロジェクトのリストを取得し、音声IDを指定して各話者に割り当てることができます。

カスタム音声とボイスクローン

保存したカスタムボイスクローンをブランドの統一された声として使用したり、対応言語であればインスタントボイスクローンを使って映像に登場する人物本人の声を再現したりできます。

映像のタイミングに合致

各セグメントには開始時間と終了時間が設定されているため、すべてのセリフが動画の正しい位置に収まります。

キャラクターの声と対話

セリフごとに話者を割り当て、話者ごとに声を割り当てることで、対話や複数のキャラクターの声をクリアで一貫性のあるものに保てます。

135以上の言語や地域に対応

一つの言語で原稿を作成し、別の言語で音声を生成:Raskが翻訳し、すべての対象地域で利用可能なAI音声を提供します。

音声のみのトラック

対象プランでは、背景音のない音声のみのWAVトラックをダウンロードしてご自身で編集したり、完全なミックス音声や完成した動画をダウンロードしたりできます。

1行だけの編集、1行だけの再生成

特定のセグメントのテキストや話者の声を変更して再生成できます。再録音は不要で、変更したセグメントのみが料金の対象となります。

制限なしで規模を拡大

利用制限や同時実行数のクォータ、キーごとの制限はありません。長尺コンテンツや動画カタログ全体を並行して音声化できます。
実際の動作を見る

1つの映像が5つの言語で音声化される様子を聴く

英語、フランス語、ドイツ語、ポルトガル語、スペイン語の同じクリップが、元の背景音を残したまま、同じ映像のタイミングに合わせて音声化されています。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
ワークフロー

台本から音声作成までの3つのステップ

プロジェクトを作成すると、台本の音声生成が開始されます。テキストや音声に変更を加えたら、/generateエンドポイントをご利用ください。
1

動画または音声をアップロード

ファイルまたは対応するメディアのURLを使用して、音声の元となる動画や音声ファイルをアップロードします。タイムラインによって台本のタイミングが調整されます。

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

台本を送信

タイムスタンプや話し手情報付きのテキストセグメント、またはSRTファイルから文字起こしを作成し、transcript_idとターゲット言語を指定してプロジェクトを作成します。

POST /v2/transcriptions
3

音声の選択とダウンロード

音声の一覧表示、各話し手へのプリセットまたはクローンの割り当て、必要に応じた再生成を行い、音声、動画、字幕ファイルをダウンロードします。

GET /v2/projects/{id}/voices
処理時間はプロジェクトによって異なります。音声はプロジェクト全体に対して生成されファイルとして納品されるため、ライブ会話ではなく公開済みの動画に適したAPIです。
あなたを中心に構築

ライブラリにない音声が必要ですか?弊社チームにお問い合わせください

ブランドボイス、カタログ外の言語、より高いスループット、または独自の配信方法など、パブリックカタログ以外の要件が必要な場合は、弊社チームがお客様の要件と利用可能なオプションを確認いたします。

言語と音声

公開カタログにない言語や音声が必要ですか?要件や利用可能なオプションについて、お気軽に弊社のチームにご相談ください。

配信と連携

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

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

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

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

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

動画用テキスト読み上げAPIの活用シーン

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

LMSおよびカスタマー教育プラットフォーム、クリエイターおよび動画プラットフォーム、ウェビナーおよびバーチャルイベントツール、動画ホスティングやワークフローのSaaS、デジタルアダプションプラットフォーム、ライブコマースなど。ユーザーが製品から離れることなく、テキストの入力や台本のアップロードを行うだけで、多言語の動画用音声を作成できます。

ローカライズ・制作会社

AI音声やお客様のカスタム音声を使用してクライアント向け動画の台本を承認し、独自のミックス用に音声のみのWAVファイルを納品します。レビュー後にセリフを更新し、そのセグメントのみを再生成することも可能です。

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

グローバル小売および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

async def wait(client, job):
    while job.status is not enums.ProjectStatus.MERGING_DONE:
        await asyncio.sleep(10)
        job = await client.get_project(project_id=job.id)
    return job

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)

    script = await client.create_transcription(data=schemas.TranscriptionCreate(segments=[
        schemas.SegmentCreate(speaker="SPEAKER_00", start="00:00:00,500", end="00:00:04,800",
            src=schemas.SegmentTextCreatePatch(text="Welcome to the new dashboard.", lang="en"),
            dst=schemas.SegmentTextCreatePatch(text="Bienvenido al nuevo panel.", lang="es-mx")),
    ]))

    job = await wait(client, await client.create_project(data=schemas.ProjectCreate(
        video_id=VIDEO_ID, dst_lang="es-mx", transcript_id=script.id)))

    # pick a female AI voice preset from the library for SPEAKER_00
    voices = await client.get_project_voices(project_id=job.id)
    preset = next(v for v in voices if v.gender == "female")
    await client.patch_project(project_id=job.id, data=schemas.ProjectPatch(voice={**job.voice, "SPEAKER_00": preset.id}))

    job = await wait(client, await client.generate_project(project_id=job.id))
    print(job.voiceover, job.translated_video)

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

def wait(pid):
    while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
        time.sleep(10)
    return p

script = requests.post(f"{API}/v2/transcriptions", headers=h, json={"segments": [
        {"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
         "src": {"text": "Welcome to the new dashboard.", "lang": "en"},
         "dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}},
    ]}).json()

pid = requests.post(f"{API}/v2/projects", headers=h, json={
    "video_id": VIDEO_ID, "dst_lang": "es-mx", "transcript_id": script["id"]}).json()["id"]
project = wait(pid)

voices = requests.get(f"{API}/v2/projects/{pid}/voices", headers=h).json()
preset = next(v for v in voices if v["gender"] == "female")
requests.patch(f"{API}/v2/projects/{pid}", headers=h,
               json={"voice": {**project["voice"], "SPEAKER_00": preset["id"]}})
requests.post(f"{API}/v2/projects/{pid}/generate", headers=h)
print(wait(pid)["voiceover"])
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());
const wait = async (id) => { let p; while ((p = await call('GET', `/v2/projects/${id}`)).status !== 'merging_done') await sleep(10000); return p; };

const script = await call('POST', '/v2/transcriptions', { segments: [
  { speaker: 'SPEAKER_00', start: '00:00:00,500', end: '00:00:04,800',
    src: { text: 'Welcome to the new dashboard.', lang: 'en' },
    dst: { text: 'Bienvenido al nuevo panel.', lang: 'es-mx' } },
] });

const { id } = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang: 'es-mx', transcript_id: script.id });
const project = await wait(id);

const voices = await call('GET', `/v2/projects/${id}/voices`);
const preset = voices.find((v) => v.gender === 'female');
await call('PATCH', `/v2/projects/${id}`, { voice: { ...project.voice, SPEAKER_00: preset.id } });
await call('POST', `/v2/projects/${id}/generate`);
console.log((await wait(id)).voiceover);
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. your script as an SRT file in the target language
TRANSCRIPT_ID=$(curl -s -X POST "https://api.rask.ai/v2/transcriptions/srt?dst_lang=es-mx" \
  -H "Authorization: Bearer $TOKEN" -F "dst=@script_es-mx.srt" | jq -r .id)

# 3. voice it over the video
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\": \"es-mx\", \"transcript_id\": \"$TRANSCRIPT_ID\"}" | jq -r .id)

# 4. when status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
  | jq '{status, voiceover, translated_video}'
POST /v2/transcriptions/srt
script from an SRT file
<?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']];

$script = $json($http->post('/v2/transcriptions', ['headers' => $h, 'json' => ['segments' => [[
    'speaker' => 'SPEAKER_00', 'start' => '00:00:00,500', 'end' => '00:00:04,800',
    'src' => ['text' => 'Welcome to the new dashboard.', 'lang' => 'en'],
    'dst' => ['text' => 'Bienvenido al nuevo panel.', 'lang' => 'es-mx'],
]]]]));

$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
    'video_id' => $videoId, 'dst_lang' => 'es-mx', 'transcript_id' => $script['id']]]));

while ($p['status'] !== 'merging_done') {
    sleep(10);
    $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $p['voiceover'];
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 および forbidden_link は、ユーザーに直接表示するのに十分な情報が含まれています。
Voice options in a project, es-mx
GET /v2/projects/{project_id}/voices
{"label": "Renata",      "gender": "female", "sample_src": "https://..."}   AI voice preset
{"label": "Gerardo",     "gender": "male",   "sample_src": "https://..."}   AI voice preset
{"label": "Maria Lopez", "gender": "auto",   "sample_src": "https://..."}   custom voice clone
{"label": "Voice Clone", "gender": "auto",   "sample_src": null}            instant voice clone

または、ポーリングを完全にスキップする

Webhookのエンドポイントを指定すると、状態の切り替えごとにPOSTリクエストが送信されるため、変更が発生した瞬間にキューが反応します。Webhookの配信は、エンタープライズプランに含まれています。
ドキュメントを読む
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
出力

音声、動画、字幕

新しい音声とSRTおよびVTT形式の字幕が付いた動画をダウンロードできます。対象プランでは、音声のみのWAVファイルや、元の背景音とミックスした音声のダウンロードも可能です。
項目
形式
説明
translated_video
MP4
生成された音声付きの動画(すぐに公開可能)
voiceover
WAV
独自の編集用に、背景音を含まない音声のみを生成
translated_audio
WAV
翻訳音声と元の背景音声をミックスしたもの
translation_srt_path
.srt
翻訳された言語の字幕
translation_vtt_path
.vtt
WEBプレーヤー用のWebVTT形式の字幕
original_video
MP4
参照用に保存された元のファイル
コントロール

セリフや音声の変更、該当部分のみの再生成

スクリプトはセグメントごとに保存されます。1行のテキストを編集したり、話者の声を変更して再生成したりすると、変更されたセグメントのみが課金対象となります(1回につき1分からの最小利用時間があります)。

部分ごとの編集

部分ごとの編集
すべてのプロジェクトで、タイムスタンプ、話者、テキストが含まれるセグメントとしてスクリプトが表示されるため、修正は1つのリクエストで簡単に行えます。
文字起こしとその部分を取得する
元のテキストを修正すると、AIが再翻訳します
翻訳されたテキストを直接修正して、お好みの表現に保つ
タイムスタンプの調整、部分の追加・削除
話者に割り当てられた音声を変更する

用語集

用語集
Raskがスクリプトを他言語に翻訳する際、用語集機能を使うことで、ブランド名や専門用語をすべてのバージョンで統一したり、意図的に元の言語のままに保ったりすることができます。

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

対応しているファイル形式

対応している形式の動画をアップロードするか、URLを送信してください。スクリプトはAPI経由のテキストセグメント、またはSRTファイルとして読み込まれます。

動画

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と自社構築の音声吹き替えシステムの比較

ストリーミング対応の音声合成APIは、テキストをリアルタイム用の音声データに変換します。公開用動画の吹き替えには、タイミング調整、話者ごとの音声設定、ミキシング、字幕、そして多くの場合翻訳も必要になります。ここでは、同じ音声吹き替えを2つの方法で作成した場合を比較します。
必要なもの
Rask API
パーツを組み合わせた場合
動画のタイミングに合わせたスクリプト
開始時間と終了時間を含むセグメント
独自のタイミング調整ロジック
話者やキャラクターごとの音声
プロジェクトごとのボイスマップ
リクエストごとに管理される音声ID
一貫したブランドボイス
カスタム音声クローン
別の音声クローン作成ベンダー
他言語での同じスクリプト
同じプロジェクト内での翻訳
翻訳APIと新たなタイミング調整
背景の音楽と効果音
音声の下でミックス
独自のミキシング工程
srtおよび.vtt形式の字幕
含まれる
独自のタイミングデータから生成
音声のみのトラック
対象プランでのWAV形式対応
自分で結合する音声チャンク
1行の変更
変更した部分だけを再生成
ファイルの再合成と再ミックス
レート制限
なし
ご利用のプロバイダーの規定に準じます
ストリーミング対応の音声AIエージェント
ストリーミング対応の音声合成APIを使用する
専用に設計されています
よくあるご質問

音声合成APIに関するよくある質問

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

Raskには音声合成APIがありますか?

音声エージェントやコンタクトセンターでも使用できますか?

APIはストリーミング音声の出力に対応していますか?

原稿はどのように送信すればよいですか?

どのような音声が利用できますか?

カスタム音声を使用できますか?

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

SSMLタグや独自の読み方指定に対応していますか?

感情や抑揚のコントロールはできますか?

音声を生成するには動画が必要ですか?

料金は文字数ごとに発生しますか?

無料プランや無料クレジットはありますか?

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

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

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