Communitygithub.com

rodrvc/personal-brand

ElevenLabs Dubbing API(dubbing_v2)を使用して、オーディオや動画を他の言語に吹き替え、元の話者の声を保持します。動画、ポッドキャスト、録音の翻訳、メディアコンテンツのローカライズ、吹き替え文字起こしと翻訳のレビューや修正、編集後の吹き替えの再生成に使用します。

personal-brand とは?

このスキルは、ElevenLabs Dubbing Projects API(dubbing_v2)を活用して、オーディオや動画ファイルを他の言語に吹き替え、元の話者の声を忠実に保持します。動画、ポッドキャスト、録音などのメディアコンテンツを翻訳・ローカライズする際に使用し、ソースの文字起こしの編集、ターゲット言語の追加、セグメントごとの翻訳の調整、吹き替えの再生成といったワークフローをサポートします。対応プラットフォームは、Python、JavaScript(TypeScript)、cURLであり、エンタープライズユーザー向けには文字起こし編集と再生成機能が提供されます。スキルは、プロジェクトの作成(ファイルまたはURLから)、文字起こしの完了待機、ソース文字起こしの確定、ターゲット言語の追加、吹き替えのダウンロード、翻訳の調整と再生成という一連のステップを推奨し、各言語の出力を個別に管理します。古いレガシーAPIではなく、必ずdubbing_v2エンドポイントを使用する必要があります。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/rodrvc/personal-brand/tree/HEAD/.claude/skills/dubbing

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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 とマークされ、(課金される)再生成が必要になります。

エンタープライズ: 文字起こしの編集と再生成はエンタープライズワークスペースでのみ利用可能です。プロジェクトの作成、言語の追加、吹き替えのダウンロードはすべてのプランで動作します。

ワークフロー

  1. ファイルまたはURLからプロジェクトを作成 → queued
  2. プロジェクトが ready になるまでポーリング
  3. ソース文字起こしを確認して確定(セグメントの編集/追加/削除)
  4. ターゲットごとに1つの言語を追加 → queued → processing → completed
  5. completed になったら各言語の outputs.lossless_audio をダウンロード
  6. 必要に応じてセグメントごとに翻訳を調整 → 言語が stale になる
  7. 言語を再生成 → 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**のいずれか(両方は不可)を指定します。

フィールド必須備考
filefile/source_urlのいずれか吹き替え対象のソースメディア(オーディオまたは動画)、最大3 GiB
source_urlfile/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を取得するには言語を再取得してください
  • 文字起こし編集 / 再生成が利用不可: これらのエンドポイントはエンタープライズ限定です。他のプランでは、確定されたソースでプロジェクトを作成し、言語を直接追加してください

参考

関連スキル