> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# 複数の言語に吹き替える

> **Note**
>
> **ハウツーガイド** · [ダビングクイックスタート](/docs/ja/eleven-api/guides/cookbooks/dubbing)で示したように、ダビングプロジェクトを作成済みであることを前提としています。

1つのプロジェクトには1つの元トランスクリプトが含まれ、必要な数だけ言語ターゲットを追加できます。各言語は独立して生成され、それぞれにステータスと出力があるため、元データを一度翻訳するだけで、すべての吹き替えを生成できます。

## 複数の言語を追加する

吹き替える言語ごとに言語ターゲットを1つ追加します。各ターゲットは`queued`で開始し、プロジェクトが`ready`になると生成を開始します。

```python
import os
from dotenv import load_dotenv
from elevenlabs.client import ElevenLabs

load_dotenv()

elevenlabs = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))

project_id = "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3"
target_languages = ["es", "fr", "de", "ja"]

languages = [
    elevenlabs.dubbing.project.language.create(project_id, target_language=lang)
    for lang in target_languages
]
```

```typescript
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import "dotenv/config";

const elevenlabs = new ElevenLabsClient();

const projectId = "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3";
const targetLanguages = ["es", "fr", "de", "ja"];

const languages = await Promise.all(
  targetLanguages.map((lang) =>
    elevenlabs.dubbing.project.language.create(projectId, { targetLanguage: lang })
  )
);
```

`project.create`に`target_language`を渡すことで、プロジェクト作成時に最初の言語をキューに追加することもできます。追加の言語は、上記のように`language.create`で追加してください。

言語は、`es`や`fr-CA`などのBCP-47タグで指定します。使用できるすべての値については、[対応言語と方言](/docs/ja/overview/capabilities/dubbing#supported-languages)を参照してください。

## 各言語を個別に追跡する

言語は並行して生成され、完了時刻も異なります。1つずつポーリングするのではなく、プロジェクトの言語を一覧表示してそれぞれのステータスを確認してください。

```python
import time

while True:
    result = elevenlabs.dubbing.project.language.list(project_id)
    pending = [l for l in result.languages if l.status in ("queued", "processing")]
    if not pending:
        break
    print(f"{len(pending)} language(s) still generating...")
    time.sleep(5)
```

```typescript
while (true) {
  const result = await elevenlabs.dubbing.project.language.list(projectId);
  const pending = result.languages.filter(
    (l) => l.status === "queued" || l.status === "processing"
  );
  if (pending.length === 0) break;
  console.log(`${pending.length} language(s) still generating...`);
  await new Promise((resolve) => setTimeout(resolve, 5000));
}
```

## 完了したすべての吹き替えをダウンロードする

言語が`completed`になると、`outputs.lossless_audio`に署名付きダウンロードURLが含まれます。失敗した言語はスキップして、それぞれをダウンロードしてください。

```python
import requests

result = elevenlabs.dubbing.project.language.list(project_id)
for language in result.languages:
    if language.status != "completed":
        print(f"Skipping {language.target_language}: {language.status}")
        continue
    audio = requests.get(language.outputs.lossless_audio)
    with open(f"dubbed_{language.target_language}.wav", "wb") as f:
        f.write(audio.content)
    print(f"Saved dubbed_{language.target_language}.wav")
```

```typescript
import { writeFile } from "fs/promises";

const result = await elevenlabs.dubbing.project.language.list(projectId);
for (const language of result.languages) {
  if (language.status !== "completed") {
    console.log(`Skipping ${language.targetLanguage}: ${language.status}`);
    continue;
  }
  const response = await fetch(language.outputs!.losslessAudio!);
  const buffer = Buffer.from(await response.arrayBuffer());
  await writeFile(`dubbed_${language.targetLanguage}.wav`, buffer);
  console.log(`Saved dubbed_${language.targetLanguage}.wav`);
}
```

署名付きURLは発行から約1時間で期限切れになります。URLの期限切れでダウンロードに失敗した場合は、`language.get`で言語を再度取得して新しいURLを取得してください。

> **Tip**
>
> 言語の生成に失敗した場合は、新しいプロジェクトを作成するのではなく、同じプロジェクトで`language.create`を使用して再度追加してください。プロジェクトとそのトランスクリプトは再利用できるため、失敗した言語だけが再生成されます。