翻訳済み動画向けの音声クローン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つの声

話し手は自動で個別に認識され、それぞれが自分のクローン音声を維持するため、インタビューやパネルディスカッション、ポッドキャストでも聞き取りやすさを保てます。

リップシンク

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

背景音をそのまま保持

音楽、部屋の環境音、効果音は音声から分離され、クローン音声の下に再度ミックスされるため、元の制作物の雰囲気をそのまま残せます。

AI音声プリセット

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

言語を超えて一貫した声のイメージ

スペイン語、フランス語、日本語に翻訳しても元の話し手の声のままなので、世界中の視聴者に対してプレゼンターの印象をそのまま届けられます。

声の変更や、特定の話し手の吹き替えのやり直し

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

制限なしのスケール

レート制限、同時実行クォータ、キーごとの制限はありません。クローン音声を使用した大量の動画カタログも、並行して処理できます。
実際の動作を見る

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}
処理時間はプロジェクトによって異なります。話者の音声を変更した場合、変更された話者のセグメントのみが再吹き替えされ、料金が発生します。
あなたに合わせて構築

カタログに掲載されていない音源をお探しですか?当社のチームまでご相談ください

まだサポートされていない言語の音声クローニング、より大規模なカスタム音声ライブラリ、自社独自の配信方法など、パブリックカタログにない特別な音声プロジェクトが必要な場合は、当社のチームがお客様のご要望と利用可能なオプションを確認いたします。

言語と音声

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

配信と連携

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

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

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

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

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

音声クローンAPIを利用しているのは誰か

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

LMSや顧客向け教育プラットフォーム、クリエイターおよび動画プラットフォームとそれらのモバイルアプリ、ウェビナーおよびバーチャルイベントツール、動画ホスティングやワークフローSaaS、デジタルアダプションプラットフォーム、ライブコマースなど。クリエイターや講師は、音声クローニング対応言語全体で自分の声を維持できます。その他のターゲット言語にはAI音声プリセットを使用し、多言語の吹き替えをプラットフォームの機能として組み込むことができます。

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

クライアント向けのすべての動画で、元のプレゼンターの声によるカスタムボイスオーバーを提供します。同意書を取得した上で、リピート出演するプレゼンターごとにカスタムボイスクローンを保存し、再録音を依頼することなく、APIを通じてすべてのプロジェクトで再利用できます。

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

国際的な小売・Eコマース、グローバルフランチャイズ、メディアパブリッシャー、コーポレートユニバーシティ。トレーナー、経営陣、製品の専門家が1回録音するだけで、対応するターゲット言語では自分のクローン音声を、トレーニング動画や製品のアップデート、社内メッセージのその他の市場向けバージョンではAI音声プリセットを使用できます。
導入事例

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

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)

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

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

用語集による専門用語の管理
用語集を添付することで、ブランド名、製品名、専門用語が、どの音声で話されていても、すべての言語で一貫して翻訳されます。

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と自社構築の音声パイプラインの比較

テキスト読み上げの音声クローンAPIは、送信されたテキストを音声に変換します。しかし、翻訳された動画内のクローン音声には、文字起こし、翻訳、話者の分離、タイミング調整、ミキシングも必要です。以下は、同じ結果を2つの方法で実現した場合の比較です。
必要な機能
Rask API
部品を組み合わせた場合
元動画から各話者をクローン
デフォルトでインスタント音声クローンを使用
話者ごとにサンプルを収集してアップロード
再利用可能なカスタム音声
voice_idによるカスタム音声クローン
自分で構築および管理する音声ライブラリ
文字起こし、翻訳、音声合成、ミキシング
1つのAPI
3〜4社のベンダーとそれらを繋ぐコード
話者の検出と、話者ごとに1つの音声
含まれる
話者識別ベンダーと自社製の音声割り当てロジック
BGMや効果音をそのまま保持
含まれる
自社で構築・調整する音源分離のステップ
音声クローンなしの言語
AI音声プリセット
その他のテキスト読み上げベンダー
リップシンク
オプション(別料金)
別のベンダー
1人の話者の音声を変更する
その話者を再ダビングし、変更されたセグメントのみ課金
ファイル全体のパイプラインを再実行する
利用制限
なし
最も厳しい基準を持つベンダーの条件
カタログ外の音声または言語
弊社のチームにご相談ください
ベンダーによって異なります
よくあるご質問

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

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

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

APIでの音声クローンはどのように機能しますか?

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

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

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

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

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

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

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

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

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

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

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

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

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