音色创建、歌曲生成与永久删除 API
对客发布版 · 2026-11-09
本文覆盖当前两种可用的人声音色链路:
- 推荐音色(voice-profile):适合新接入,支持创建音色、用音色翻唱歌曲、用音色唱新歌和永久删除。
- 传统克隆人声(persona):兼容早期
voice_task_id/generate-with-voice链路,继续支持创建、生成和永久删除。两种音色都支持永久删除。删除后,原音色 ID 不会恢复,也不能再次用于任何新的生成任务。
0. 先选择正确的音色链路
| 项目 | 推荐音色 voice-profile | 传统克隆人声 persona |
|---|---|---|
| 推荐程度 | 推荐新接入 | 仅用于已接入系统的兼容维护 |
| 主要 ID | voice_id,通常以 vp_ 开头 |
voice_task_id(整数)和 voice_id(UUID) |
| 创建接口 | /api/music/voice-profile/* |
/api/voice/clone/* |
| 生成接口 | POST /api/music/voice-profile/cover |
POST /api/music/generate-with-voice |
| 适合场景 | 用一段人声样本翻唱歌曲、唱新歌 | 早期“校验文本 + 二次录音验证 + persona”流程 |
| 删除接口 | POST /api/music/voice-profile/delete |
DELETE /api/voice/clone/voices/{voice_task_id} |
| 删除是否永久 | 是 | 是 |
选择原则:
- 新客户优先使用推荐音色 voice-profile。
- 已经接入
voice_task_id、POST /api/music/generate-with-voice的客户可继续使用传统克隆人声。 - 不要把两类 ID 混用:
vp_...传给/api/music/voice-profile/cover。- 传统数字
voice_task_id传给/api/music/generate-with-voice。 - 传统 UUID
voice_id不能当作推荐音色的vp_...使用。
1. 通用约定
1.1 Base URL
生产环境:
https://www.suno-api.io
测试环境:
https://test.suno-api.io
下文只写路径。调用生产环境时,在路径前加上生产 Base URL。
1.2 鉴权
所有客户 API 请求都需要 API Key:
Authorization: Bearer sk-xxxxxxxx
Content-Type: application/json
部分客户系统会额外携带:
New-Api-User: <你的用户 ID>
以控制台或接口文档要求的鉴权头为准。不要在前端代码、日志或公开仓库中暴露 API Key。
1.3 两种响应外壳
音色管理接口通常使用业务外壳:
{
"success": true,
"message": "",
"data": {}
}
生成类接口可能使用生成外壳:
{
"code": 200,
"message": "success",
"data": {}
}
失败时也可能是:
{
"error": {
"message": "错误说明",
"type": "invalid_request_error",
"code": "voice_deleted"
}
}
客户端不要只判断 HTTP 200。建议按以下顺序判断:
1. 读取 HTTP 状态码。
2. 解析 JSON。
3. 如果 code == "voice_deleted",停止重试并提示用户重新创建音色。
4. 如果 success == false,按 message 处理。
5. 如果存在 error 对象,按 error.code / error.message 处理。
6. 生成接口只有 code == 200 或 HTTP 202 才是已受理。
1.4 时间字段
不同接口的时间字段可能是:
- Unix 秒,例如
1794222148 - ISO 8601 字符串,例如
2026-11-09T11:05:03.413Z
请按相应接口的字段说明解析,不要假设所有接口都使用毫秒时间戳。
1.5 幂等与重试
| 场景 | 推荐做法 |
|---|---|
| 创建推荐音色 | 使用 client_request_id;超时重试时复用同一个值 |
| 从已有音频创建推荐音色 | 使用 client_request_id;同一 clip 重复提交会复用未删除音色 |
| 传统人声创建 | 保存 voice_task_id;轮询原任务,不重复创建新任务 |
generate-with-voice |
使用 Idempotency-Key 请求头 |
| 推荐音色翻唱 | 使用 X-Create-Ui-Client-Request-Id 跟踪;提交超时先查询是否已经产生任务 |
| 删除 | 可以安全重复调用;重复删除返回 already_deleted: true |
1.6 生成提交成功不等于歌曲完成
生成接口返回成功只表示任务已被受理。歌曲必须轮询到:
status = completed
才能下载成品。
2. 音色生命周期
推荐音色的典型状态:
创建成功 → ready → 用于生成 → completed
↘ failed
↘ deleted(永久删除)
传统克隆人声的典型状态:
voice_task_id 创建 → 校验文本就绪 → 验证音频生成
→ is_available=true → 用于生成 → completed
↘ deleted(永久删除)
核心规则:
- 只有
ready的推荐音色可以用于翻唱或唱新歌。 - 只有
is_available=true的传统克隆人声可以用于generate-with-voice。 - 删除音色不会删除此前已经生成好的歌曲。
- 删除音色后,原音色 ID 永久不可用于新的生成。
- 删除不会自动恢复,也不能通过重复创建、重复提交或幂等重放复活旧 ID。
3. 推荐音色:完整接口
3.1 五分钟调用流程
① 创建音色
POST /api/music/voice-profile/create
→ 得到 voice_id
② 确认音色就绪
GET /api/music/voice-profile/{voice_id}
→ status=ready
③ 提交生成
POST /api/music/voice-profile/cover
→ 得到 2 个 song_id
④ 查询歌曲
POST /api/music/query
→ status=completed
⑤ 下载歌曲
GET /api/music/download?song_id=...&kind=mp3
普通音色创建通常直接返回 status=ready。强化克隆会先返回 processing,必须轮询到 ready。
3.2 创建推荐音色
POST /api/music/voice-profile/create
方式 A:multipart 上传文件,推荐
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3;type=audio/mpeg" \
-F "file_name=my-voice.mp3" \
-F "source_file_name=my-voice.mp3" \
-F "title=我的音色" \
-F "source_kind=upload" \
-F "client_request_id=voice-create-$(date +%s)"
方式 B:JSON + HTTPS 公网音频地址
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"file_url": "https://your-cdn.example.com/voice/my-voice.mp3",
"file_name": "my-voice.mp3",
"title": "我的音色",
"client_request_id": "voice-create-url-001"
}'
方式 C:JSON + base64
{
"file_base64": "data:audio/mpeg;base64,//uQxAAA...",
"file_name": "my-voice.mp3",
"title": "我的音色",
"client_request_id": "voice-create-b64-001"
}
音频要求
| 项目 | 要求 |
|---|---|
| 时长 | 至少 6 秒,建议 10–60 秒 |
| 体积 | 对客建议 ≤ 10MB |
| 格式 | mp3 / wav / m4a / aac / flac / ogg |
| 内容 | 清晰、干净人声;避免带伴奏原曲、翻唱成品或与曲库高度相似的音频 |
成功响应
{
"success": true,
"message": "",
"data": {
"voice_id": "vp_202611091105035682097001X0DEG",
"clip_id": "38ea6309-7fce-422a-b50d-cedddd69cfa2",
"song_id": "38ea6309-7fce-422a-b50d-cedddd69cfa2",
"title": "我的音色",
"source_file_name": "my-voice.mp3",
"audio_url": "https://...",
"image_url": "https://...",
"duration_s": 30.2,
"enhanced": false,
"source_kind": "upload",
"status": "ready",
"created_at": 1794222100,
"updated_at": 1794222120
}
}
重要字段:
| 字段 | 说明 |
|---|---|
voice_id |
后续翻唱和删除使用的主 ID |
status |
ready 才能生成 |
clip_id / song_id |
音色样本对应的音频 ID,可用于兼容旧参数 |
audio_url |
音色样本试听地址 |
error_message |
失败时返回 |
强化克隆
在 multipart 请求中加入:
enhanced=true
行为:
- 返回
status=processing; - 用
GET /api/music/voice-profile/{voice_id}查询进度; - 完成后变为
ready; - 失败变为
failed; - 失败按平台规则自动退款。
3.3 用已有音频创建推荐音色
POST /api/music/voice-profile/create-from-clip
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create-from-clip" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source_song_id": "38ea6309-7fce-422a-b50d-cedddd69cfa2",
"title": "已有音频音色",
"client_request_id": "voice-from-clip-001"
}'
字段:
| 字段 | 必填 | 说明 |
|---|---|---|
source_song_id |
是 | 你名下已完成且可作为音色素材的音频 ID |
title |
否 | 音色名称 |
client_request_id |
否 | 幂等键 |
规则:
- 同一段未删除音频重复创建会返回原音色,
reused=true。 - 已删除音色对应的同一段音频不会自动复活。
- 使用已删除音色素材重试会返回
voice_deleted。 - MIDI 等不支持作为音色素材的生成类型会被拒绝。
成功响应在普通音色对象上增加:
{
"success": true,
"data": {
"voice_id": "vp_...",
"status": "ready",
"reused": false,
"source_type": "generate"
}
}
3.4 查询推荐音色
列表
GET /api/music/voice-profile/list
curl -sS "https://www.suno-api.io/api/music/voice-profile/list" \
-H "Authorization: Bearer $API_KEY"
默认只返回当前账号未删除的音色。
{
"success": true,
"data": {
"items": [],
"total": 0
}
}
详情
GET /api/music/voice-profile/{voice_id}
curl -sS "https://www.suno-api.io/api/music/voice-profile/vp_xxx" \
-H "Authorization: Bearer $API_KEY"
强化克隆处理中会额外返回:
{
"progress_percent": 60,
"progress_stage": "media_preparing",
"progress_message": "正在准备音频"
}
已删除音色详情可能返回:
{
"success": false,
"message": "voice not found"
}
3.5 使用推荐音色生成
POST /api/music/voice-profile/cover
一次提交固定生成 2 首。
场景 A:用音色翻唱已有歌曲
传入 song_clip_id:
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/cover" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "X-Create-Ui-Client-Request-Id: cover-$(date +%s)" \
-d '{
"model": "suno-v6",
"voice_id": "vp_xxx",
"song_clip_id": "38ea6309-7fce-422a-b50d-cedddd69cfa2",
"lyrics": "[Verse 1]\n歌词正文...",
"cover_requirements": "咬字清晰,保留原曲节奏",
"style_requirements": "慢速民谣,木吉他",
"audio_weight": 0.85,
"max_mode": false
}'
场景 B:用音色唱新歌
不传 song_clip_id:
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/cover" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "X-Create-Ui-Client-Request-Id: sing-$(date +%s)" \
-d '{
"model": "suno-v6",
"voice_id": "vp_xxx",
"lyrics": "[Verse 1]\n这是一段歌词\n\n[Chorus]\n用我的音色唱出来",
"style_requirements": "温暖流行,中速,木吉他",
"title": "用我的音色唱新歌",
"audio_weight": 0.85,
"duration": 120,
"variety": 2
}'
主要字段
| 字段 | 必填 | 说明 |
|---|---|---|
model |
是 | 推荐 suno-v6;可选 suno-v6-wild、suno-v6-mini |
voice_id |
二选一 | 推荐音色 ID;必须 ready |
voice_clip_id |
二选一 | 兼容音色素材 clip ID;新接入优先用 voice_id |
song_clip_id |
否 | 传入 = 翻唱指定歌曲;不传 = 唱新歌 |
lyrics |
否 | 歌词全文;要唱指定内容时请传入 |
cover_requirements |
否 | 翻唱要求 |
style_requirements |
否 | 风格要求 |
title |
否 | 成品标题 |
negative_tags |
否 | 排除风格 |
vocal_gender |
否 | m / male / f / female |
duration |
否 | 期望秒数,1–480 的整数;平台实际最短约 30 秒 |
audio_weight |
否 | 音频参考度,0–1 小数,默认通常为 0.85 |
style_weight |
否 | 风格权重,0–1 小数 |
weirdness_constraint |
否 | 创意度,0–1 小数 |
variety |
否 | 多样性,0–4 整数 |
max_mode |
否 | true 时价格 ×2 |
client_request_id |
否 | 任务追踪标识;不做请求去重 |
量纲不要混用:
audio_weight / style_weight / weirdness_constraint = 0.0–1.0
variety = 0–4 整数
duration = 秒
成功响应
{
"code": 200,
"message": "success",
"data": {
"voice_id": "vp_xxx",
"resolved_scene": "cover",
"model": "suno-v6",
"clips": [
{
"song_id": "song-a",
"status": "processing",
"audio_url": "",
"play_url": "https://..."
},
{
"song_id": "song-b",
"status": "processing",
"audio_url": ""
}
]
}
}
保存两个 clips[].song_id,继续查询到 completed。
3.6 永久删除推荐音色
POST /api/music/voice-profile/delete
Content-Type: application/json
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/delete" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"voice_id":"vp_xxx"}'
首次删除:
{
"success": true,
"message": "",
"data": {
"voice_id": "vp_xxx",
"status": "deleted",
"already_deleted": false
}
}
重复删除:
{
"success": true,
"message": "",
"data": {
"voice_id": "vp_xxx",
"status": "deleted",
"already_deleted": true
}
}
删除后:
- 音色从默认列表消失。
- 详情可能返回
voice not found。 - 再次使用原
voice_id或voice_clip_id生成会返回 HTTP 400、code=voice_deleted。 - 用同一素材再次
create-from-clip不会复活旧音色。 - 不能恢复原
voice_id。 - 已生成歌曲不受影响。
4. 传统克隆人声:完整接口
适用于已经使用 voice_task_id 和 /api/music/generate-with-voice 的客户。
4.1 标准创建流程
① POST /api/voice/clone/validate
→ voice_task_id + 验证文本任务
② GET /api/voice/clone/tasks/{voice_task_id}
→ validate_info
③ 用户朗读 validate_info
④ POST /api/voice/clone/tasks/{voice_task_id}/generate
→ 提交验证音频
⑤ GET /api/voice/clone/tasks/{voice_task_id}
或 POST /api/voice/clone/tasks/{voice_task_id}/check
→ is_available=true + voice_id
⑥ POST /api/music/generate-with-voice
→ client_request_id
⑦ GET /api/music/generate-with-voice/results?client_request_id=...
→ 真实 song_id
4.2 提交源人声
POST /api/voice/clone/validate
curl -sS -X POST "https://www.suno-api.io/api/voice/clone/validate" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"voice_url": "https://example.com/source-voice.wav",
"voice_name": "我的中文女声",
"description": "清亮自然的中文女声",
"style": "Mandopop",
"singer_skill_level": "intermediate",
"language": "zh",
"vocal_start_s": 1.2,
"vocal_end_s": 18.5,
"source_duration_seconds": 20
}'
主要字段:
| 字段 | 必填 | 说明 |
|---|---|---|
voice_url |
二选一 | 源音频公网 URL |
file_base64 |
二选一 | Base64 音频 |
file_name |
否 | 文件名 |
voice_name |
否 | 人声名称 |
description |
否 | 描述 |
style |
否 | 风格 |
singer_skill_level |
否 | beginner / intermediate / professional |
language |
否 | 语言,例如 zh、en |
vocal_start_s |
是 | 有效人声开始秒数 |
vocal_end_s |
是 | 有效人声结束秒数 |
source_duration_seconds |
否 | 源音频总时长 |
响应包含:
{
"success": true,
"data": {
"voice": {
"voice_task_id": 123,
"status": "validate_submitted",
"validate_status": "submitted",
"is_available": false
}
}
}
4.3 查询任务并获取验证文本
GET /api/voice/clone/tasks/{voice_task_id}
curl -sS "https://www.suno-api.io/api/voice/clone/tasks/123" \
-H "Authorization: Bearer $API_KEY"
当 validate_info 有值时,让用户按文本朗读并录音。
主要状态:
| 状态 | 处理 |
|---|---|
validate_submitted / wait_validating |
继续轮询 |
validate_ready |
返回 validate_info,可以录音 |
voice_processing |
正在生成人声 |
ready + is_available=true |
可用于生成歌曲 |
failed |
失败,读取 error_message |
deleted |
已永久删除 |
4.4 提交验证音频
POST /api/voice/clone/tasks/{voice_task_id}/generate
curl -sS -X POST "https://www.suno-api.io/api/voice/clone/tasks/123/generate" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"verify_url": "https://example.com/verify-voice.wav",
"voice_name": "我的中文女声"
}'
也可以使用 file_base64 + file_name。
4.5 从已有歌曲直接创建传统人声
POST /api/voice/clone/from-clip
curl -sS -X POST "https://www.suno-api.io/api/voice/clone/from-clip" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"clip_id": "38ea6309-7fce-422a-b50d-cedddd69cfa2",
"name": "已有歌曲音色",
"description": "从已完成歌曲创建",
"style_tags": "Mandopop"
}'
成功后直接返回一个可用的 voice_task_id 和 voice_id。以响应中的 is_available=true 为准。
4.6 检查传统人声是否可用
POST /api/voice/clone/tasks/{voice_task_id}/check
curl -sS -X POST "https://www.suno-api.io/api/voice/clone/tasks/123/check" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
只有以下条件同时满足才能生成:
is_available = true
status = ready
voice_id 非空
4.7 使用传统人声生成歌曲
POST /api/music/generate-with-voice
curl -sS -X POST "https://www.suno-api.io/api/music/generate-with-voice" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: voice-gen-$(date +%s)" \
-d '{
"voice_task_id": 123,
"voice_id": "e254150f-3f47-4ef3-b15b-3887f1d4e0a2",
"customMode": true,
"prompt": "写一首关于夏夜海边的中文流行歌曲",
"style": "Mandopop, warm piano, emotional",
"title": "夏夜海风",
"negativeTags": "noise, low quality",
"instrumental": false,
"model": "suno-v6",
"vocalGender": "f",
"styleWeight": 0.5,
"weirdnessConstraint": 0.5,
"audioWeight": 0.85
}'
主要字段:
| 字段 | 必填 | 说明 |
|---|---|---|
voice_task_id |
是 | 已可用传统人声任务 ID |
voice_id |
否 | 建议传入;必须与任务内 voice_id 一致 |
customMode |
否 | false 灵感模式;true 高级模式 |
prompt |
是 | 灵感模式填歌曲描述;高级模式填歌词 |
style |
高级模式必填 | 风格标签 |
title |
高级模式必填 | 歌曲标题 |
model |
否 | 默认 suno-v6 |
negativeTags |
否 | 排除风格 |
vocalGender |
否 | m / male / f / female |
styleWeight |
否 | 0–1 小数 |
weirdnessConstraint |
否 | 0–1 小数 |
audioWeight |
否 | 0–1 小数,音频参考度 |
sourceClipId |
否 | 传入时为指定来源歌曲人声翻唱 |
maxMode |
否 | true 时价格 ×2;传统人声接口使用 camelCase |
variety |
否 | 0–4 整数 |
成功响应会返回:
{
"success": true,
"data": {
"client_request_id": "cu_xxx",
"items": [
{
"placeholder_id": "pending:cu_xxx:0",
"client_request_index": 0,
"status": "submitted",
"type": "voice_generate"
},
{
"placeholder_id": "pending:cu_xxx:1",
"client_request_index": 1,
"status": "submitted",
"type": "voice_generate"
}
]
}
}
pending:* 不是最终歌曲 ID,不能用于歌曲查询或下载。
4.8 查询传统人声生成结果
GET /api/music/generate-with-voice/results?client_request_id=cu_xxx
curl -sS "https://www.suno-api.io/api/music/generate-with-voice/results?client_request_id=cu_xxx" \
-H "Authorization: Bearer $API_KEY"
顶层状态:
| 状态 | 说明 |
|---|---|
not_found |
尚未查到任务 |
processing |
仍在生成 |
completed |
全部完成 |
partial |
部分完成、部分失败 |
failed |
全部失败 |
只有 items[].song_id 存在且不以 pending: 开头时,才进入歌曲查询和下载。
4.9 永久删除传统人声
DELETE /api/voice/clone/voices/{voice_task_id}
curl -sS -X DELETE "https://www.suno-api.io/api/voice/clone/voices/123" \
-H "Authorization: Bearer $API_KEY"
首次删除:
{
"success": true,
"data": {
"voice_task_id": 123,
"deleted": true,
"already_deleted": false
}
}
重复删除:
{
"success": true,
"data": {
"voice_task_id": 123,
"deleted": true,
"already_deleted": true
}
}
删除后:
voice_task_id和对应voice_id都不能再用于新生成。- 查询该任务可能返回
record not found。 generate-with-voice、音色生成任务等入口会返回 HTTP 400、code=voice_deleted。- 旧 ID 不会恢复。
- 已生成歌曲不受影响。
- 如需继续使用同一声音,必须重新创建一条新的传统人声任务,不能复用旧
voice_task_id。
5. 共享查询与下载
5.1 批量查询歌曲
POST /api/music/query
curl -sS -X POST "https://www.suno-api.io/api/music/query" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"song_ids": "song-a,song-b"
}'
song_ids 是英文逗号分隔字符串,不是数组。返回通常是裸数组。
状态:
| 状态 | 说明 |
|---|---|
submitted / queued / processing |
生成中 |
completed |
完成,可下载 |
failed |
失败 |
建议每 5–10 秒查询一次,总超时 10–15 分钟。
5.2 单首详情
GET /api/music/songs/{song_id}
5.3 下载文件
GET /api/music/download?song_id={song_id}&kind=mp3
常用 kind:
mp3/songplaybackwavvideolyrics
也可以直接使用查询结果中的 audio_url。
6. 永久删除行为矩阵
6.1 两种音色删除对照
| 操作或场景 | 推荐音色 voice-profile | 传统克隆人声 persona |
|---|---|---|
| 删除接口 | POST /api/music/voice-profile/delete |
DELETE /api/voice/clone/voices/{voice_task_id} |
| 删除费用 | 免费 | 免费 |
| 是否永久删除 ID | 是 | 是 |
| 重复删除 | success=true、already_deleted=true |
success=true、already_deleted=true |
| 默认列表 | 删除后不再出现 | 任务查询会消失 |
| 删除后再次生成 | HTTP 400、voice_deleted |
HTTP 400、voice_deleted |
| 删除后重新查询旧 ID | 通常返回 voice not found / record not found |
通常返回 voice not found / record not found |
| 旧 ID 是否能恢复 | 否 | 否 |
| 新生成任务能否继续使用旧 ID | 否 | 否 |
| 已生成歌曲是否保留 | 是 | 是 |
6.2 voice_deleted 的含义
voice_deleted 表示:
这个音色身份已经被永久关闭。
不是临时不可用,也不是等待重试即可恢复。
推荐处理:
- 停止使用本地保存的旧音色 ID。
- 从音色列表中移除该音色。
- 提示终端用户重新创建音色。
- 不要自动用原 ID 重试。
- 不要用同一已删除素材尝试恢复原 ID。
- 根据业务需要创建新的音色 ID。
6.3 删除时正在生成的任务
- 尚未提交到生成阶段的任务可能被取消并退款。
- 已经进入生成阶段的任务是否继续完成取决于任务受理状态。
- 删除音色后,旧音色不能再提交新的生成请求。
- 已经成功完成的歌曲不受影响。
6.4 删除不会做什么
- 不会删除已经生成好的歌曲。
- 不会让已生成歌曲无法播放或下载。
- 不会恢复旧音色 ID。
- 不会自动创建替代音色。
- 不会把旧 ID 分配给新的音色。
7. 错误码与处理方式
7.1 音色已永久删除
HTTP:
400 Bad Request
推荐音色翻唱或兼容生成入口:
{
"success": false,
"code": "voice_deleted",
"error": {
"message": "该音色已永久删除,不能继续用于生成。请重新创建新的音色。",
"type": "invalid_request_error",
"code": "voice_deleted"
}
}
音色管理或生成管理入口可能返回:
{
"success": false,
"code": "voice_deleted",
"message": "该音色已永久删除,不能继续用于生成。请重新创建新的音色。"
}
处理:
不要重试旧 ID。
引导用户创建新音色。
7.2 音色不存在或不属于当前账号
常见返回:
{
"success": false,
"message": "voice not found"
}
或:
{
"success": false,
"message": "record not found"
}
可能原因:
- ID 输入错误。
- ID 属于其他账号。
- ID 已被删除。
- 任务尚未生成有效音色 ID。
7.3 音色尚未就绪
推荐音色:
status=processing
传统人声:
is_available=false
处理:
- 继续按建议间隔轮询。
- 不要提前提交生成任务。
- 推荐音色只有
ready可用。 - 传统人声只有
is_available=true且status=ready可用。
7.4 参数错误
常见参数错误:
| 错误 | 原因 |
|---|---|
voice audio is required |
未提供人声音频 |
voice_id is required |
缺少音色 ID |
voice_task_id is required |
缺少传统人声任务 ID |
model is required |
缺少模型名称 |
audio_weight must be a number between 0 and 1 |
把百分比误传为 50、85 等 |
duration must be an integer between 1 and 480 seconds |
时长不是整数或超出范围 |
vocal_gender must be one of m, f, male, female |
性别参数非法 |
variety must be an integer between 0 and 4 |
多样性参数非法 |
song_clip_id must be a real completed clip |
来源歌曲未完成或 ID 非法 |
7.5 超时
提交超时不等于失败。
正确做法:
- 保存提交前生成的幂等键或追踪 ID。
- 先查询最近任务或结果。
- 确认没有产生任务后,再决定是否重试。
推荐音色可以通过最近歌曲列表确认是否已有新任务:
GET /api/music/songs?p=1&page_size=20
传统人声优先查询:
GET /api/music/generate-with-voice/results?client_request_id=...
8. 计费与退款
实际价格可能调整。接入方应实时读取
/api/pricing/catalog,不要永久写死。
当前常用价格:
| 操作 | 当前口径 |
|---|---|
| 推荐音色普通创建 | 免费 |
| 推荐音色从已有音频创建 | 免费 |
| 强化克隆 | 按强化上传价,当前默认 10 元/次 |
| 推荐音色翻唱或唱新歌 | 当前 1.2 元/次 |
| 推荐音色 Max Mode | 当前 2.4 元/次 |
| 传统人声校验 | 免费 |
| 传统人声从已有音频创建 | 免费 |
| 传统人声生成歌曲 | 当前 1.2 元/次 |
| 传统人声 Max Mode | 当前 2.4 元/次 |
| 查询、列表、详情、删除 | 免费 |
| MP3 直链下载 | 免费 |
| WAV、歌词等重处理下载 | 以对应接口价格为准 |
读取价格:
curl -sS "https://www.suno-api.io/api/pricing/catalog"
退款原则:
- 参数错误、音色已删除、权限错误、请求在预扣费前被拒绝:不扣费。
- 已受理但最终失败的任务:按平台退款规则退回预扣金额。
- 已删除音色的新请求不会产生预扣费或任务。
9. 推荐的客户端状态机
9.1 推荐音色
creating
→ ready
→ submitting
→ processing
→ completed
→ failed
→ partial
→ failed
ready / failed / completed
→ deleted
本地必须保存:
voice_id
status
created_at
updated_at
最近一次生成时间
删除标记
9.2 传统克隆人声
created
→ validate_submitted
→ wait_validating
→ validate_ready
→ voice_processing
→ ready + is_available=true
→ generating
→ completed
→ failed
→ failed
→ deleted
本地必须保存:
voice_task_id
voice_id
status
is_available
updated_at
最近一次成功生成时间
删除标记
10. 最小可用调用清单
10.1 推荐音色
1. POST /api/music/voice-profile/create
2. 保存 data.voice_id
3. GET /api/music/voice-profile/{voice_id},确认 status=ready
4. POST /api/music/voice-profile/cover
5. 保存 clips[].song_id
6. POST /api/music/query,轮询到 completed
7. GET /api/music/download?... 下载
8. 不再使用时 POST /api/music/voice-profile/delete
10.2 传统克隆人声
1. POST /api/voice/clone/validate
2. 保存 voice_task_id
3. GET /api/voice/clone/tasks/{voice_task_id},获取 validate_info
4. 用户录音
5. POST /api/voice/clone/tasks/{voice_task_id}/generate
6. 轮询到 is_available=true 和 status=ready
7. POST /api/music/generate-with-voice
8. 保存 client_request_id
9. GET /api/music/generate-with-voice/results
10. 获取真实 song_id 后查询和下载
11. 不再使用时 DELETE /api/voice/clone/voices/{voice_task_id}
11. 常见问题
Q1:voice_deleted 后可以稍后重试吗?
不可以。该业务码表示音色 ID 已永久关闭。必须停止使用旧 ID,并创建新音色。
Q2:删除后,之前生成的歌曲还能听吗?
可以。删除音色只阻止旧音色继续发起新的生成,不影响已经完成的歌曲、播放和下载。
Q3:删除后重新提交同一段音频,会拿回原 ID 吗?
不会。推荐音色使用同一已删除素材再次创建会返回 voice_deleted。需要重新准备可用素材并创建新的音色。
Q4:删除接口返回 already_deleted=true 是错误吗?
不是。表示这个音色之前已经删除,本次请求是安全的重复操作,不重复扣费。
Q5:推荐音色和传统人声 ID 能互换吗?
不能。vp_... 使用 /api/music/voice-profile/cover;传统 voice_task_id 使用 /api/music/generate-with-voice。
Q6:生成接口返回成功,为什么还没有音频?
生成接口只表示已受理。需要继续轮询到 completed,之后才有可下载地址。
Q7:使用已删除音色会被扣费吗?
不会。删除态检查发生在生成和扣费之前,请求会被直接拒绝。
Q8:推荐音色的 audio_weight 是什么?
音频参考度,取值 0–1。数值越高通常越贴近音色样本;默认通常为 0.85。不要传百分比。
Q9:为什么 duration 填 20 秒,成品却更长?
平台实际最短约 30 秒。duration 是期望值,不保证逐秒精确。
Q10:删除操作是否支持批量?
当前删除按单个音色 ID 调用。客户端需要删除多个音色时逐个调用。
12. 发布前兼容性说明
2026-11-09 起:
- 推荐音色和传统人声删除都改为永久 ID 关闭。
- 删除后再次使用同一个音色 ID,统一返回
voice_deleted。 - 重复删除改为幂等成功,并返回
already_deleted=true。 - 删除音色不会删除已生成歌曲。
- 已删除 ID 不能再通过幂等重放或重复创建恢复。
- 客户端应移除旧的“删除后重新创建可恢复原 ID”逻辑。
如客户端历史上保存了大量音色 ID,请在首次加载时:
1. 读取当前音色列表。
2. 本地缓存中不在列表里的音色标记为 unavailable。
3. 用户再次使用时,不要把旧 ID 自动提交到生成接口。
4. 捕获 voice_deleted 并引导用户创建新音色。
13. 支持信息
提交工单或联系技术支持时,请提供:
- 请求时间
- 接口路径
- HTTP 状态码
- 返回 JSON 中的
code/message voice_id或voice_task_idclient_request_idIdempotency-Key- 生成歌曲的
song_id
不要发送完整 API Key、Cookie、Authorization 请求头或其他敏感凭据。