外观
Suno V6 Mini 音乐生成
Suno V6 Mini 是 Suno 公司的音乐模型。使用 suno-v6-mini 通过知梦 API 的 Chat Completions 兼容协议生成音乐,¥0.60/次调用。直接使用完整模型名,无需配置别名。
当前非流式调用返回 M4A 音频链接,可包含多个版本。n: 1 不保证只返回一条;duration 不保证实际时长。
在线调试 Suno → · 音频模型总览 · 价格与模型
接口与鉴权
http
POST https://api.zmoapi.cn/v1/chat/completions
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json兼容客户端 Base URL 为 https://api.zmoapi.cn/v1。使用知梦 API 密钥,请求体为 UTF-8 JSON。
请求参数
音乐描述、曲风、情绪、乐器及歌词要求写入 user 消息。以下扩展字段来自已成功返回的请求示例;请求被接收不代表每个字段都会严格控制生成结果。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 固定 suno-v6-mini。 |
messages | object[] | 是 | 本站示例发送一条 user 消息。 |
messages[0].role | string | 是 | 固定 user。 |
messages[0].content | string | 是 | 非空音乐描述。可在正文附上歌词、演唱或纯音乐要求。 |
instrumental | boolean | 否 | 纯音乐偏好,示例为 true,表示请求不含人声;false 表示不指定纯音乐偏好。实际生成效果以音频为准;不传时由服务端处理。 |
n | integer | 否 | 示例值为 1,该请求实际返回两条音频,不能用此字段保证数量或截断结果。其他取值的服务端范围尚未明确;调试台只做正整数基础校验。 |
stream | boolean | 是(本站示例) | 使用 false,保持连接等待完整 JSON;不是字符串 "false"。 |
duration | number | 否 | 期望时长,单位秒,示例值为 7。可能被忽略或不生效,不保证生成 7 秒;范围与精度未明确。留空不传,也不按此值计价。 |
本页不发送 TTS / Lyria 的 output_format、audio、speakers,也不把专用音乐接口的顶层 prompt / lyrics 套入 Chat。歌词直接放入 messages[0].content。提示词中的 BPM、时长、歌词与分段均不保证严格遵循。
请求示例
以下为已成功返回音频的请求结构,duration: 7 只是期望值:
bash
curl 'https://api.zmoapi.cn/v1/chat/completions' \
-H "Authorization: Bearer $ZHIMENG_API_KEY" \
-H 'Content-Type: application/json' \
--data-raw '{
"model": "suno-v6-mini",
"messages": [{
"role": "user",
"content": "温暖的钢琴独奏,轻柔舒缓,适合午后阅读"
}],
"instrumental": true,
"n": 1,
"stream": false,
"duration": 7
}'instrumental、n、duration 均可省略。需要描述歌词时,将内容写进 user 消息;不要同时写“不要人声”和歌词演唱要求。
返回结果与保存
响应为完整的 chat.completion JSON,无需轮询。下面保留了实测响应的主要字段,域名与 ID 为示例值:
json
{
"id": "chatcmpl_example",
"model": "suno-v6-mini",
"object": "chat.completion",
"choices": [{
"index": 0,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "[生成音频](https://example.com/track-a.m4a)\n[生成音频](https://example.com/track-b.m4a)\n"
}
}],
"data": [
{"id": "clip-a", "format": "m4a", "mime_type": "audio/mp4", "url": "https://example.com/track-a.m4a"},
{"id": "clip-b", "format": "m4a", "mime_type": "audio/mp4", "url": "https://example.com/track-b.m4a"}
],
"usage": {"prompt_tokens": 23, "completion_tokens": 98, "total_tokens": 121}
}| 字段 | 说明 |
|---|---|
data[] | 音频结果列表,优先遍历全部元素;条数以实际列表为准,不按 n 假定或截断。 |
data[].id | 单条音频 ID,和 Chat 响应 ID 不同。 |
data[].url | 可下载音频地址,保留完整路径及签名查询参数。 |
data[].format | 实测为 m4a,保存文件使用 .m4a,不要误命名为 .mp3。 |
data[].mime_type | 实测为 audio/mp4,与 M4A 容器相符;不据此推断内部音频编码、码率或采样率。 |
choices[].message.content | Markdown 格式的音频链接,可能与 data[] 重复;可作为兼容来源,合并时按完整 URL 去重。 |
choices[].finish_reason | 实测为 stop,同时检查正文错误及 HTTP 状态,不能只看 HTTP 200。 |
usage | 返回的 Chat 用量统计,公开售价仍按次调用计价,不按 Token 加价。 |
id | Chat 响应标识,保留供排查,不作为任务轮询 ID。 |
一次请求可返回多个版本,本例 n: 1 返回两条;这不是提交了两次请求。 不把一次示例推广为“永远返回两条”。两个表示位置中的相同链接也不是两份不同作品。
Suno 本例返回 URL,按本页接口约定处理,不套用 Google 音频的 output_format 选项。无需传 output_format 来获取上述结果。音频实际长度以文件或播放器读取的时长为准,响应未给出实际时长,不把请求中的 duration 当作实测秒数。 这次 duration: 7 样本的两条音频经媒体检测分别为 165.2 秒和 155.2 秒,说明该请求并未按 7 秒生成;这不是固定输出时长。
本例媒体文件检测为 M4A 容器、Opus 编码、48kHz、双声道。这只是本次样本信息,不作为所有请求的固定编码规格;不要根据 .m4a 后缀直接假定 AAC 编码。
下载时不附加知梦 API Key;生成后及时保存,不承诺永久链接或固定有效期。试听取决于浏览器对实际音频编码的支持。
Python 调用与下载所有版本
python
import os
from pathlib import Path
from urllib.parse import urlsplit
import requests
response = requests.post(
"https://api.zmoapi.cn/v1/chat/completions",
headers={"Authorization": "Bearer " + os.environ["ZHIMENG_API_KEY"]},
json={
"model": "suno-v6-mini",
"messages": [{"role": "user", "content": "温暖的钢琴独奏,轻柔舒缓,适合午后阅读"}],
"instrumental": True,
"n": 1,
"stream": False,
"duration": 7, # 期望值,不保证生效;不需要时可省略。
},
timeout=(10, 180),
)
response.raise_for_status()
result = response.json()
if result.get("error"):
raise RuntimeError(result["error"])
for choice in result.get("choices", []):
if choice.get("finish_reason") != "stop":
raise RuntimeError("生成响应未正常结束,请查看完整响应")
content = (choice.get("message") or {}).get("content", "")
if isinstance(content, str) and content.lstrip().lower().startswith(("错误:", "错误:", "error:")):
raise RuntimeError(content)
seen = set()
for item in result.get("data", []):
url = item.get("url", "")
parsed = urlsplit(url)
if parsed.scheme not in ("http", "https") or not parsed.hostname or parsed.username or parsed.password:
continue
if url in seen:
continue
seen.add(url)
fmt = str(item.get("format", "")).lower()
if fmt not in ("m4a", "mp3", "wav"):
raise RuntimeError("请按实际 format / MIME 选择保存格式")
# 使用独立下载请求,不携带知梦 API Key;保留完整 URL。
with requests.get(url, stream=True, timeout=(10, 180)) as audio:
audio.raise_for_status()
with Path(f"song-{len(seen)}.{fmt}").open("wb") as file:
for chunk in audio.iter_content(65536):
file.write(chunk)
if not seen:
raise RuntimeError("没有可用 data 音频列表,请查看完整响应及正文链接")读取超时建议至少 180 秒;生成耗时以实际请求为准。网络失败或请求超时后先核对消费记录和执行情况,不自动重复提交收费生成请求。
调试与计费
在调试台选择“Suno → Suno V6 Mini”,填写描述、可选歌词、instrumental、n 与期望 duration。未填写的可选字段省略;点击“填充示例”会填入上面的 true、1、7。生成前以“完整请求”中的 JSON 为准。
调试台展示全部已识别的音频版本,按 URL 去重,正确识别 M4A,提供试听与下载。duration 表示请求期望,实际音频长度从媒体读取;n 不用于裁剪结果列表。
¥0.60/次调用,按调用计价,不按时长或 Token 计价;单次请求返回多个版本不等于多次调用。实际费用以平台消费记录为准,原有 TTS / Lyria 仍为 ¥0.30/次。