# 下载音频
> 把已有 clip 转成 mp3 或 wav 文件，异步提交任务
> 用 `clip_id` 引用源音频
> 结果含实际格式与文件大小
`POST /v1/music/generations/downloadAudioFlowMusic`
## 认证
- `Authorization` (string / 必填) — 所有接口均使用 Bearer Token 进行认证。 获取 API Key：[访问控制台](https://api.oairoute.com/keys) 创建。 请求时在请求头中添加： ```http Authorization: Bearer YOUR_OAIRoute_KEY ```
## 请求参数
- `model` (string / 必填) — 模型名，固定传 `flowmusic`，不区分大小写。
- `clip_id` (string / 必填) — 待下载的音乐 clip 标识，取自成功任务的 `result.music[].clip_id`。
- `format` (string / 必填) — 下载格式，只能是这两个值之一： - `mp3` 有损，体积小 - `wav` 无损，适合后期 没有默认值，必须显式传。
## mp3 还是 wav
| 格式 | 体积 | 适合 |
|---|---|---|
| mp3 | 小，约为 wav 的十分之一 | 分发、试听、网络传输 |
| wav | 大 | 后期混音、母带处理、再编辑 |
要拿去继续加工就选 wav。只是给人听就选 mp3，能省下大量存储与带宽。
> **Note:** 
> `format` 是必填项，没有默认值。不传会直接报错，不会默默给你 mp3。
## 提交响应
- `code` (integer) — 状态码，成功为 200。
- `data[].status` (string) — 任务状态，刚提交时为 `submitted`。
- `data[].task_id` (string) — 任务唯一标识，用于查询进度与结果。
## 任务结果
用 `GET /v1/music/tasks/{task_id}` 查询。
- `data.id` (string) — 任务 ID。
- `data.status` (string) — 如 `completed`。
- `data.progress` (integer) — 进度百分比。
- `data.created` (integer) — 创建时间戳。
- `data.completed` (integer) — 完成时间戳。
- `data.actual_time` (integer) — 耗时，单位秒。
- `data.cost` (number) — 费用。
- `data.credits_cost` (number) — 积分消耗。
- `result.music[].clip_id` (string) — 片段标识。
- `result.music[].format` (string) — 实际格式。可能与请求的不同时出现转换失败后的回退。
- `result.music[].mime_type` (string) — MIME 类型，如 `audio/mpeg`、`audio/wav`。
- `result.music[].size_bytes` (integer) — 文件大小，单位字节。
- `result.music[].audio_url` (string) — 音频地址，与 `url` 同值。
- `result.music[].url` (string) — 与 `audio_url` 同值。
> **Note:** 
> `format` 字段返回的是**实际格式**，可能与请求的值不一致。写代码时以返回值为准，不要假设计划要什么就拿什么。
## 一次性拿两种格式
本接口一次只转一种格式。需要 mp3 与 wav 各一份，就得提交两次任务，各计一次费。
如果只是存档，建议直接要 wav，之后自己转 mp3，比重复调用便宜。
## 错误码
错误响应的格式、状态码与重试建议见[错误码与限流](../../../support/errors.html)，常见报错的排查步骤见[常见问题](../../../support/faq.html)。
## 使用示例
提交一个任务并拿到 `task_id`：
> **Note:** 
> 提交成功只表示任务已受理。真正的产物要拿返回的 `task_id` 去任务查询接口轮询，`status` 变成 `completed` 之后才有结果。
**下载音频{Download audio}::cURL**
```
curl -X POST https://api.oairoute.com/v1/music/generations/downloadAudioFlowMusic \
  -H 'Authorization: Bearer YOUR_OAIRoute_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
    "model": "flowmusic",
    "clip_id": "c_01KA",
    "format": "wav"
  }'
```
**下载音频{Download audio}::Python**
```
import requests
res = requests.post(
    "https://api.oairoute.com/v1/music/generations/downloadAudioFlowMusic",
    headers={
        "Authorization": "Bearer YOUR_OAIRoute_KEY",
        "Content-Type": "application/json",
    },
    json={
        "model": "flowmusic",
        "clip_id": "c_01KA",
        "format": "wav",
    },
)
print(res.json()["data"][0]["task_id"])
```
**下载音频{Download audio}::JavaScript**
```
const url = "https://api.oairoute.com/v1/music/generations/downloadAudioFlowMusic";
const options = {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_OAIRoute_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "model": "flowmusic",
    "clip_id": "c_01KA",
    "format": "wav"
  }),
};
fetch(url, options)
  .then((res) => res.json())
  .then((json) => console.log(json))
  .catch((err) => console.error(err));
```
**200 下载音频{Download audio}**
```
{
  "code": 200,
  "data": {
    "id": "task_01K8F33M0HP1GJWBJYZMKX1XS1",
    "status": "completed",
    "progress": 100,
    "created": 1763088289,
    "completed": 1763088301,
    "actual_time": 12,
    "cost": 0.006,
    "credits_cost": 0.06,
    "result": {
      "music": [
        {
          "clip_id": "c_01KA",
          "format": "wav",
          "mime_type": "audio/wav",
          "size_bytes": 31752044,
          "audio_url": "https://cdn.oairoute.com/m/c_01KA.wav",
          "url": "https://cdn.oairoute.com/m/c_01KA.wav"
        }
      ]
    }
  }
}
```
