Suno AI API 集成实战教程:从 0 到 1 生成第一首 AI 音乐
TL;DR — 一分钟速览
Suno API 是什么:Suno AI 的音乐生成能力通过 API 提供,支持输入描述或歌词自动合成完整歌曲(人声 + 伴奏)。
怎么接:通过 ApiTopMix 统一网关,POST 到 /suno/submit/music 提交任务,轮询 /suno/fetch/{task_id} 获取结果。
定价:$0.50 / 次(music,返回 2 首候选),$0.05 / 次(lyrics 纯歌词生成)。
本文产出:Python / Node.js / curl 三平台完整代码,外加一个"Claude 写故事 + Suno 写 BGM"的组合案例。
Suno 是目前最受欢迎的 AI 音乐生成平台,其 chirp-v3-5 模型可以仅凭一段文字描述或一份歌词,生成包含人声与乐器伴奏的完整歌曲。对于 AIGC 产品团队来说,把 Suno 能力嵌入到自己的应用里(音乐工具、视频配乐、游戏 BGM、有声书背景音乐、情感陪伴类产品等)是一个极具想象力的方向。
但有一个小问题:Suno 官方至今没有公开的开发者 API。这也是 ApiTopMix 的独特价值之一——通过合规通道提供稳定的 Suno 接口,按次付费,单个 API Key 同时支持 Suno 音乐生成与 Claude / OpenAI / Gemini 等主流 LLM。本文将用 30 分钟带你完成第一个 Suno API 集成。
为什么选 ApiTopMix 的 Suno 通道
截至 2026 年 4 月,Suno 的音乐生成能力有两种访问方式:
- 官方 web 应用(suno.com):通过浏览器创建,适合个人创作者,但无法集成到你自己的产品中
- 第三方 API 通道:如 ApiTopMix 这类聚合平台,提供 RESTful 接口,按次计费,支持并发调用
ApiTopMix 的 Suno 通道特点:
- 一个 API Key 同时调用 Suno + Claude + OpenAI + Gemini(见 文档)
- 标准 RESTful 接口,Python / Node.js / Go / Java 任意语言都能接
- 按次后付费($0.50 / 次),无月费,$5 起充
- 兼容 new-api 标准,如果你已经在用类似平台,迁移成本为零
核心工作流:提交 → 轮询 → 下载
Suno 音乐生成是异步任务(生成需要 30-90 秒),所以 API 设计为"提交 + 轮询"模式:
- POST
/suno/submit/music:传入 prompt / 歌词 / 参数,立即返回task_id - GET
/suno/fetch/{task_id}:每 5-10 秒轮询一次,检查status字段 - 当
status === "SUCCESS"时,从data数组中取audio_url/video_url/image_url - 下载 audio_url 指向的 mp3 文件,或直接把 URL 嵌入到你的产品中
每次 music 调用默认返回 2 首候选歌曲——同一 prompt 的两个不同演绎版本,你可以挑选更好的一首,或把两首都展示给用户让其选择。
准备工作:2 分钟获取 API Key
- 访问 apitopmix.com/register,邮箱注册
- 控制台 → 令牌 → 创建新令牌(复制
sk-...字符串) - 控制台 → 充值,首次 $5 起(可调用 10 次 music 生成)
实战代码:Description 模式(推荐新手)
Description 模式最简单——你用自然语言描述想要的音乐(风格、情绪、乐器等),Suno 自动生成歌词与旋律。
Python 完整示例
import requests
import time
API_KEY = "sk-apitopmix-xxxxxxxxxxxxxxxxxxxx"
BASE_URL = "https://apitopmix.com"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# 1. 提交任务
submit_resp = requests.post(
f"{BASE_URL}/suno/submit/music",
headers=headers,
json={
"mv": "chirp-v3-5",
"gpt_description_prompt": "一首轻快的夏日合成器流行曲,融合 80 年代 city pop 风格,带有感伤的情绪,女声主唱。",
"make_instrumental": False
}
)
task_id = submit_resp.json()["data"]
print(f"任务已提交,task_id = {task_id}")
# 2. 轮询结果
for attempt in range(30): # 最多 30 次 × 6 秒 = 180 秒超时
time.sleep(6)
fetch_resp = requests.get(
f"{BASE_URL}/suno/fetch/{task_id}",
headers=headers
)
result = fetch_resp.json()["data"]
status = result.get("status")
print(f"第 {attempt+1} 次轮询:status = {status}")
if status == "SUCCESS":
tracks = result.get("data", [])
for i, track in enumerate(tracks, 1):
print(f" 歌曲 {i}: {track.get('title')}")
print(f" audio: {track.get('audio_url')}")
print(f" video: {track.get('video_url')}")
print(f" cover: {track.get('image_url')}")
print(f" 时长: {track.get('duration')} 秒")
break
elif status == "FAILURE":
print(f"生成失败: {result.get('fail_reason')}")
break
else:
print("超时,请稍后通过 task_id 再查询")
实战代码:Custom 模式(自定义歌词)
Custom 模式允许你传入自己写好的歌词(prompt 字段)+ 指定风格标签(tags 字段),适合已有内容创作需求的场景。
Node.js 完整示例
const API_KEY = "sk-apitopmix-xxxxxxxxxxxxxxxxxxxx";
const BASE_URL = "https://apitopmix.com";
const headers = {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json"
};
async function generateCustomMusic() {
// 1. 提交自定义歌词任务
const submitRes = await fetch(`${BASE_URL}/suno/submit/music`, {
method: "POST",
headers,
body: JSON.stringify({
mv: "chirp-v3-5",
prompt: `[Verse 1]
午夜的海边 吹来咸咸的风
你的名字刻在贝壳中
潮水带走了我们的梦
只留下月亮 温柔地懂
[Chorus]
别说再见 别说再见
让这夜晚 停在永远`,
title: "午夜海边",
tags: "dreamy indie pop, female vocals, lo-fi",
make_instrumental: false
})
});
const { data: taskId } = await submitRes.json();
console.log(`task_id = ${taskId}`);
// 2. 轮询
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 6000));
const fetchRes = await fetch(`${BASE_URL}/suno/fetch/${taskId}`, { headers });
const { data: result } = await fetchRes.json();
console.log(`轮询 ${i+1}: ${result.status}`);
if (result.status === "SUCCESS") {
return result.data; // 返回 2 首候选歌曲
}
if (result.status === "FAILURE") throw new Error(result.fail_reason);
}
throw new Error("Polling timeout");
}
generateCustomMusic().then(tracks => {
tracks.forEach((t, i) => console.log(`${i+1}. ${t.title}: ${t.audio_url}`));
});
实战代码:纯歌词生成(curl)
如果你只需要 AI 写歌词(不要配乐),使用 /suno/submit/lyrics 端点,成本仅 $0.05 / 次。
curl https://apitopmix.com/suno/submit/lyrics \
-H "Authorization: Bearer sk-apitopmix-xxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"prompt": "一首关于程序员深夜加班的独立摇滚歌词,带有黑色幽默"
}'
# 响应:
# {"code":"success","message":"","data":"task-id-xxxxxxxx"}
# 轮询:
curl https://apitopmix.com/suno/fetch/task-id-xxxxxxxx \
-H "Authorization: Bearer sk-apitopmix-xxxxxxxxxxxxxxxxxxxx"
# 成功响应:
# {
# "code": "success",
# "data": {
# "task_id": "task-id-xxxxxxxx",
# "status": "SUCCESS",
# "data": [
# {"title": "加班之歌", "text": "[Verse 1]\n..."}
# ]
# }
# }
请求参数详解
| 参数 | 类型 | 说明 | 使用场景 |
|---|---|---|---|
mv | string | 模型版本,当前稳定版为 chirp-v3-5 | 必填 |
gpt_description_prompt | string | 音乐描述(风格、情绪、乐器、年代等) | Description 模式使用 |
prompt | string | 自定义歌词(支持 [Verse]/[Chorus] 结构标签) | Custom 模式使用 |
title | string | 歌曲标题(展示用,不影响生成) | 可选 |
tags | string | 风格标签(如 "dreamy indie pop, female vocals") | Custom 模式推荐 |
make_instrumental | boolean | 是否纯器乐(无人声) | 两种模式均可 |
continue_clip_id | string | 在已有歌曲基础上延长 | extend 场景 |
continue_at | number | 从第几秒开始延长(秒) | 配合 continue_clip_id |
gpt_description_prompt),Suno 会自己写词并匹配风格。有明确歌词后再用 Custom 模式。纯 BGM 场景(如播客、视频配乐)使用 Description + make_instrumental=true。
轮询最佳实践
异步任务的稳定性依赖合理的轮询策略:
- 首次等待:提交后至少等 15 秒再开始轮询(Suno 任务少于 15 秒完成的情况极少,过早轮询浪费请求)
- 轮询间隔:5-10 秒一次较合理,间隔过短会触发速率限制
- 超时上限:180 秒(30 次 × 6 秒)。超过此时间建议记录 task_id 稍后再查,而不是阻塞用户
- 状态机:
SUBMITTED→IN_PROGRESS→SUCCESS/FAILURE/CANCELED - 失败重试:
FAILURE可以立即重新 submit(注意此时重新计费 $0.50),CANCELED通常不会扣费但需确认 - 生产环境:用消息队列(Redis Stream / RabbitMQ)解耦提交与轮询,避免阻塞 Web 请求线程
实战案例:Claude 写故事 + Suno 写 BGM
Suno 和 LLM 的组合能力非常有趣。下面这个案例用 Claude 生成儿童睡前故事,再从故事中抽取情绪标签让 Suno 生成匹配的背景音乐:
import requests
from openai import OpenAI
# 同一个 Key 同时调用 Claude 和 Suno
API_KEY = "sk-apitopmix-xxxxxxxxxxxxxxxxxxxx"
BASE_URL = "https://apitopmix.com"
# 1. Claude 生成故事 + 音乐描述
openai_client = OpenAI(api_key=API_KEY, base_url=f"{BASE_URL}/v1")
resp = openai_client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{
"role": "user",
"content": (
"写一个 200 字的儿童睡前故事,主角是一只寻找月亮的小熊。"
"在故事结尾另起一段,给出 <音乐描述>...音乐描述>,"
"用一句话描述适合这个故事的背景音乐风格。"
)
}]
)
story = resp.choices[0].message.content
print(story)
# 2. 提取音乐描述
import re
music_desc = re.search(r"<音乐描述>(.*?)</音乐描述>", story, re.S).group(1).strip()
# 3. Suno 生成匹配 BGM(纯器乐)
suno_resp = requests.post(
f"{BASE_URL}/suno/submit/music",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"mv": "chirp-v3-5",
"gpt_description_prompt": music_desc,
"make_instrumental": True # 纯配乐
}
)
task_id = suno_resp.json()["data"]
print(f"BGM 生成中, task_id = {task_id}")
# 后续轮询 /suno/fetch/{task_id} 获取 audio_url
30 秒得到一个完整的"故事 + 配乐"二合一作品。把这个 pipeline 包装成 API 就是一个完整的"AI 故事音乐生成器"产品原型。
现在就开始你的第一个 Suno 集成
注册 ApiTopMix,$5 起充(可生成 10 首歌),一个 Key 同时支持 Suno + Claude + OpenAI + Gemini。
常见问题
1. Suno 官方有开放 API 吗,为什么要用 ApiTopMix 的通道?
截至 2026 年 4 月,Suno 官方没有开放给个人开发者的公开 API,仅对少数企业合作伙伴开放。ApiTopMix 通过合规通道提供 Suno 音乐生成接口,标准定价 $0.50/次(music)与 $0.05/次(lyrics),一个 API Key 即可调用。这是目前最容易获取稳定 Suno API 的方式之一。
2. 生成一首歌需要多长时间?
Suno 音乐生成是异步任务。提交后通常 30-90 秒返回完成状态。建议轮询间隔设为 5-10 秒,超时控制为 180 秒。每次 submit/music 调用会生成 2 首候选歌曲,你可以从返回的 data 数组中选择更好的一首。
3. Description 模式和 Custom 模式有什么区别?
Description 模式使用 gpt_description_prompt 字段描述你想要的音乐(例如:"一首欢快的上世纪 80 年代合成器流行曲"),Suno 会自动生成歌词与旋律。Custom 模式使用 prompt 字段传入你自己写好的歌词(或留空配合 make_instrumental=true 做纯音乐),tags 字段指定风格。新手建议从 Description 模式入手。
4. 生成的音乐归谁版权?可以商用吗?
版权归属遵循 Suno 官方条款。付费计划下生成的内容通常允许商业使用,但具体条款以 Suno 官方政策为准。建议在商用前查阅 Suno 的 Terms of Service,并保留生成日志作为追溯依据。ApiTopMix 不对版权作任何保证,仅作为 API 通道。
5. 轮询一直失败或卡在 IN_PROGRESS 怎么办?
极少数情况下任务可能因上游繁忙被取消。最佳实践:(1) 设置 180 秒总超时;(2) 监测状态由 SUBMITTED → IN_PROGRESS → SUCCESS/FAILURE;(3) FAILURE 状态自动重新 submit 一次(注意此时需再次扣费);(4) 记录 task_id 便于客服排障。详见 ApiTopMix 文档的 Suno 章节。
延伸阅读
- 从 OpenAI 迁移到 Claude 的完整指南(本博客)
- ApiTopMix vs OpenRouter 全面对比(本博客)
- ApiTopMix API 文档 — Suno 章节完整接口参考
- ApiTopMix 定价 — Suno 单价与其他模型价格表
- Suno 官网 — 官方产品与服务条款
结语
Suno 是少数能给 AIGC 产品带来"声音维度"的能力型 AI。文本生成、图像生成已经白热化,音乐生成还是一片相对蓝海——先动手集成的产品更容易占据细分赛道。配合 Claude / GPT 的文本生成能力,你能做的组合应用远比"单模型产品"丰富得多。
今天的这 15 分钟教程,足以让你跑通一个最小可行的 Suno 集成。下一步,把它封装成你产品的一个功能点(例如"根据用户心情生成专属歌单"、"为视频自动配乐"、"给广告脚本配 BGM"),就是一个全新的产品方向。
ApiTopMix