動画のナレーション用テキスト読み上げ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はリアルタイムの会話よりも公開済みの動画に適しています。
あなたに合わせて構築

ライブラリにない音声がご入用ですか? ぜひ弊社チームまでご相談ください

ブランドボイス、カタログ外の言語、大容量の処理、独自の配信方法など、公開カタログ以外の要件が必要な場合は、専門チームがご要望と利用可能なオプションを確認いたします。

言語と音声

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

配信と連携

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

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

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

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

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

動画制作でテキスト読み上げAPIを利用しているのは誰か

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

LMS(学習管理システム)やカスタマーエデュケーションプラットフォーム、クリエイター・動画プラットフォーム、ウェビナー・バーチャルイベントツール、動画ホスティング・ワークフローSaaS、デジタルアダプションプラットフォーム、ライブコマースなど。ユーザーが自社プロダクトから離れることなく、テキストの入力や原稿のアップロードを行うだけで、複数言語の動画用ナレーションを作成できます。

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

AI音声やクライアントのカスタム音声を使用してクライアント向け動画の原稿を確認し、独自のミックス用に音声のみのWAVファイルを出力します。確認後にセリフを修正し、該当するセグメントのみを再生成することも可能です。

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

国際的な小売・Eコマース、グローバル展開するフランチャイズ、メディアパブリッシャー、企業内大学など。テキストの原稿から研修、製品紹介、マーケティング動画のナレーションを作成し、製品の変更に合わせてテキストを更新できます。
導入事例

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

Raskを活用して動画をローカライズしている企業の導入実績を数値でご紹介します。
矢印
矢印
コード

音声合成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
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 は、自社のユーザーにそのまま見せても分かりやすい内容になっています。
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回のリクエストで行えます。
文字起こしとそのセグメントを取得する
元のテキストを修正すると、自動で再翻訳されます
翻訳されたテキストを直接修正して、お好みの表現に調整できます
再生時間の調整、セグメントの追加・削除
話者に割り当てられた音声を変更する

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

用語集による専門用語の管理
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と、自社で構築する音声制作パイプラインの比較

テキスト読み上げ(TTS)ストリーミングAPIは、テキストを音声データに変換してリアルタイムで利用できるようにします。公開用の動画に音声を付ける場合、タイミングの調整、話者ごとの音声設定、ミキシング、字幕、そして多くの場合翻訳も必要になります。以下は、同じ音声を2つの方法で作成した場合の比較です。
必要な機能
Rask API
部品を組み合わせた場合
動画のタイミングに合わせたスクリプト
開始時間と終了時間が設定されたセグメント
自社独自の調整ロジック
話者やキャラクターごとの音声
プロジェクトごとの音声マップ
リクエストごとに管理される音声ID
一貫性のあるブランドボイス
カスタム音声クローン
別の音声クローンツール
他言語での同じスクリプト
同じプロジェクト内での翻訳
翻訳APIと新たなタイミング調整
BGMと効果音
音声の下にミックスされるBGM
独自のミキシング作業
.srtおよび.vtt形式の字幕
含まれる
ご自身のタイミングデータから生成
音声のみのトラック
対象プランでのWAV形式の利用
自分で結合する音声チャンク
1行の修正
変更した部分を再生成する
ファイルを再合成して再ミックスする
利用制限
なし
ご利用のプロバイダの制限に従います
ストリーミング対応のライブ音声エージェント
ストリーミング対応の音声合成APIを使用する
最適な設計
よくあるご質問

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

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

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

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

APIは音声のストリーミング出力をサポートしていますか?

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

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

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

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

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

感情表現や抑揚をコントロールすることはできますか?

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

料金は文字数単位ですか?

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

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

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

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