音乐生成(Suno)
suno(V6 / V6 Wild / V6 Mini)全部音乐操作:生成歌曲、歌词、续写、翻唱、分轨、MIDI、音乐视频等,异步,用 GET /v1/music/tasks/{task_id} 查询
所有 Suno 接口都是异步任务:提交后拿到 task_id,再轮询查询接口获取结果。所有接口都需要 API Key:Authorization: Bearer sk-lt-...,详见鉴权。同一套接口也承载 Flow Music(model: "flowmusic")。
| 项 | 值 |
|---|---|
| 模型 | suno(可省略 model 字段) |
| 版本 | v6、v6-wild、v6-mini,或自定义模型 custom_model_id |
| 模式 | 异步(提交 → 轮询 GET /v1/music/tasks/{task_id}) |
| 轮询间隔 | 首次等待约 3 秒,之后每 5 到 10 秒 |
| 计费 | 按操作固定计费,Max 模式 2 倍;失败自动退款 |
快速开始
curl https://api.vibelab.me/v1/music/generations \
-H "Authorization: Bearer $LOOPTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno",
"version": "v6",
"custom": false,
"prompt": "深夜城市 lo-fi 钢琴配雨声"
}'自定义歌词模式:
curl https://api.vibelab.me/v1/music/generations \
-H "Authorization: Bearer $LOOPTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno",
"version": "v6",
"custom": true,
"instrumental": false,
"prompt": "[Verse]\n雨夜霓虹灯下的街道",
"title": "深夜驾驶",
"style": "synthwave, female vocal, cinematic",
"negative_tags": "metal, screaming",
"vocal_gender": "Female",
"style_weight": 0.6,
"weirdness_constraint": 0.3,
"audio_weight": 0.5
}'所有提交接口的响应形状相同(详见响应):
{
"code": 200,
"data": [
{ "status": "submitted", "task_id": "at_0198f0a0-1111-7777-8888-999999999999" }
]
}submitted 只表示任务已受理。不要因为网络超时自动重发收费的 POST 请求;拿到 task_id 后用查询接口确认结果。
模式选择
| 模式 | 怎么传参 |
|---|---|
| 灵感模式 | custom: false,prompt 为歌曲描述(≤ 3000 字符) |
| 自定义歌词模式 | custom: true,prompt 为歌词(≤ 5000 字符),可加 title、style、negative_tags、persona_id 等 |
| 自定义模型 | 传 custom_model_id,省略 version 与 persona_id |
| 其它操作 | POST /v1/music/generations/{operation},见操作列表 |
请求参数
生成音乐
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
model | string | 否 | suno | 可省略;写则只能是 suno(或 flowmusic,见 Flow Music) |
version | string | 与 custom_model_id 二选一 | - | v6 / v6-wild / v6-mini |
custom_model_id | string | 与 version 二选一 | - | 创建自定义模型(createModel)返回的 model_id;与 version、persona_id 互斥 |
custom | boolean | 否 | - | false 灵感模式(prompt 为歌曲描述,最多 3000 字符);true 自定义模式(prompt 为歌词,最多 5000 字符) |
instrumental | boolean | 否 | - | 纯音乐;自定义纯音乐可省略 prompt |
prompt | string | 视模式 | - | 描述或歌词,见 custom |
title | string | 否 | - | 标题,最多 80 字符,仅自定义模式 |
style | string | 否 | - | 风格标签,最多 1000 字符,仅自定义模式 |
negative_tags | string | 否 | - | 排除的风格,仅自定义模式 |
auto_lyrics | boolean | 否 | - | 自动生成歌词,仅自定义模式 |
persona_id | string | 否 | - | 用 Persona(persona)复用歌手音色,仅自定义模式 |
vocal_gender | string | 否 | - | Male / Female |
style_weight / weirdness_constraint / audio_weight | number | 否 | - | 0 到 1,0 是有效值 |
variety | string | 否 | - | 风格变化程度:off / normal / high / extra / max |
max_mode | boolean | 否 | false | Max 模式,需 custom=true;按 2 倍计费 |
audio_format | string | 否 | - | mp3 / m4a / wav |
duration | integer | 否 | - | 目标时长 10–360 秒,成品时长不保证完全一致 |
除 model、max_mode、task_id、task_ids、persona_id、custom_model_id 的类型检查外,其余字段由上游校验。
custom: true 是自定义歌词模式,custom_model_id 是使用已训练的自定义模型,两者不是同一个概念。variety: "max" 与 Max 模式相互独立,不会触发 Max 计费。
操作列表
除生成音乐外,其它操作统一为 POST /v1/music/generations/{operation}。下表价格为积分/次,以定价页为准。
{operation} | 功能 | 主要参数 | 价格 | Max |
|---|---|---|---|---|
| (无) | 生成音乐 | 见上节 | 0.625 | 1.25 |
lyrics | 生成歌词 | prompt、lyrics_model | 0.1 | |
inspo | 灵感生成:参考音频生成新歌 | audio_urls、version、tags、prompt | 0.85 | 1.7 |
sounds | 音效生成 | prompt、version、type、bpm、key | 0.12 | |
upsampleTags | 风格标签增强 | tags | 0.05 | |
uploadTask | 导入公网音频,产出可被引用的源任务 | audioFilePath(只接收这一个字段) | 0.05 | |
uploadCover | 上传音频并翻唱 | audio_url、version、custom、tags、duration_s | 0.625 | 1.25 |
uploadExtend | 上传音频并延伸 | audio_url、continue_at、version、prompt、tags | 0.625 | 1.25 |
createModel | 创建自定义模型 | name、audio_urls | 12 | |
extend | 续写延长 | task_id、audio_index、continue_at、version、prompt | 0.625 | 1.25 |
coverSong | 风格翻唱 | task_id、audio_index、version、tags | 0.625 | 1.25 |
remaster | 母带优化 | task_id、audio_index、variation_category | 0.625 | |
stems | 分轨提取 | task_id、audio_index、stem_type | 1.25 | |
stemsAll | 全量分轨 | task_id、audio_index | 3 | |
addVocals | 添加人声 | task_id、audio_index、version、prompt | 0.625 | 1.25 |
addInstrumental | 添加伴奏 | task_id、audio_index、version、tags | 0.625 | 1.25 |
addStem | 添加音轨 | task_id、audio_index、version、gpt_description | 0.625 | 1.25 |
vox | 提取人声(已弃用) | task_id、audio_index、vocal_start_s、vocal_end_s | 0.05 | |
createVoice | 创建音色 | audio_url | 0.2 | |
persona | 创建歌手 Persona | task_id、audio_index、name、styles | 0.05 | |
replaceMusic | 段落替换 | task_id、audio_index、start_s、end_s、infill_lyrics | 0.625 | 1.25 |
removeSection | 删除片段 | task_id、audio_index、start_s、end_s | 0.1 | |
crop | 裁剪音频 | task_id、audio_index、start_s、end_s | 0.1 | |
fadeIn | 淡入 | task_id、audio_index、duration_s | 0.1 | |
fadeOut | 淡出 | task_id、audio_index、duration_s | 0.1 | |
adjustSpeed | 调整速度 | task_id、audio_index、speed、keep_pitch | 0.3 | |
concat | 完整歌曲合成 / 拼接 | task_id、audio_index | 0.05 | |
mashup | 生成混搭 | task_ids、audio_indexes、version、prompt | 0.625 | 1.25 |
sample | 样本转歌曲 | task_id、audio_index、start_s、end_s、prompt | 0.625 | 1.25 |
midi | 生成 MIDI | task_id、audio_index | 0.625 | |
alignedLyrics | 歌词时间轴 | task_id、audio_index | 0.01 | |
bpm | BPM 分析 | task_id、audio_index | 0.01 | |
generateMp4 | 生成音乐视频 | task_id、audio_index | 0.05 | |
download | 下载为 MP3 / M4A / WAV | task_id、audio_index、formats | 0.02 | |
wav | 下载 WAV(已弃用,等同 download + formats: ["wav"]) | task_id、audio_index | 0.02 |
支持版本选择的编辑操作省略 version 时默认使用 v6。操作接口里风格字段叫 tags、描述字段叫 gpt_description、怪异度叫 weirdness(生成音乐接口分别是 style、prompt、weirdness_constraint)。不支持某字段的操作请完全省略该字段,不要统一发送 max_mode: false。
引用源音轨
基于已有作品的操作用 task_id + audio_index 指定源音轨:
task_id:产出源音轨的本平台任务 ID(at_开头)。上传自己的音频请先调用uploadTask,用它的task_id作源,audio_index为1。audio_index:源任务结果result.music[]中的原始位置,从1开始,默认1。按实际返回数量处理,不要假设固定为 2 首。
curl https://api.vibelab.me/v1/music/generations/extend \
-H "Authorization: Bearer $LOOPTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task_id": "at_0198f0a0-1111-7777-8888-999999999999",
"audio_index": 1,
"continue_at": 120,
"version": "v6",
"prompt": "[Outro]\n下一段旅途,我们一起走"
}'只能引用自己账户下已成功的任务。不支持 audio_id、music_id 等旧式 ID 字段,传入会返回 400。mashup 的多个源任务若无法组合,返回 400 invalid_source_reference。
自定义模型与 Persona
createModel完成后读取result.model_id,在支持的操作里作为custom_model_id使用,同时省略version和persona_id。创建可能需要数分钟,最长约 20 分钟;创建与后续每次生成分别计费。persona完成后读取result.persona_id,在自定义模式下作为persona_id使用。
custom_model_id 与 persona_id 只能在创建它们的账户中使用。
请求示例
完整轮询示例
import os
import time
import requests
BASE_URL = "https://api.vibelab.me"
headers = {"Authorization": f"Bearer {os.environ['LOOPTOKEN_API_KEY']}"}
response = requests.post(
f"{BASE_URL}/v1/music/generations",
headers=headers,
json={"model": "suno", "version": "v6", "custom": False, "prompt": "明亮的电子流行配乐,适合产品发布视频"},
)
response.raise_for_status()
task_id = response.json()["data"][0]["task_id"]
time.sleep(3)
while True:
task = requests.get(f"{BASE_URL}/v1/music/tasks/{task_id}", headers=headers).json()["data"]
if task["status"] in ("completed", "failed"):
break
time.sleep(6)
if task["status"] == "failed":
raise RuntimeError(task["error"])
for track in task["result"]["music"]:
print(track["title"], track["audio_url"])响应
提交响应见快速开始。查询任务:
curl https://api.vibelab.me/v1/music/tasks/at_0198f0a0-1111-7777-8888-999999999999 \
-H "Authorization: Bearer $LOOPTOKEN_API_KEY"{
"code": 200,
"data": {
"id": "at_0198f0a0-1111-7777-8888-999999999999",
"status": "completed",
"progress": 100,
"created": 1789041600,
"cost": 0.0625,
"credits_cost": 0.625,
"result": {
"music": [
{
"audio_id": "example-track-id",
"title": "沿着灯光",
"lyrics": "[Verse]\n晚风吹过熟悉街道",
"tags": "pop, acoustic",
"duration": 119.8,
"audio_url": "https://example.com/result.mp3",
"image_url": "https://example.com/cover.jpg"
}
]
}
}
}| 字段 | 类型 | 说明 |
|---|---|---|
data.id | string | 任务 ID(at_ 前缀) |
data.status | string | pending / processing / completed(终态)/ failed(终态) |
data.progress | integer | 进度 0 到 100,是否完成以 status 为准 |
data.created | integer | 创建时间,Unix 秒 |
data.credits_cost / data.cost | number | 本次扣费,积分 / 美元(10 积分 = 1 美元),结算后返回 |
data.result | object | 完成后的结果,结构随操作不同:音乐类在 result.music[],歌词、MIDI、分轨、Persona、自定义模型等各有自己的结构 |
data.error | object | 失败时返回:message、type(task_failed)、code(task_failed 或 timeout) |
duration是实际时长,允许小数;权重返回值0是有效值。audio_url不保证使用.mp3后缀,请按返回的实际 URL 播放或下载,并及时转存到自己的存储。- 结果媒体由平台转存,文件自任务完成起保留 3 天,请及时转存。
- 当前没有取消已提交任务的接口。
计费
- 提交时按操作价格预扣,任务成功后结算;失败或超时自动退款。
- Max 模式(
max_mode: true)按普通价格的 2 倍计费,仅上表中有 Max 价格的操作支持。 - 一次任务返回多首歌曲时仍按一次任务计费。
- 实际扣费以终态任务中的
credits_cost和定价页为准。
错误
错误体为 {"error": {"message": "...", "type": "...", "code": "...", "request_id": "..."}}(type 与 code 相同),通用错误码见错误码。本接口常见错误:
| HTTP | code | 触发场景 | 处理 |
|---|---|---|---|
400 | invalid_request_error | JSON 不合法、字段类型错误;传入 audio_id、music_id、clip_id 等旧式 ID 字段 | 按 message 修正;引用源音轨改用 task_id + audio_index |
400 | invalid_source_reference | 源任务、persona_id 或 custom_model_id 不存在、未完成、不属于当前账户,或不能组合使用 | 使用自己账户已成功任务产出的引用 |
404 | not_found | 操作名不存在 | 核对操作列表 |
404 | model_not_found | model 不是 suno / flowmusic,或该模型没有可售价格 | 核对 model |
404 | task_not_found | 任务不存在或不属于当前账户 | 核对 task_id |
429 | media_concurrency_exceeded | 用户或 API Key 的媒体并发超限(响应带 Retry-After) | 稍后重试 |
502 | upstream_error | 音乐服务暂时不可用 | 指数退避重试,已预扣的费用会退回 |
503 | no_available_channel | 当前没有可用的音乐生成通道 | 指数退避重试 |
余额不足返回 402 insufficient_credits。
注意事项
- 网络超时 → 不要自动重发收费的 POST,先用
task_id查询确认。 custom_model_id、persona_id→ 只能在创建它们的账户中使用。audio_url→ 不保证.mp3后缀,按返回的实际 URL 处理。