> 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.

# Naar meerdere talen nasynchroniseren

> **Note**
>
> **Handleiding** · Hierbij wordt ervan uitgegaan dat je een nasynchronisatieproject hebt gemaakt, zoals getoond in de [Dubbing quickstart](/docs/nl/eleven-api/guides/cookbooks/dubbing).

Eén project bevat één brontranscript en je kunt zoveel doeltalen toevoegen als je nodig hebt. Elke taal wordt onafhankelijk gegenereerd en heeft een eigen status en output, zodat je de bron één keer vertaalt en daaruit elke nasynchronisatie maakt.

## Meerdere talen toevoegen

Voeg één doeltaal toe voor elke taal waarin je wilt nasynchroniseren. Elke taal begint met de status `queued` en wordt gegenereerd zodra het project `ready` is.

```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 })
  )
);
```

Je kunt ook de eerste taal in de wachtrij zetten wanneer je het project maakt door `target_language` door te geven aan `project.create`. Voeg verdere talen toe met `language.create`, zoals hierboven getoond.

Talen worden opgegeven als BCP-47-tags, bijvoorbeeld `es` of `fr-CA`. Bekijk de [ondersteunde talen en dialecten](/docs/nl/overview/capabilities/dubbing#supported-languages) voor alle geaccepteerde waarden.

## Elke taal afzonderlijk volgen

Talen worden parallel gegenereerd en zijn op verschillende momenten klaar. Geef de talen van het project weer om de status van elke taal te controleren, in plaats van ze één voor één te pollen.

```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));
}
```

## Elke voltooide nasynchronisatie downloaden

Zodra een taal de status `completed` bereikt, bevat `outputs.lossless_audio` een ondertekende download-URL. Download elke nasynchronisatie en sla talen over die zijn mislukt.

```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`);
}
```

Ondertekende URL's verlopen ongeveer een uur nadat ze zijn uitgegeven. Als een download mislukt omdat de URL is verlopen, haal je de taal opnieuw op met `language.get` om een nieuwe URL te krijgen.

> **Tip**
>
> Als een taal niet kan worden gegenereerd, voeg je deze opnieuw toe met `language.create` aan hetzelfde project,
> in plaats van een nieuw project te maken. Het project en het transcript kunnen opnieuw worden gebruikt, dus alleen de mislukte
> taal wordt opnieuw gegenereerd.