> 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/zh/eleven-api/guides/cookbooks/dubbing) 所示。

> **Warning**
>
> 本指南中使用的转录编辑和重新生成端点仅适用于
> 企业版工作区。请联系 [销售团队](https://elevenlabs.io/contact-sales) 获取访问权限。

配音的准确性取决于其所依据的转录文本。本指南介绍可进行修改的两个位置——源转录文本和某种语言的翻译——以及满意后如何重新生成音频。

## 修订机制

每个项目和每种语言都有各自的 `revision` 计数器，均从 `0` 开始。

* 编辑源转录文本会增加项目的 `revision`。转录本身不会。
* 编辑翻译会增加该语言的 `revision`。不会影响源文本或其他语言。
* 语言还会报告 `output_revision`：当前音频生成时所依据的修订版本。当 `output_revision` 落后于 `revision` 时，下载的音频已过期，语言状态会变为 `stale`。

尽可能在添加语言前修正源转录文本。翻译基于源文本生成，因此先修正源文本可确保每种语言都从正确的文本开始。语言创建后再编辑源文本，会将该语言标记为 `stale`，并需要重新生成。

## 编辑源转录文本

读取源转录文本以获取每个片段稳定的 `id`，然后编辑、添加或删除片段。

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

load_dotenv()

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

# Replace with your project's ID
project_id = "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3"

# Read the source transcript
transcript = elevenlabs.dubbing.project.transcript.get(project_id)
first_segment = transcript.segments[0]

# Correct a segment's text
elevenlabs.dubbing.project.transcript.update_segment(
    project_id,
    segment_id=first_segment.id,
    text="Welcome to our latest product demo.",
)

# Add a segment (reuse an existing speaker_id so it is dubbed with that voice)
added = elevenlabs.dubbing.project.transcript.create_segment(
    project_id,
    text="Thanks for watching.",
    speaker_id=first_segment.speaker_id,
    start_s=40.0,
    end_s=42.0,
)

# Delete the segment we just added
elevenlabs.dubbing.project.transcript.delete_segment(
    project_id,
    segment_id=added.segment.id,
)
```

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

const elevenlabs = new ElevenLabsClient();

// Replace with your project's ID
const projectId = "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3";

// Read the source transcript
const transcript = await elevenlabs.dubbing.project.transcript.get(projectId);
const firstSegment = transcript.segments[0];

// Correct a segment's text
await elevenlabs.dubbing.project.transcript.updateSegment(projectId, firstSegment.id, {
  text: "Welcome to our latest product demo.",
});

// Add a segment (reuse an existing speakerId so it is dubbed with that voice)
const added = await elevenlabs.dubbing.project.transcript.createSegment(projectId, {
  text: "Thanks for watching.",
  speakerId: firstSegment.speakerId,
  startS: 40.0,
  endS: 42.0,
});

// Delete the segment we just added
await elevenlabs.dubbing.project.transcript.deleteSegment(projectId, added.segment.id);
```

编辑时间时，`end_s` 必须大于 `start_s`。新片段必须包含全部 4 个字段（`text`、`speaker_id`、`start_s`、`end_s`）；服务器会分配片段 `id`。

## 优化翻译

语言转录文本会将每个源片段与其翻译配对。片段 `id` 与源转录文本一致，因此可将翻译与原文对应。编辑单个片段的翻译可覆盖机器翻译。传入 `null` 可清除翻译，并将该片段标记为待重新翻译。

```python
project_id = "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3"
language_id = "lang_1001kwkyxp0je6ktn4knsfrasx5s"

# Read the language's translations
target = elevenlabs.dubbing.project.language.transcript.get(project_id, language_id)
first_segment = target.segments[0]

# Refine a single translation
elevenlabs.dubbing.project.language.transcript.update_segment(
    project_id,
    language_id,
    segment_id=first_segment.id,
    translation="Bienvenido a nuestra última demostración de producto.",
)
```

```typescript
const projectId = "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3";
const languageId = "lang_1001kwkyxp0je6ktn4knsfrasx5s";

// Read the language's translations
const target = await elevenlabs.dubbing.project.language.transcript.get(projectId, languageId);
const firstSegment = target.segments[0];

// Refine a single translation
await elevenlabs.dubbing.project.language.transcript.updateSegment(
  projectId,
  languageId,
  firstSegment.id,
  { translation: "Bienvenido a nuestra última demostración de producto." }
);
```

编辑翻译会增加该语言的 `revision`。如果该语言此前已完成，会变为 `stale`，并保留之前的音频，直到重新生成。

## 重新生成音频

编辑源转录文本或翻译后，重新生成该语言，即可根据当前转录文本生成新的配音。重新生成的计费方式与生成相同。

```python
import time

# Regenerate from the current transcript
elevenlabs.dubbing.project.language.transcript.regenerate(project_id, language_id)

# Poll until the new output is ready
while True:
    language = elevenlabs.dubbing.project.language.get(project_id, language_id)
    if language.status == "completed":
        break
    if language.status == "failed":
        raise RuntimeError("Regeneration failed")
    time.sleep(5)

print("Fresh output at", language.outputs.lossless_audio)
```

```typescript
// Regenerate from the current transcript
await elevenlabs.dubbing.project.language.transcript.regenerate(projectId, languageId);

// Poll until the new output is ready
let language = await elevenlabs.dubbing.project.language.get(projectId, languageId);
while (language.status !== "completed") {
  if (language.status === "failed") throw new Error("Regeneration failed");
  await new Promise((resolve) => setTimeout(resolve, 5000));
  language = await elevenlabs.dubbing.project.language.get(projectId, languageId);
}

console.log("Fresh output at", language.outputs!.losslessAudio!);
```

如果项目未处于 `ready` 状态，或语言未处于稳定状态（例如已在生成中），重新生成会返回 `409 Conflict`。语言再次达到 `completed` 后，`output_revision` 将等于 `revision`，下载的音频会反映所做的编辑。

> **Note**
>
> 添加语言时，可通过 `cloning_strength` 音色设置（0 到 10，默认值为 7）控制配音说话人对源音色的克隆强度。请参阅[创建 语言目标](/docs/zh/api-reference/dubbing/language-targets/create-language-target) API
> 参考文档。