> 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)所示。

本指南介绍管理现有项目所需的操作：使用分页列出项目、获取单个项目或语言、刷新过期的下载 URL，以及删除不再需要的项目和语言。

## 列出项目

列表端点使用游标分页。传入 `page_size`（最多 100）和可选的 `status` 过滤条件，然后将响应中的 `next_cursor` 作为 `cursor` 传回，以获取下一页。`next_cursor` 为 `null` 表示已到达末尾。

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

load_dotenv()

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

# Fetch every ready project, one page at a time
cursor = None
while True:
    page = elevenlabs.dubbing.project.list(
        page_size=50,
        status="ready",
        cursor=cursor,
    )
    for project in page.projects:
        print(project.project_id, project.reference)
    if page.next_cursor is None:
        break
    cursor = page.next_cursor
```

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

const elevenlabs = new ElevenLabsClient();

// Fetch every ready project, one page at a time
let cursor: string | undefined = undefined;
while (true) {
  const page = await elevenlabs.dubbing.project.list({
    pageSize: 50,
    status: "ready",
    cursor,
  });
  for (const project of page.projects) {
    console.log(project.projectId, project.reference);
  }
  if (!page.nextCursor) break;
  cursor = page.nextCursor;
}
```

## 获取项目或语言

获取单个项目以读取其状态和媒体元数据，或获取单个语言以读取其状态和输出。

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

project = elevenlabs.dubbing.project.get(project_id)
print(project.status, project.language_ids)

language = elevenlabs.dubbing.project.language.get(project_id, language_id)
print(language.status, language.target_language)
```

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

const project = await elevenlabs.dubbing.project.get(projectId);
console.log(project.status, project.languageIds);

const language = await elevenlabs.dubbing.project.language.get(projectId, languageId);
console.log(language.status, language.targetLanguage);
```

## 刷新过期的下载 URL

`outputs.lossless_audio` 中的签名 URL 有效期约为 1 小时。它不是永久链接，因此应保存下载的文件而不是 URL。若要稍后再次下载已完成的配音，请获取该语言以取得新的 URL。

```python
import requests

language = elevenlabs.dubbing.project.language.get(project_id, language_id)
audio = requests.get(language.outputs.lossless_audio)
with open("dubbed.wav", "wb") as f:
    f.write(audio.content)
```

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

const language = await elevenlabs.dubbing.project.language.get(projectId, languageId);
const response = await fetch(language.outputs!.losslessAudio!);
const buffer = Buffer.from(await response.arrayBuffer());
await writeFile("dubbed.wav", buffer);
```

## 删除项目和语言

删除单个语言目标可移除一条配音并保留项目；删除项目则会移除项目及其所有语言。删除操作不可恢复。

```python
# Remove a single language target
elevenlabs.dubbing.project.language.delete(project_id, language_id)

# Remove the project and all of its languages
elevenlabs.dubbing.project.delete(project_id)
```

```typescript
// Remove a single language target
await elevenlabs.dubbing.project.language.delete(projectId, languageId);

// Remove the project and all of its languages
await elevenlabs.dubbing.project.delete(projectId);
```