翻訳動画用の音声クローンAPI

動画を他の言語に翻訳しても、話者本人の声をそのまま維持できます。APIが元の動画から各音声を自動でクローンするか、事前に作成したカスタム音声クローンを使用して、クローンされた音声、音声トラック、字幕付きの吹き替え動画を出力します。
インスタント音声クローン
カスタム音声クローン
REST + Python SDK
clone, assign, re-dub
OAuth 2.0
# 1. create the dub - each speaker gets an Instant Voice Clone by default
curl -X POST https://api.rask.ai/v2/projects \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"video_id": "b8f7835d-e8c9-4ff4-8e34-5c336d818319", "dst_lang": "es-mx"}'

# 2. list the voices available in this project
curl https://api.rask.ai/v2/projects/$ID/voices \
  -H "Authorization: Bearer $TOKEN"
#  "label": "Voice Clone", "gender": "auto"         instant clone
#  "label": "Maria Lopez", "sample_src": "https://..."  your custom clone

# 3. assign your custom clone - include every speaker in the map
curl -X PATCH https://api.rask.ai/v2/projects/$ID \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"voice": {"SPEAKER_00": "<custom_voice_id>", "SPEAKER_01": "<voice_id>"}}'
GET /v2/projects/{project_id}
polling, 10s
# 4. re-dub with the new voices, then poll until merging_done
curl -X POST https://api.rask.ai/v2/projects/$ID/generate \
  -H "Authorization: Bearer $TOKEN"
while :; do
  curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq .status
  sleep 10
done
世界中のチームで利用されています
機能一覧

音声クローンAPIでできることのすべて

元の動画から各話者の音声をクローンするか、事前に作成したカスタム音声クローンを使用して、さまざまな言語の翻訳バージョンを作成できます。音声クローン非対応の言語には、AI音声プリセットを選択可能です。また、オプションのリップシンク(別途料金)も追加できます。

インスタント音声クローン

音声サンプルの録音なしで、各話者の元の声が自動でクローンされます。対応しているターゲット言語では、デフォルトで割り当てられます。

カスタム音声クローン

クリアな音声サンプルからRaskアプリで再利用可能な音声を作成するか、既存のプロジェクトから話者の声を音声クローンライブラリに保存できます。話者の同意を得た上で、対応しているターゲット言語のAPIプロジェクト間でその声を再利用可能です。

1人の話者ににつき1つの声

話者は自動で分離され、それぞれが自分のクローン音声を保持するため、インタビュー、パネルディスカッション、ポッドキャストなども聞き取りやすくなります。

リップシンク

完了したプロジェクトのオプションとして、クローン音声に合わせて口の動きを調整できます(別途料金)。顔検出が最初に実行されるため、効果が得られる箇所にのみ適用されます。

背景音の保持

音楽、部屋の環境音、効果音は音声から分離され、クローン音声の下に再びミックスされるため、元の作品の音の質感が保たれます。

AI音声プリセット

音声クローンに対応していない言語や、ストック音声の方が適している場合は、任意の話し手に対して性別を指定したAI音声プリセットを選択できます。

言語を超えて維持される声の個性

クローンはスペイン語、フランス語、日本語などを元の話者の声で話すため、世界中の視聴者に向けてプレゼンターの雰囲気をそのまま届けることができます。

音声を入れ替え、1人の話者の吹き替えをやり直す

話者に別の声を割り当てて再生成します。変更されたセグメントのみが課金の対象となるため、誰も再録音を行う必要がありません。

制限なしで規模を拡大

利用制限、同時実行数の上限、キーごとの制限はありません。膨大な量の作品であっても、クローン音声を使用して並行して大量の吹き替えを作成できます。
実際の動作を見る

1人の話者の声を5つの言語で聴く

英語の元の声に続き、フランス語、ドイツ語、ポルトガル語、スペイン語のクローン音声が流れます。各話者は自分の声を維持し、背景の音声はそのまま残ります。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
ワークフロー

元の動画からクローン音声が完成するまでの3ステップ

プロジェクトを作成すると、インスタントボイスクローンを使用した音声の吹き替えが始まります。声の変更やスクリプトの編集を行った後は、/generateエンドポイントを使用してください。
1

動画をアップロード

ファイルをマルチパートフォームデータとして送信するか、YouTube、Googleドライブ、S3、Vimeo、または任意の直接URLからリンクを投稿します。このビデオの音声は、各インスタントボイスクローンのサンプル音声となります。

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

プロジェクトを作成する

メディアIDをvideo_idとして指定し、ターゲット言語を渡します。検出された各スピーカーには、対応する言語でインスタントボイスクローンが作成され、すぐに吹き替えが開始されます。

POST /v2/projects
3

声の割り当てと再吹き替え

プロジェクトの音声を一覧表示し、任意のスピーカーにカスタムクローンまたはプリセットを割り当てます。その後、/generateを呼び出し、吹き替えが完了したらファイルをダウンロードします。

PATCH /v2/projects/{project_id}
処理時間はプロジェクトによって異なります。スピーカーの声を変更した場合、変更されたスピーカーのセグメントのみが再吹き替えされ、料金が発生します。
あなたを中心に構築

カタログにない音声が必要ですか?当社のチームにお問い合わせください

まだサポートされていない言語の音声クローン、より大きなカスタム音声ライブラリ、独自の配信方法など、音声プロジェクトで公開カタログ以外のものが必要な場合は、当社のチームがお客様の要件と利用可能なオプションを確認します。

言語と音声

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

配信と連携

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

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

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

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

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

音声クローンAPIを利用するユーザー

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

LMSおよびカスタマーエデュケーションプラットフォーム、クリエイターおよび動画プラットフォームとそのモバイルアプリ、ウェビナーおよびバーチャルイベントツール、動画ホスティングおよびワークフローSaaS、デジタルアダプションプラットフォーム、ライブコマース。クリエイターや講師は、音声クローン対応言語において自身の声を維持できます。その他のターゲット言語にはAI音声プリセットを使用し、プラットフォームの機能として多言語の吹き替えを実現します。

ローカライズ・制作会社

クライアント向けのすべての動画で、元のプレゼンターの声を使ったカスタムボイスオーバーを提供します。同意を得た上で、定期的に登場するプレゼンターごとにカスタムボイスクローンを保存し、誰も再録音を求められることなく、APIを通じてすべてのプロジェクトで再利用できます。

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

国際的な小売およびEコマース、グローバル企業、メディアパブリッシャー、企業内大学。トレーナー、経営陣、製品の専門家が一度だけ録音すれば、その後はトレーニングビデオ、製品のアップデート、社内メッセージの多言語版(他言語市場向け)において、自身のクローン音声やAI音声プリセットを使用できます。
導入事例

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

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)

    video = await client.create_media_link(data=schemas.MediaCreateLink(link="https://youtu.be/..."))
    while video.status is not enums.MediaStatus.READY:
        await asyncio.sleep(5)
        video = await client.get_media(media_id=video.id)

    # first dub: every speaker gets an Instant Voice Clone
    job = await wait(client, await client.create_project(
        data=schemas.ProjectCreate(video_id=video.id, dst_lang="es-mx")))

    # assign a custom clone to SPEAKER_00, keep the other speakers as they are
    voices = await client.get_project_voices(project_id=job.id)
    custom = next(v for v in voices if v.label == "Maria Lopez")
    voice_map = {**job.voice, "SPEAKER_00": custom.id}
    await client.patch_project(project_id=job.id, data=schemas.ProjectPatch(voice=voice_map))

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

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

video = requests.post(f"{API}/api/library/v1/media/link", headers=h, json={"link": "https://youtu.be/..."}).json()
while video["status"] != "ready":
    time.sleep(5)
    video = requests.get(f"{API}/api/library/v1/media/{video['id']}", headers=h).json()

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

voices = requests.get(f"{API}/v2/projects/{pid}/voices", headers=h).json()
custom = next(v for v in voices if v["label"] == "Maria Lopez")
voice_map = {**project["voice"], "SPEAKER_00": custom["id"]}   # every speaker stays in the map

requests.patch(f"{API}/v2/projects/{pid}", headers=h, json={"voice": voice_map})
requests.post(f"{API}/v2/projects/{pid}/generate", headers=h)
print(wait(pid)["translated_video"])
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; };

let video = await call('POST', '/api/library/v1/media/link', { link: 'https://youtu.be/...' });
while (video.status !== 'ready') { await sleep(5000); video = await call('GET', `/api/library/v1/media/${video.id}`); }

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

const voices = await call('GET', `/v2/projects/${id}/voices`);
const custom = voices.find((v) => v.label === 'Maria Lopez');
await call('PATCH', `/v2/projects/${id}`, { voice: { ...project.voice, SPEAKER_00: custom.id } });
await call('POST', `/v2/projects/${id}/generate`);

console.log((await wait(id)).translated_video);
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. create the dub - Instant Voice Clones are assigned by default
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\"}" | jq -r .id)

# 3. after merging_done: read the current voice map and the voice options
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq .voice
curl -s https://api.rask.ai/v2/projects/$ID/voices -H "Authorization: Bearer $TOKEN" | jq '.[] | {id, label, gender}'

# 4. assign voices for every speaker, then re-dub
curl -s -X PATCH https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -d '{"voice": {"SPEAKER_00": "<custom_voice_id>", "SPEAKER_01": "<voice_id>"}}'
curl -s -X POST https://api.rask.ai/v2/projects/$ID/generate -H "Authorization: Bearer $TOKEN"
PATCH /v2/projects/{id}
OAuth 2.0 client credentials
<?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']];

$wait = function ($id) use ($http, $h, $json) {
    do { sleep(10); $p = $json($http->get("/v2/projects/$id", ['headers' => $h])); }
    while ($p['status'] !== 'merging_done');
    return $p;
};

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

$voices = $json($http->get("/v2/projects/$id/voices", ['headers' => $h]));
$custom = current(array_filter($voices, fn($v) => $v['label'] === 'Maria Lopez'));
$map = array_merge($project['voice'], ['SPEAKER_00' => $custom['id']]);

$http->patch("/v2/projects/$id", ['headers' => $h, 'json' => ['voice' => $map]]);
$http->post("/v2/projects/$id/generate", ['headers' => $h]);
echo $wait($id)['translated_video'];
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 は、ユーザーに直接表示するのに十分な情報が含まれています。
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">
出力

クローン音声、吹き替えビデオ、字幕

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

用語集

用語集
用語集を追加することで、ブランド名、製品名、技術用語がどの言語でも同じように翻訳され、どの音声で話されても一貫性が保たれます。

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

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

7つのビデオ形式と4つのオーディオ形式のいずれかをアップロードするか、URLを送信してください。ファイル内の音声がインスタントボイスクローンの基準となるため、クリアな音声を使用すると最良の結果が得られます。

動画

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
パーツを組み合わせた場合
元動画から各話者の音声をクローン化
標準機能としてのインスタントボイスクローン
話者ごとの音声サンプルを収集してアップロード
繰り返し使えるカスタム音声
voice_idによるカスタム音声のクローン作成
自社で構築・管理する音声ライブラリ
文字起こし、翻訳、音声合成、ミキシング
一つのAPI
3〜4社のベンダーとそれらを繋ぐ独自コード
話者の自動検出と1話者につき1つの音声
含まれる
話者分離ベンダーと独自の音声割り当てロジック
BGMと効果音を維持
含まれる
自社で構築・調整する音源分離のステップ
音声クローンに対応していない言語
AI音声プリセット
別の音声合成(TTS)ベンダー
リップシンク
オプション(別料金)
別の外部ベンダー
特定の話者の声を変更する場合
変更した部分のセグメントのみ再吹き替え(従量課金)
ファイル全体を通してシステムを再実行
レート制限
なし
ベンダーの最も厳格な適用基準
カタログ外の音声や言語の場合
弊社チームへご相談ください
各ベンダーにより異なります
よくあるご質問

音声クローンAPIに関するよくある質問

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

音声クローン用のAPIはありますか?

API でのボイスクローンはどのように機能しますか?

インスタント音声クローンとカスタム音声クローンの違いは何ですか?

API経由でカスタム音声クローンを作成できますか?

カスタム音声クローンにはどのような音声が必要ですか?

どの言語が音声クローンに対応していますか?

音声クローンAPIをテキスト読み上げとして使用できますか?

吹き替え後に話者の声を変更するにはどうすればよいですか?

カスタム音声はいくつ保存できますか?

音声をクローンするには同意が必要ですか?

クローンされた音声は、話者の感情やアクセントを維持できますか?

クローン音声を商用利用できますか?

音声クローンの費用はいくらですか?

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

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