Spaces:
Running
on
A100
Running
on
A100
File size: 17,601 Bytes
1e0d19a 428436b 1e0d19a 428436b 1e0d19a 428436b 1e0d19a 428436b 1e0d19a 428436b 1e0d19a 428436b 1e0d19a 428436b 1e0d19a 428436b 1e0d19a 428436b 1e0d19a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 |
# ACE-Step API 客户端文档
**Language / 语言 / 言語:** [English](../en/API.md) | [中文](API.md) | [日本語](../ja/API.md)
---
本服务提供基于 HTTP 的异步音乐生成 API。
**基本工作流程**:
1. 调用 `POST /v1/music/generate` 提交任务并获取 `job_id`。
2. 调用 `GET /v1/jobs/{job_id}` 轮询任务状态,直到 `status` 为 `succeeded` 或 `failed`。
3. 通过结果中返回的 `GET /v1/audio?path=...` URL 下载音频文件。
---
## 目录
- [任务状态说明](#1-任务状态说明)
- [创建生成任务](#2-创建生成任务)
- [查询任务结果](#3-查询任务结果)
- [随机样本生成](#4-随机样本生成)
- [列出可用模型](#5-列出可用模型)
- [下载音频文件](#6-下载音频文件)
- [健康检查](#7-健康检查)
- [环境变量](#8-环境变量)
---
## 1. 任务状态说明
任务状态(`status`)包括以下类型:
- `queued`:任务已进入队列,等待执行。此时可以查看 `queue_position` 和 `eta_seconds`。
- `running`:生成正在进行中。
- `succeeded`:生成成功,结果在 `result` 字段中。
- `failed`:生成失败,错误信息在 `error` 字段中。
---
## 2. 创建生成任务
### 2.1 API 定义
- **URL**:`/v1/music/generate`
- **方法**:`POST`
- **Content-Type**:`application/json`、`multipart/form-data` 或 `application/x-www-form-urlencoded`
### 2.2 请求参数
#### 参数命名约定
API 支持大多数参数的 **snake_case** 和 **camelCase** 命名。例如:
- `audio_duration` / `duration` / `audioDuration`
- `key_scale` / `keyscale` / `keyScale`
- `time_signature` / `timesignature` / `timeSignature`
- `sample_query` / `sampleQuery` / `description` / `desc`
- `use_format` / `useFormat` / `format`
此外,元数据可以通过嵌套对象传递(`metas`、`metadata` 或 `user_metadata`)。
#### 方法 A:JSON 请求(application/json)
适用于仅传递文本参数,或引用服务器上已存在的音频文件路径。
**基本参数**:
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `caption` | string | `""` | 音乐描述提示词 |
| `lyrics` | string | `""` | 歌词内容 |
| `thinking` | bool | `false` | 是否使用 5Hz LM 生成音频代码(lm-dit 行为)|
| `vocal_language` | string | `"en"` | 歌词语言(en、zh、ja 等)|
| `audio_format` | string | `"mp3"` | 输出格式(mp3、wav、flac)|
**样本/描述模式参数**:
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `sample_mode` | bool | `false` | 启用随机样本生成模式(通过 LM 自动生成 caption/lyrics/metas)|
| `sample_query` | string | `""` | 用于样本生成的自然语言描述(例如"一首柔和的孟加拉情歌")。别名:`description`、`desc` |
| `use_format` | bool | `false` | 使用 LM 增强/格式化提供的 caption 和 lyrics。别名:`format` |
**多模型支持**:
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `model` | string | null | 选择使用哪个 DiT 模型(例如 `"acestep-v15-turbo"`、`"acestep-v15-turbo-shift3"`)。使用 `/v1/models` 列出可用模型。如果未指定,使用默认模型。|
**thinking 语义(重要)**:
- `thinking=false`:
- 服务器**不会**使用 5Hz LM 生成 `audio_code_string`。
- DiT 以 **text2music** 模式运行,**忽略**任何提供的 `audio_code_string`。
- `thinking=true`:
- 服务器将使用 5Hz LM 生成 `audio_code_string`(lm-dit 行为)。
- DiT 使用 LM 生成的代码运行,以增强音乐质量。
**元数据自动补全(条件性)**:
当 `use_cot_caption=true` 或 `use_cot_language=true` 或元数据字段缺失时,服务器可能会调用 5Hz LM 根据 `caption`/`lyrics` 填充缺失的字段:
- `bpm`
- `key_scale`
- `time_signature`
- `audio_duration`
用户提供的值始终优先;LM 只填充空/缺失的字段。
**音乐属性参数**:
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `bpm` | int | null | 指定节奏(BPM),范围 30-300 |
| `key_scale` | string | `""` | 调性(例如"C Major"、"Am")。别名:`keyscale`、`keyScale` |
| `time_signature` | string | `""` | 拍号(2、3、4、6 分别表示 2/4、3/4、4/4、6/8)。别名:`timesignature`、`timeSignature` |
| `audio_duration` | float | null | 生成时长(秒),范围 10-600。别名:`duration`、`target_duration` |
**音频代码(可选)**:
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `audio_code_string` | string 或 string[] | `""` | 用于 `llm_dit` 的音频语义令牌(5Hz)。别名:`audioCodeString` |
**生成控制参数**:
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `inference_steps` | int | `8` | 推理步数。Turbo 模型:1-20(推荐 8)。Base 模型:1-200(推荐 32-64)|
| `guidance_scale` | float | `7.0` | 提示引导系数。仅对 base 模型有效 |
| `use_random_seed` | bool | `true` | 是否使用随机种子 |
| `seed` | int | `-1` | 指定种子(当 use_random_seed=false 时)|
| `batch_size` | int | `2` | 批量生成数量(最多 8)|
**高级 DiT 参数**:
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `shift` | float | `3.0` | 时间步偏移因子(范围 1.0-5.0)。仅对 base 模型有效,对 turbo 模型无效 |
| `infer_method` | string | `"ode"` | 扩散推理方法:`"ode"`(Euler,更快)或 `"sde"`(随机)|
| `timesteps` | string | null | 自定义时间步,逗号分隔值(例如 `"0.97,0.76,0.615,0.5,0.395,0.28,0.18,0.085,0"`)。覆盖 `inference_steps` 和 `shift` |
| `use_adg` | bool | `false` | 使用自适应双引导(仅 base 模型)|
| `cfg_interval_start` | float | `0.0` | CFG 应用起始比例(0.0-1.0)|
| `cfg_interval_end` | float | `1.0` | CFG 应用结束比例(0.0-1.0)|
**5Hz LM 参数(可选,服务器端)**:
这些参数控制 5Hz LM 采样,用于元数据自动补全和(当 `thinking=true` 时)代码生成。
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `lm_model_path` | string | null | 5Hz LM 检查点目录名(例如 `acestep-5Hz-lm-0.6B`)|
| `lm_backend` | string | `"vllm"` | `vllm` 或 `pt` |
| `lm_temperature` | float | `0.85` | 采样温度 |
| `lm_cfg_scale` | float | `2.5` | CFG 比例(>1 启用 CFG)|
| `lm_negative_prompt` | string | `"NO USER INPUT"` | CFG 使用的负面提示 |
| `lm_top_k` | int | null | Top-k(0/null 禁用)|
| `lm_top_p` | float | `0.9` | Top-p(>=1 将被视为禁用)|
| `lm_repetition_penalty` | float | `1.0` | 重复惩罚 |
**LM CoT(思维链)参数**:
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `use_cot_caption` | bool | `true` | 让 LM 通过 CoT 推理重写/增强输入 caption。别名:`cot_caption`、`cot-caption` |
| `use_cot_language` | bool | `true` | 让 LM 通过 CoT 检测人声语言。别名:`cot_language`、`cot-language` |
| `constrained_decoding` | bool | `true` | 启用基于 FSM 的约束解码以获得结构化 LM 输出。别名:`constrainedDecoding`、`constrained` |
| `constrained_decoding_debug` | bool | `false` | 启用约束解码的调试日志 |
**编辑/参考音频参数**(需要服务器上的绝对路径):
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `reference_audio_path` | string | null | 参考音频路径(风格迁移)|
| `src_audio_path` | string | null | 源音频路径(重绘/翻唱)|
| `task_type` | string | `"text2music"` | 任务类型:`text2music`、`cover`、`repaint`、`lego`、`extract`、`complete` |
| `instruction` | string | auto | 编辑指令(如未提供则根据 task_type 自动生成)|
| `repainting_start` | float | `0.0` | 重绘开始时间(秒)|
| `repainting_end` | float | null | 重绘结束时间(秒),-1 表示音频末尾 |
| `audio_cover_strength` | float | `1.0` | 翻唱强度(0.0-1.0)。风格迁移使用较小值(0.2)|
#### 方法 B:文件上传(multipart/form-data)
当需要上传本地音频文件作为参考或源音频时使用。
除了支持上述所有字段作为表单字段外,还支持以下文件字段:
- `reference_audio`:(文件)上传参考音频文件
- `src_audio`:(文件)上传源音频文件
> **注意**:上传文件后,相应的 `_path` 参数将被自动忽略,系统将使用上传后的临时文件路径。
### 2.3 响应示例
```json
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "queued",
"queue_position": 1
}
```
### 2.4 使用示例(cURL)
**基本 JSON 方法**:
```bash
curl -X POST http://localhost:8001/v1/music/generate \
-H 'Content-Type: application/json' \
-d '{
"caption": "欢快的流行歌曲",
"lyrics": "你好世界",
"inference_steps": 8
}'
```
**使用 thinking=true(LM 生成代码 + 填充缺失元数据)**:
```bash
curl -X POST http://localhost:8001/v1/music/generate \
-H 'Content-Type: application/json' \
-d '{
"caption": "欢快的流行歌曲",
"lyrics": "你好世界",
"thinking": true,
"lm_temperature": 0.85,
"lm_cfg_scale": 2.5
}'
```
**描述驱动生成(sample_query)**:
```bash
curl -X POST http://localhost:8001/v1/music/generate \
-H 'Content-Type: application/json' \
-d '{
"sample_query": "一首适合安静夜晚的柔和孟加拉情歌",
"thinking": true
}'
```
**使用格式增强(use_format=true)**:
```bash
curl -X POST http://localhost:8001/v1/music/generate \
-H 'Content-Type: application/json' \
-d '{
"caption": "流行摇滚",
"lyrics": "[Verse 1]\n走在街上...",
"use_format": true,
"thinking": true
}'
```
**选择特定模型**:
```bash
curl -X POST http://localhost:8001/v1/music/generate \
-H 'Content-Type: application/json' \
-d '{
"caption": "电子舞曲",
"model": "acestep-v15-turbo",
"thinking": true
}'
```
**使用自定义时间步**:
```bash
curl -X POST http://localhost:8001/v1/music/generate \
-H 'Content-Type: application/json' \
-d '{
"caption": "爵士钢琴三重奏",
"timesteps": "0.97,0.76,0.615,0.5,0.395,0.28,0.18,0.085,0",
"thinking": true
}'
```
**使用 thinking=false(仅 DiT,但填充缺失元数据)**:
```bash
curl -X POST http://localhost:8001/v1/music/generate \
-H 'Content-Type: application/json' \
-d '{
"caption": "缓慢的情感民谣",
"lyrics": "...",
"thinking": false,
"bpm": 72
}'
```
**文件上传方法**:
```bash
curl -X POST http://localhost:8001/v1/music/generate \
-F "caption=重新混音这首歌" \
-F "src_audio=@/path/to/local/song.mp3" \
-F "task_type=repaint"
```
---
## 3. 查询任务结果
### 3.1 API 定义
- **URL**:`/v1/jobs/{job_id}`
- **方法**:`GET`
### 3.2 响应参数
响应包含基本任务信息、队列状态和最终结果。
**主要字段**:
- `status`:当前状态
- `queue_position`:当前队列位置(0 表示正在运行或已完成)
- `eta_seconds`:预计剩余等待时间(秒)
- `avg_job_seconds`:平均任务持续时间(用于 ETA 估算)
- `result`:成功时的结果对象
- `audio_paths`:生成的音频文件 URL 列表(配合 `/v1/audio` 端点使用)
- `first_audio_path`:第一个音频路径(URL)
- `second_audio_path`:第二个音频路径(URL,如果 batch_size >= 2)
- `generation_info`:生成参数详情
- `status_message`:简短结果描述
- `seed_value`:使用的种子值,逗号分隔
- `metas`:完整元数据字典
- `bpm`:检测到/使用的 BPM
- `duration`:检测到/使用的时长
- `keyscale`:检测到/使用的调性
- `timesignature`:检测到/使用的拍号
- `genres`:检测到的风格(如果可用)
- `lm_model`:使用的 LM 模型名称
- `dit_model`:使用的 DiT 模型名称
- `error`:失败时的错误信息
### 3.3 响应示例
**排队中**:
```json
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "queued",
"created_at": 1700000000.0,
"queue_position": 5,
"eta_seconds": 25.0,
"avg_job_seconds": 5.0,
"result": null,
"error": null
}
```
**执行成功**:
```json
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "succeeded",
"created_at": 1700000000.0,
"started_at": 1700000001.0,
"finished_at": 1700000010.0,
"queue_position": 0,
"result": {
"first_audio_path": "/v1/audio?path=%2Ftmp%2Fapi_audio%2Fabc123.mp3",
"second_audio_path": "/v1/audio?path=%2Ftmp%2Fapi_audio%2Fdef456.mp3",
"audio_paths": [
"/v1/audio?path=%2Ftmp%2Fapi_audio%2Fabc123.mp3",
"/v1/audio?path=%2Ftmp%2Fapi_audio%2Fdef456.mp3"
],
"generation_info": "🎵 生成了 2 个音频\n⏱️ 总计:8.5s\n🎲 种子:12345,67890",
"status_message": "✅ 生成成功完成!",
"seed_value": "12345,67890",
"metas": {
"bpm": 120,
"duration": 30,
"keyscale": "C Major",
"timesignature": "4",
"caption": "欢快的流行歌曲,旋律动听"
},
"bpm": 120,
"duration": 30,
"keyscale": "C Major",
"timesignature": "4",
"genres": null,
"lm_model": "acestep-5Hz-lm-0.6B",
"dit_model": "acestep-v15-turbo"
},
"error": null
}
```
---
## 4. 随机样本生成
### 4.1 API 定义
- **URL**:`/v1/music/random`
- **方法**:`POST`
此端点创建一个样本模式任务,通过 5Hz LM 自动生成 caption、lyrics 和元数据。
### 4.2 请求参数
| 参数名 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| `thinking` | bool | `true` | 是否同时通过 LM 生成音频代码 |
### 4.3 响应示例
```json
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "queued",
"queue_position": 1
}
```
### 4.4 使用示例
```bash
curl -X POST http://localhost:8001/v1/music/random \
-H 'Content-Type: application/json' \
-d '{"thinking": true}'
```
---
## 5. 列出可用模型
### 5.1 API 定义
- **URL**:`/v1/models`
- **方法**:`GET`
返回服务器上加载的可用 DiT 模型列表。
### 5.2 响应示例
```json
{
"models": [
{
"name": "acestep-v15-turbo",
"is_default": true
},
{
"name": "acestep-v15-turbo-shift3",
"is_default": false
}
],
"default_model": "acestep-v15-turbo"
}
```
### 5.3 使用示例
```bash
curl http://localhost:8001/v1/models
```
---
## 6. 下载音频文件
### 6.1 API 定义
- **URL**:`/v1/audio`
- **方法**:`GET`
通过路径下载生成的音频文件。
### 6.2 请求参数
| 参数名 | 类型 | 说明 |
| :--- | :--- | :--- |
| `path` | string | URL 编码的音频文件路径 |
### 6.3 使用示例
```bash
# 使用任务结果中的 URL 下载
curl "http://localhost:8001/v1/audio?path=%2Ftmp%2Fapi_audio%2Fabc123.mp3" -o output.mp3
```
---
## 7. 健康检查
### 7.1 API 定义
- **URL**:`/health`
- **方法**:`GET`
返回服务健康状态。
### 7.2 响应示例
```json
{
"status": "ok",
"service": "ACE-Step API",
"version": "1.0"
}
```
---
## 8. 环境变量
API 服务器可以通过环境变量进行配置:
| 变量 | 默认值 | 说明 |
| :--- | :--- | :--- |
| `ACESTEP_API_HOST` | `127.0.0.1` | 服务器绑定主机 |
| `ACESTEP_API_PORT` | `8001` | 服务器绑定端口 |
| `ACESTEP_CONFIG_PATH` | `acestep-v15-turbo` | 主 DiT 模型路径 |
| `ACESTEP_CONFIG_PATH2` | (空)| 辅助 DiT 模型路径(可选)|
| `ACESTEP_CONFIG_PATH3` | (空)| 第三个 DiT 模型路径(可选)|
| `ACESTEP_DEVICE` | `auto` | 模型加载设备 |
| `ACESTEP_USE_FLASH_ATTENTION` | `true` | 启用 flash attention |
| `ACESTEP_OFFLOAD_TO_CPU` | `false` | 空闲时将模型卸载到 CPU |
| `ACESTEP_OFFLOAD_DIT_TO_CPU` | `false` | 专门将 DiT 卸载到 CPU |
| `ACESTEP_LM_MODEL_PATH` | `acestep-5Hz-lm-0.6B` | 默认 5Hz LM 模型 |
| `ACESTEP_LM_BACKEND` | `vllm` | LM 后端(vllm 或 pt)|
| `ACESTEP_LM_DEVICE` | (与 ACESTEP_DEVICE 相同)| LM 设备 |
| `ACESTEP_LM_OFFLOAD_TO_CPU` | `false` | 将 LM 卸载到 CPU |
| `ACESTEP_QUEUE_MAXSIZE` | `200` | 最大队列大小 |
| `ACESTEP_QUEUE_WORKERS` | `1` | 队列工作者数量 |
| `ACESTEP_AVG_JOB_SECONDS` | `5.0` | 初始平均任务持续时间估算 |
| `ACESTEP_TMPDIR` | `.cache/acestep/tmp` | 临时文件目录 |
---
## 错误处理
**HTTP 状态码**:
- `200`:成功
- `400`:无效请求(错误的 JSON、缺少字段)
- `404`:找不到任务
- `415`:不支持的 Content-Type
- `429`:服务器繁忙(队列已满)
- `500`:内部服务器错误
**错误响应格式**:
```json
{
"detail": "描述问题的错误消息"
}
```
---
## 最佳实践
1. **使用 `thinking=true`** 以获得 LM 增强生成的最佳质量结果。
2. **使用 `sample_query`/`description`** 从自然语言描述快速生成。
3. **使用 `use_format=true`** 当你有 caption/lyrics 但希望 LM 增强它们时。
4. **轮询任务状态** 时使用合理的间隔(例如每 1-2 秒),以避免服务器过载。
5. **检查 `avg_job_seconds`** 响应来估算等待时间。
6. **使用多模型支持** 通过设置 `ACESTEP_CONFIG_PATH2` 和 `ACESTEP_CONFIG_PATH3` 环境变量,然后通过 `model` 参数选择。
7. **生产环境** 中,始终设置正确的 Content-Type 头以避免 415 错误。
|