# 淡出
> 为已有音轨添加结尾淡出效果，异步任务
> 参数与「淡入」完全一致，只是作用位置在末尾
> 常与淡入配合做完整的首尾处理
`POST /v1/music/generations/fadeOut`
## 认证
- `Authorization` (string / 必填) — 所有接口均使用 Bearer Token 进行认证。 获取 API Key：[访问控制台](https://api.oairoute.com/keys) 创建。 请求时在请求头中添加： ```http Authorization: Bearer YOUR_OAIRoute_KEY ```
## 引用源音轨
- `task_id` (string / 必填) — 产出源音轨的那次任务的标识。缺失或无法解析出源音轨时，提交阶段立即返回 400。
- `audio_index` (integer / 可选) — 从源任务结果的 `data.result.music[]` 中选取曲目，默认 `1`，从 1 起始。
## 请求参数
- `model` (string / 可选) — 音频模型，省略时默认为 `suno`。
- `duration_s` (number / 必填) — 淡出时长，单位秒。须大于 0 且不超过源音轨的已知时长，允许小数秒。
- `title` (string / 可选) — 处理后音轨的标题，默认 `Untitled`。
## 与淡入的对照
| 项目 | 淡入 | 淡出 |
|---|---|---|
| 路径 | `fadeIn` | `fadeOut` |
| 作用位置 | 音频开头 | 音频结尾 |
| 参数 | 完全一致 | 完全一致 |
淡出时长通常可以比淡入长一些。听众对「慢慢消失」的容忍度比「慢慢出现」高，2 到 4 倍的差距都常见。
> **Note:** 
> 本端点没有版本参数，传 `version` 会被忽略，也不影响计费。
## 响应与轮询
- `code` (integer) — 响应状态码。
- `data[].status` (string) — 提交成功为 `submitted`。
- `data[].task_id` (string) — 任务唯一标识。
轮询用 `GET /v1/music/tasks/{task_id}`，间隔 3 到 5 秒，典型耗时 30 到 120 秒。终态为 `completed` 或 `failed`。完成后从 `data.result.music[]` 的 `audio_url` 取音频，失败原因见 `data.error.message`。
## 首尾都要淡入淡出怎么办
这两个接口是独立操作，不能一次搞定两头。做法是串联：
1. 先调 `fadeIn` 拿到 `task_id`
2. 等它完成后，用**新的** `task_id` 再调 `fadeOut`
顺序反过来也可以。注意第二步要用第一步产出的 task_id，不是最初那个。
> **Note:** 
> 每次处理都会重新编码。首尾各处理一次意味着两次编码，音质会有轻微损失。对音质要求高的场景，考虑在自己那边用无损工具做首尾处理。
## 错误码
错误响应的格式、状态码与重试建议见[错误码与限流](../../../support/errors.html)，常见报错的排查步骤见[常见问题](../../../support/faq.html)。
## 使用示例
提交一个任务并拿到 `task_id`：
> **Note:** 
> 提交成功只表示任务已受理。真正的产物要拿返回的 `task_id` 去任务查询接口轮询，`status` 变成 `completed` 之后才有结果。
**淡出{Fade out}::cURL**
```
curl --request POST \
  --url 'https://api.oairoute.com/v1/music/generations/fadeOut' \
  --header 'Authorization: Bearer YOUR_OAIRoute_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "suno",
    "task_id": "task_01K8SGYNNNVBQTXNR4MM964S7K",
    "audio_index": 1,
    "duration_s": 6
  }'
```
**淡出{Fade out}::Python**
```
import requests
res = requests.post(
    "https://api.oairoute.com/v1/music/generations/fadeOut",
    headers={
        "Authorization": "Bearer YOUR_OAIRoute_KEY",
        "Content-Type": "application/json",
    },
    json={
        "model": "suno",
        "task_id": "task_01K8SGYNNNVBQTXNR4MM964S7K",
        "audio_index": 1,
        "duration_s": 6,
    },
)
print(res.json()["data"][0]["task_id"])
```
**淡出{Fade out}::JavaScript**
```
const url = "https://api.oairoute.com/v1/music/generations/fadeOut";
const options = {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_OAIRoute_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "model": "suno",
    "task_id": "task_01K8SGYNNNVBQTXNR4MM964S7K",
    "audio_index": 1,
    "duration_s": 6
  }),
};
fetch(url, options)
  .then((res) => res.json())
  .then((json) => console.log(json))
  .catch((err) => console.error(err));
```
**200 淡出{Fade out}**
```
{
  "code": 200,
  "data": [
    { "status": "submitted", "task_id": "task_01K8D33M0HP1GJWBJYZMKX1XS1" }
  ]
}
```
