ElevenLabs Dubbing
オーディオまたは動画を他の言語に吹き替え、元の話者の声を保持します。ファイルまたはURLからプロジェクトを作成し、ソース文字起こしを確認・編集し、1つ以上のターゲット言語を追加し、セグメントごとに翻訳を調整し、出力を再生成します。
重要: Dubbing Projects API — SDKでは
elevenlabs.dubbing.project.*、RESTでは/v1/dubbing/projectエンドポイントを使用してください。レガシーなv1吹き替えAPI(client.dubbing.create()、client.dubbing.get()、client.dubbing.audio.get()、または単体の/v1/dubbingルート)は使用しないでください。これは古い吹き替えAPIであり、APIリファレンスではLegacyにあります。
セットアップ: インストールガイドを参照してください。RESTベースURLは
https://api.elevenlabs.ioで、xi-api-keyヘッダーにAPIキーを指定します。SDKはELEVENLABS_API_KEYを自動的に読み取ります。
概念
| 概念 | 意味 |
|---|---|
| プロジェクト | 1つのメディアソース(ファイルまたはURL)とそのソース文字起こし。一度準備(文字起こし)され、言語を追加している間は ready 状態になります。 |
| ソース文字起こし | ソースから文字起こしされた編集可能なセグメント(テキスト、話者、タイミング)。すべての言語が翻訳される単一の信頼できる情報源です。 |
| 言語(ターゲット) | 1つの吹き替え対象言語。それぞれに独自の文字起こし(ソースセグメント + セグメントごとの翻訳)と独自の吹き替えオーディオ出力があります。 |
| リビジョン | 独立した単調増加カウンター。プロジェクトの revision はソース文字起こしの編集で増加します。言語の revision は翻訳の編集またはそれに影響するソースの編集で増加します。言語の output_revision は現在のオーディオが生成されたリビジョンです。これが revision より小さい場合、出力は最新ではありません。 |
推奨される作業順序: 言語を追加する前にソース文字起こしを確定してください。翻訳はソースから生成されるため、最初にソースを修正することで、すべての言語が正しいテキストから開始されます。言語の完了後にソースを編集すると、その言語は stale とマークされ、(課金される)再生成が必要になります。
エンタープライズ: 文字起こしの編集と再生成はエンタープライズワークスペースでのみ利用可能です。プロジェクトの作成、言語の追加、吹き替えのダウンロードはすべてのプランで動作します。
ワークフロー
- ファイルまたはURLからプロジェクトを作成 →
queued - プロジェクトが
readyになるまでポーリング - ソース文字起こしを確認して確定(セグメントの編集/追加/削除)
- ターゲットごとに1つの言語を追加 →
queued→processing→completed completedになったら各言語のoutputs.lossless_audioをダウンロード- 必要に応じてセグメントごとに翻訳を調整 → 言語が
staleになる - 言語を再生成 →
completedになり、新しい出力が生成される
クイックスタート(Python)
import os
import time
import requests
from elevenlabs.client import ElevenLabs
elevenlabs = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))
# 1. ローカルファイルからプロジェクトを作成(代わりに source_url=... を渡すことも可能)
with open("promo.mp4", "rb") as f:
project = elevenlabs.dubbing.project.create(
file=f,
source_language="en",
reference="Q3 marketing video",
)
# 2. ソースメディアの文字起こしが完了するのを待つ
while True:
project = elevenlabs.dubbing.project.get(project.project_id)
if project.status == "ready":
break
if project.status == "failed":
raise RuntimeError("Project preparation failed")
time.sleep(5)
# 3. スペイン語のターゲット言語を追加
language = elevenlabs.dubbing.project.language.create(
project.project_id,
target_language="es",
)
# 4. 吹き替えの生成が完了するのを待つ
while True:
language = elevenlabs.dubbing.project.language.get(
project.project_id, language.language_id
)
if language.status == "completed":
break
if language.status == "failed":
raise RuntimeError("Dub generation failed")
time.sleep(5)
# 5. 吹き替えオーディオをダウンロード(署名付きURL、有効期間約1時間 — 新しいURLを取得するには言語を再取得)
audio = requests.get(language.outputs.lossless_audio)
with open("promo_es.wav", "wb") as f:
f.write(audio.content)
クイックスタート(JavaScript)
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import { writeFile } from "fs/promises";
const elevenlabs = new ElevenLabsClient();
// 1. プロジェクトを作成(sourceUrl の場合を示します。ファイルアップロードもサポート)
let project = await elevenlabs.dubbing.project.create({
sourceUrl: "https://example.com/promo.mp4",
sourceLanguage: "en",
reference: "Q3 marketing video",
});
// 2. ソースメディアの文字起こしが完了するのを待つ
while (true) {
project = await elevenlabs.dubbing.project.get(project.projectId);
if (project.status === "ready") break;
if (project.status === "failed") throw new Error("Project preparation failed");
await new Promise((resolve) => setTimeout(resolve, 5000));
}
// 3. スペイン語のターゲット言語を追加
let language = await elevenlabs.dubbing.project.language.create(project.projectId, {
targetLanguage: "es",
});
// 4. 吹き替えの生成が完了するのを待つ
while (true) {
language = await elevenlabs.dubbing.project.language.get(project.projectId, language.languageId);
if (language.status === "completed") break;
if (language.status === "failed") throw new Error("Dub generation failed");
await new Promise((resolve) => setTimeout(resolve, 5000));
}
// 5. 署名付きURLから吹き替えオーディオをダウンロード
const response = await fetch(language.outputs!.losslessAudio!);
await writeFile("promo_es.wav", Buffer.from(await response.arrayBuffer()));
クイックスタート(cURL)
# 1. プロジェクトを作成(fileの代わりに -F "source_url=https://..." を使用してURLから吹き替え)
curl -X POST "https://api.elevenlabs.io/v1/dubbing/project" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-F "[email protected]" \
-F "source_language=en"
# → {"project_id": "proj_...", "status": "queued", ...}
# 2. ステータスが "ready" になるまでポーリング
curl "https://api.elevenlabs.io/v1/dubbing/project/proj_..." \
-H "xi-api-key: $ELEVENLABS_API_KEY"
# 3. ターゲット言語を追加
curl -X POST "https://api.elevenlabs.io/v1/dubbing/project/proj_.../language" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"target_language": "es"}'
# 4. 言語が "completed" になるまでポーリングし、outputs.lossless_audio をダウンロード
curl "https://api.elevenlabs.io/v1/dubbing/project/proj_.../language/lang_..." \
-H "xi-api-key: $ELEVENLABS_API_KEY"
作成オプション
POST /v1/dubbing/project は multipart/form-data を受け取り、file または **source_url**のいずれか(両方は不可)を指定します。
| フィールド | 必須 | 備考 |
|---|---|---|
file | file/source_urlのいずれか | 吹き替え対象のソースメディア(オーディオまたは動画)、最大3 GiB |
source_url | file/source_urlのいずれか | ソースメディアを取得する公開URL |
source_language | いいえ | ISO 639コード(例:en)。省略すると自動検出 — 検出された言語はソース文字起こしの language フィールドに報告されます |
reference | いいえ | プロジェクトを識別するための自由形式のラベル(最大500文字) |
model_id | いいえ | dubbing_v2(デフォルト) |
target_language | いいえ | 作成時に最初の言語ターゲットをキューに入れるオプション。追加の言語は language.create で追加 |
keyterms | いいえ | 文字起こし/翻訳を特定の用語(製品/ブランド名)に偏らせるための用語。最大100語、各200文字まで。マルチパートではフィールドを用語ごとに1回繰り返します |
ソース文字起こしの編集
プロジェクトが ready になったら、文字起こしを読み取り、言語を追加する前に修正します。編集のたびにプロジェクトの revision が増加します。各セグメントには、編集または削除に使用される安定した id があります(エンタープライズワークスペースのみ)。
# ソース文字起こしを読み取り
transcript = elevenlabs.dubbing.project.transcript.get(project_id)
# セグメントのテキストを修正 — 変更するフィールドのみ送信(text, speaker_id, start_s, end_s)
elevenlabs.dubbing.project.transcript.update_segment(
project_id,
segment_id=transcript.segments[0].id,
text="Welcome to our latest product demo.",
)
# セグメントを追加(既存のspeaker_idを再利用すると、その話者の声で吹き替えられます)
added = elevenlabs.dubbing.project.transcript.create_segment(
project_id,
text="Thanks for watching.",
speaker_id=transcript.segments[0].speaker_id,
start_s=40.0,
end_s=42.0,
)
# セグメントを削除
elevenlabs.dubbing.project.transcript.delete_segment(project_id, segment_id=added.segment.id)
REST経由: GET /v1/dubbing/project/{project_id}/transcript、続けて変更するフィールドのみ指定して PATCH .../transcript/segment/{segment_id}:
curl -X PATCH "https://api.elevenlabs.io/v1/dubbing/project/{project_id}/transcript/segment/{segment_id}" \
-H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
-d '{"text": "Welcome to our latest product demo."}'
翻訳の調整と再生成
言語の文字起こしは、各ソースセグメントをその translation とペアにします(null = まだ翻訳されていない; セグメントIDはソースと一致)。単一の翻訳を編集し、その後再生成します(エンタープライズワークスペースのみ)。
# 言語の翻訳を読み取り
target = elevenlabs.dubbing.project.language.transcript.get(project_id, language_id)
# 単一の翻訳を調整(translation=None を渡すとクリアされ、再翻訳の対象としてマークされます)
elevenlabs.dubbing.project.language.transcript.update_segment(
project_id,
language_id,
segment_id=target.segments[0].id,
translation="Bienvenido a nuestra última demostración de producto.",
)
# 現在の文字起こしから吹き替えを再生成(生成と同様に課金されます)
elevenlabs.dubbing.project.language.transcript.regenerate(project_id, language_id)
REST経由: PATCH /v1/dubbing/project/{project_id}/language/{language_id}/transcript/segment/{segment_id} で {"translation": "..."}、続けて POST .../language/{language_id}/transcript/regenerate(202 Accepted を返します)。
翻訳の編集はその言語にのみ影響します。編集後、completed 状態の言語は stale になります — 再生成するまで以前の出力を提供し続けます。completed になるまでポーリングすると、output_revision が revision と等しくなり、outputs.lossless_audio が現在の文字起こしを反映します。
複数の言語への吹き替え
言語ごとに1つのターゲット言語を追加します。それぞれが独立して生成されます。すべてを追跡するには、個別にポーリングする代わりに language.list を使用します。
for lang in ["es", "fr", "de", "ja"]:
elevenlabs.dubbing.project.language.create(project_id, target_language=lang)
while True:
result = elevenlabs.dubbing.project.language.list(project_id)
if not any(l.status in ("queued", "processing") for l in result.languages):
break
time.sleep(5)
状態
プロジェクト:
| 状態 | 意味 |
|---|---|
queued | 作成されました。ソースの取得と準備がキューに入れられました |
preparing | 準備(文字起こし)が実行中です |
ready | ソース文字起こしが利用可能です。言語を追加/生成できます。プロジェクトは ready のままです — 言語ごとの進行状況は言語側で管理されます |
failed | 準備に失敗しました(例:ソースを取得またはデコードできませんでした) |
言語:
| 状態 | 意味 |
|---|---|
queued | プロジェクトが ready になるか、生成ワーカーが利用可能になるのを待っています |
processing | 吹き替えが生成中です |
completed | 完了しました。outputs に署名付きダウンロードURLが設定されています(有効期間約1時間 — 新しいURLを取得するには再取得してください) |
stale | 以前に完了しましたが、文字起こしが変更されました。再生成されるまで最後の出力が保持されます |
failed | 生成に失敗しました |
プロジェクトが ready になる前に言語を追加できます — その言語は queued のままで、プロジェクトが ready になると自動的に開始されます。言語を追加する際は、オプションで model_id(デフォルトはプロジェクトのもの)と voice_settings(例:{"cloning_strength": 7}、範囲0–10、デフォルト7 — 吹き替え話者がソースの声をどの程度クローンするかを制御します)を受け付けます。
エラーハンドリング
- 401: 無効なAPIキー
- 409 Conflict(再生成時): プロジェクトが
readyでないか、言語が安定していません(例:すでに生成中)。待機して再試行してください - ダウンロードURLの期限切れ:
outputs.lossless_audioは署名付きで約1時間有効です。新しいURLを取得するには言語を再取得してください - 文字起こし編集 / 再生成が利用不可: これらのエンドポイントはエンタープライズ限定です。他のプランでは、確定されたソースでプロジェクトを作成し、言語を直接追加してください