人聲複製與指定人聲生成 API(不推薦)
⛔ 舊鏈路,不推薦新接入。 本文件描述的是早期
persona(voice_task_id/generate-with-voice)鏈路,仍然可用,但不再對外推薦;左側導覽裡已標註「不推薦」。新接入請用【推薦】複製音色 API:用一段人聲樣本建立音色(
POST /api/music/voice-profile/create),再用它翻唱指定歌曲或演唱新歌。音色是一等資源,可以列表、查詢、刪除,且來源音訊永久保留。如果你的產品需要「建立音色 → 長期複用 → 翻唱」的完整閉環,請優先接新鏈路。
重要提示:複製人聲可能過期。
人聲複製生成的
voice_id/voice_task_id不是永久可用資源,可能因有效期限、帳號狀態或人聲狀態變化而失效。接入方不要只在首次複製成功後永久複用本地快取的人聲 ID。推薦做法:
- 保存
voice_task_id、voice_id、is_available、updated_at和最近一次生成成功時間。- 每次使用已複製人聲生成前,先呼叫
GET /api/voice/clone/tasks/{voice_task_id}或POST /api/voice/clone/tasks/{voice_task_id}/check確認is_available=true。- 如果介面回傳人聲不可用、任務不存在、
selected voice is not ready等錯誤,請提示使用者重新複製或重新選擇可用人聲。- 不建議把複製人聲做成「永久資產」承諾給終端使用者;應在產品介面中提示「人聲可能過期,需要重新校驗或重新複製」。
介面說明
本組介面用於建立可複用的人聲,並使用該人聲生成歌曲。呼叫方只需要使用平台發放的 API Key,伺服器會統一處理任務提交、狀態同步、計費和下載。
認證方式: Authorization: Bearer YOUR_API_KEY
計費:
- 人聲校驗、人聲複製、狀態查詢、刪除、下載:免費。
- 工作台的一步式複製入口:固定 5 元/次,自動完成來源人聲校驗與二次驗證音訊,失敗會退款。
- 普通複製完成後繼續自動生成驗證音訊:固定 5 元/次;失敗按現有流程退款。
- 使用已複製人聲生成歌曲:收費,固定 1.2 元/次,每次通常回傳 2 個佔位任務。
- 開啟 Max Mode(
POST /api/music/generate-with-voice傳max_mode: true)時, 上述 1.2 元/次按 2 倍計費,即 2.4 元/次;人聲生成也支援variety(0-4, 不額外計費),取值規則見新版 API 總覽 的「進階參數」一節。
呼叫流程
- 呼叫
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提交驗證音訊。 - 呼叫
POST /api/voice/clone/tasks/{voice_task_id}/check或繼續查詢任務,直到is_available=true。 - 呼叫
POST /api/music/generate-with-voice使用該人聲生成歌曲。 - 生成介面會先回傳佔位任務;歌曲生成完成並拿到實際
song_id後,可用下載介面下載單一檔案或打包檔案。 - (可選)不再需要這個人聲時,呼叫
DELETE /api/voice/clone/voices/{voice_task_id}刪除,語意見第 6 節。
此外還有一步式複製:在工作台的首次錄音/上傳來源人聲頁面選擇一步完成,系統會一次完成校驗與音色生成,不需要你再錄第二段驗證音訊;按 5 元/次計費,失敗退款。
人聲任務欄位
| 欄位 | 型別 | 說明 |
|---|---|---|
voice_task_id |
number | 平台內的人聲任務 ID,後續介面都使用這個 ID |
voice_id |
string | 可用於生成歌曲的人聲 ID,任務可用後回傳 |
voice_name |
string | 人聲名稱 |
description |
string | 人聲描述 |
style |
string | 人聲風格 |
singer_skill_level |
string | 演唱水準,常用值:beginner、intermediate、professional |
language |
string | 來源人聲語言,例如 zh、en |
validate_info |
string | 需要朗讀的驗證文字 |
validate_status |
string | 校驗任務狀態 |
voice_status |
string | 人聲生成狀態 |
is_available |
boolean | 是否已經可用於生成歌曲 |
status |
string | 平台任務狀態 |
stage |
string | 當前階段 |
error_code |
string | 失敗錯誤碼 |
error_message |
string | 失敗原因 |
source_duration_seconds |
number | 來源音訊時長,單位秒 |
created_at |
number | 建立時間戳 |
updated_at |
number | 更新時間戳 |
completed_at |
number | 完成時間戳 |
1. 提交來源人聲校驗
介面位址: POST /api/voice/clone/validate
Body 參數
| 參數名 | 型別 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
voice_url |
string | 否 | - | 來源人聲音訊 URL。與 file_base64 二選一 |
file_base64 |
string | 否 | - | Base64 音訊。與 voice_url 二選一 |
file_name |
string | 否 | - | 檔案名稱,使用 file_base64 時建議傳入 |
voice_name |
string | 否 | 自動生成 | 人聲名稱 |
description |
string | 否 | - | 人聲描述 |
style |
string | 否 | - | 人聲風格 |
singer_skill_level |
string | 否 | beginner |
演唱水準 |
language |
string | 否 | zh |
來源人聲語言 |
vocal_start_s |
number | 是 | - | 有效人聲開始秒數 |
vocal_end_s |
number | 是 | - | 有效人聲結束秒數 |
source_duration_seconds |
number | 否 | - | 來源音訊總時長,單位秒 |
vocal_end_s - vocal_start_s需要滿足最短人聲片段要求。建議上傳清晰、無明顯伴奏和雜訊的人聲錄音。
請求範例
curl -X POST https://www.suno-api.io/api/voice/clone/validate \
-H "Authorization: Bearer YOUR_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
}'
回應範例
{
"success": true,
"message": "",
"data": {
"voice": {
"voice_task_id": 123,
"voice_name": "我的中文女聲",
"language": "zh",
"validate_status": "submitted",
"is_available": false,
"status": "validate_submitted",
"stage": "validate_submitted",
"created_at": 1780480000,
"updated_at": 1780480000
}
}
}
2. 查詢人聲任務
介面位址: GET /api/voice/clone/tasks/{voice_task_id}
請求範例
curl https://www.suno-api.io/api/voice/clone/tasks/123 \
-H "Authorization: Bearer YOUR_API_KEY"
回應範例
{
"success": true,
"message": "",
"data": {
"voice": {
"voice_task_id": 123,
"voice_name": "我的中文女聲",
"validate_info": "請朗讀這裡回傳的驗證文字",
"validate_status": "success",
"is_available": false,
"status": "validate_ready",
"stage": "validate_callback"
}
}
}
3. 重新生成驗證文字
介面位址: POST /api/voice/clone/tasks/{voice_task_id}/regenerate
當驗證文字不適合朗讀或需要重新校驗時可呼叫。
curl -X POST https://www.suno-api.io/api/voice/clone/tasks/123/regenerate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
4. 提交驗證音訊並建立人聲
介面位址: POST /api/voice/clone/tasks/{voice_task_id}/generate
Body 參數
| 參數名 | 型別 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
verify_url |
string | 否 | - | 按驗證文字朗讀的音訊 URL。與 file_base64 二選一 |
file_base64 |
string | 否 | - | Base64 驗證音訊。與 verify_url 二選一 |
file_name |
string | 否 | - | 檔案名稱,使用 file_base64 時建議傳入 |
voice_name |
string | 否 | 沿用任務名稱 | 人聲名稱 |
description |
string | 否 | 沿用任務描述 | 人聲描述 |
style |
string | 否 | 沿用任務風格 | 人聲風格 |
singer_skill_level |
string | 否 | 沿用任務設定 | 演唱水準 |
請求範例
curl -X POST https://www.suno-api.io/api/voice/clone/tasks/123/generate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"verify_url": "https://example.com/verify-voice.wav",
"voice_name": "我的中文女聲"
}'
5. 檢查人聲是否可用
介面位址: POST /api/voice/clone/tasks/{voice_task_id}/check
curl -X POST https://www.suno-api.io/api/voice/clone/tasks/123/check \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
任務可用時回應中的 is_available 為 true,並回傳 voice_id。
6. 刪除人聲
介面位址: DELETE /api/voice/clone/voices/{voice_task_id}
計費: 免費。
curl -X DELETE https://www.suno-api.io/api/voice/clone/voices/123 \
-H "Authorization: Bearer YOUR_API_KEY"
回應範例
{
"success": true,
"message": "",
"data": {
"voice_task_id": 123,
"deleted": true
}
}
| 欄位 | 型別 | 說明 |
|---|---|---|
| voice_task_id | number | 被刪除的人聲任務 ID |
| deleted | boolean | 固定為 true,表示刪除請求已被受理 |
刪除之後會怎樣
- 不能再拿來生成新歌:繼續拿這個
voice_task_id(或它的voice_id)呼叫POST /api/music/generate-with-voice會被拒絕,錯誤訊息是selected voice is not ready,不扣費。 - 已經用它生成的歌完全不受影響:播放、下載、續寫、替換、分軌都照舊。
- 這條人聲任務會從查詢裡消失:
GET /api/voice/clone/tasks/{voice_task_id}回傳record not found。 - 來源音訊按平台的永久保留策略保留(2026-09-23 起,刪除不會再清理你上傳的那段人聲素材),但這不等於可以恢復:舊的這條任務已經終止,想繼續用同一個聲音,需要重新走一遍複製流程,會拿到新的
voice_task_id。 - 重複刪除:對同一條任務再刪一次回傳
record not found(它已經是刪除態,查不到了)。
7. 使用已複製人聲生成歌曲
介面位址: POST /api/music/generate-with-voice
計費: 1.2 元/次。
Body 參數
| 參數名 | 型別 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
voice_task_id |
number | 是 | - | 已可用的人聲任務 ID |
voice_id |
string | 否 | - | 可選校驗欄位;傳入時必須和任務中的 voice_id 一致 |
customMode |
boolean | 否 | false |
false 為靈感模式,true 為進階模式 |
prompt |
string | 是 | - | 靈感模式為歌曲描述;進階模式為歌詞。兩種模式都不能為空 |
style |
string | 進階模式為是 | - | 風格標籤;customMode=true 時不能為空 |
title |
string | 進階模式為是 | - | 歌曲標題;customMode=true 時不能為空 |
negativeTags |
string | 否 | - | 負向風格 |
instrumental |
boolean | 否 | false |
相容欄位;複製聲音生成固定按非純音樂處理 |
waitAudio |
boolean | 否 | false |
相容欄位;本介面固定非同步回傳佔位任務,不等待音訊完成 |
model |
string | 否 | suno-v6 |
普通歌曲生成模型;可用 suno-v6、suno-v6-wild 或 suno-v6-mini |
vocalGender |
string | 否 | - | 人聲性別偏好 |
lyricsMode |
string | 否 | - | 相容欄位;當前複製聲音提交鏈路不單獨改變歌詞模式 |
weirdnessConstraint |
number | 否 | - | 創意強度 |
styleWeight |
number | 否 | - | 風格權重 |
audioWeight |
number | 否 | 平台預設 | Audio Influence(音訊參考度),範圍 0.0-1.0。不傳時按平台預設處理(相當於官方介面 25%);0 是有效值,表示完全不向引用來源靠攏。它與下一條 sourceClipId 強相關:傳入來源時它指向參考音訊,不傳來源時它指向複製音色——平台只有這一條滑桿同時涵蓋兩種情況,不要按業務拆成兩個參數 |
sourceClipId |
string | 否 | - | 來源歌曲的真實工作區 clip ID。傳入後進入複製聲音翻唱;不傳則為普通複製聲音生成 |
sourceAudioUrl |
string | 否 | - | 來源展示欄位,不參與所有權或帳號判定,伺服器以資料庫記錄為準 |
sourceTitle |
string | 否 | - | 來源展示欄位,不參與所有權或帳號判定 |
clientSubmissionId |
string | 否 | - | Create UI 相容欄位;客戶 API 的可靠去重必須使用 Idempotency-Key Header |
支援 suno-v6、suno-v6-wild 和 suno-v6-mini;空模型按 suno-v6 處理。舊的 V5/V5.5 模型已下線,但歷史任務可能仍顯示舊模型名。
共享請求結構還能解析 task、soundType、soundLoop、soundBpm、soundKey、voiceTaskId、voiceId 等 Create UI 相容欄位,但它們不是本介面的有效客戶參數:聲音任務必須傳 voice_task_id,可選聲音校驗必須傳 voice_id,聲音音樂生成不會讀取 sound 欄位。
生成參數填寫說明
customMode=false時,prompt填歌曲描述;customMode=true時,prompt填完整歌詞,style和title也必須填寫。不要把「歌詞」誤傳到靈感模式的描述欄位,或把歌曲描述當作進階模式歌詞。weirdnessConstraint和styleWeight都是0.0到1.0的比例小數,不能填寫50或50%。一般可用0.5作為均衡值;省略表示不指定,0則是有效的顯式值。vocalGender只能使用m、male、f或female。instrumental在本介面中僅為相容欄位,複製聲音生成固定按人聲歌曲處理。waitAudio在本介面中不會改變行為,介面固定非同步回傳佔位任務。初始結果中的audio_url為空是正常現象,請使用client_request_id查詢,直到結果完成後再讀取音訊位址。
Header 參數
| Header | 必填 | 說明 |
|---|---|---|
Authorization: Bearer ... |
是 | 客戶 API Token |
Content-Type: application/json |
是 | JSON 請求體 |
Idempotency-Key |
否,強烈建議 | 最長 128 字元。相同使用者、Token、端點、Key 和請求體只計費並建立一次任務 |
Idempotency-Key 行為:
- 首次請求在計費前寫入持久冪等記錄;
- 相同 Key、相同請求已完成時,重放第一次的接收回應,不重複計費或建任務;
- 相同 Key、不同請求體會被拒絕;
- 相同 Key 仍在處理中時回傳穩定的處理中錯誤,並且只在已生成時回傳安全的
client_request_id; - 相同 Key 的首次請求失敗後保持失敗狀態,重試必須換新 Key。
sourceClipId 翻唱條件
客戶 API 的來源翻唱由伺服器統一處理來源歌曲存取,不需要客戶傳遞任何帳號資訊。是否可用以介面實際回應為準。
來源必須屬於當前 API 使用者,是已完成、非 pending: 的工作區歌曲,並有可用音訊。支援普通生成、普通上傳來源和強化上傳最終歌曲;強化上傳中間記錄會在計費前拒絕。伺服器只接受客戶提交的來源歌曲 ID,不接受客戶傳帳號 ID;來源不可用或未完成時會在計費前回傳錯誤。
請求範例
curl -X POST https://www.suno-api.io/api/music/generate-with-voice \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"voice_task_id": 123,
"customMode": true,
"prompt": "寫一首關於夏夜海邊的中文流行歌曲",
"style": "Mandopop, warm piano, emotional",
"title": "夏夜海風",
"negativeTags": "noise, low quality",
"instrumental": false,
"model": "suno-v6"
}'
回應範例
{
"success": true,
"message": "",
"data": {
"client_request_id": "cu_1780480000_abcd1234",
"items": [
{
"placeholder_id": "pending:cu_1780480000_abcd1234:0",
"client_request_id": "cu_1780480000_abcd1234",
"client_request_index": 0,
"status": "submitted",
"type": "voice_generate",
"title": "夏夜海風",
"prompt": "寫一首關於夏夜海邊的中文流行歌曲"
},
{
"placeholder_id": "pending:cu_1780480000_abcd1234:1",
"client_request_id": "cu_1780480000_abcd1234",
"client_request_index": 1,
"status": "submitted",
"type": "voice_generate",
"title": "夏夜海風",
"prompt": "寫一首關於夏夜海邊的中文流行歌曲"
}
],
"pre_consumed_quota": 600000,
"billing_source": "wallet"
}
}
關於佔位任務和最終 song_id
generate-with-voice 是非同步生成介面。介面回傳成功只表示生成任務已經提交,不表示歌曲已經生成完成。
回應中的關鍵欄位含義:
| 欄位 | 說明 |
|---|---|
client_request_id |
本次生成請求的追蹤 ID。一次請求通常生成 2 首歌,兩個結果都使用同一個 client_request_id。 |
items[].placeholder_id |
平台本地佔位 ID,格式通常是 pending:{client_request_id}:{index}。它不是最終歌曲 ID。 |
items[].client_request_index |
同一次請求中的結果序號,通常為 0 和 1。 |
items[].status |
提交後的初始狀態,例如 submitted。後續生成成功或失敗以最終任務記錄為準。 |
注意:pending: 開頭的 placeholder_id 不能作為最終 song_id 使用,也不能直接用於 /api/music/query 或下載介面。只用 pending:* 呼叫 /api/music/query 時,可能會回傳空陣列 [],這是因為真實歌曲還沒有完成,或佔位任務還沒有替換成最終歌曲 ID。
錯誤範例:
{
"song_ids": "pending:cu_1780480000_abcd1234:0"
}
正確流程:
- 呼叫
POST /api/music/generate-with-voice提交人聲生成音樂任務。 - 保存回應裡的
client_request_id、items[].placeholder_id和items[].client_request_index。 - 輪詢
GET /api/music/generate-with-voice/results?client_request_id=cu_xxx。 - 等回應裡的
items[].song_id有值且不以pending:開頭後,再呼叫/api/music/query、/api/music/download-file或/api/music/download-all。
當前版本已新增公開查詢介面:
GET /api/music/generate-with-voice/results?client_request_id=cu_xxx
它回傳當前使用者下同一個 client_request_id 對應的任務結果,適合客戶自助查詢最終 song_id。回傳列表裡:
song_id是真實歌曲 ID;placeholder_id僅在任務仍處於佔位狀態時出現;pending:開頭的值不能用於/api/music/query或下載介面。
若你只保存了 client_request_id 或 pending:* 佔位 ID,可以先呼叫這個結果介面查詢;如果還沒查到真實 song_id,再把 client_request_id 發給技術支援協助定位。
查詢人聲生成音樂結果
介面位址: GET /api/music/generate-with-voice/results
計費: 免費。
Query 參數
| 參數名 | 型別 | 必填 | 說明 |
|---|---|---|---|
client_request_id |
string | 是 | generate-with-voice 回傳的請求追蹤 ID |
請求範例
curl -X GET "https://www.suno-api.io/api/music/generate-with-voice/results?client_request_id=cu_1780480000_abcd1234" \
-H "Authorization: Bearer YOUR_API_KEY"
生成中回應範例
{
"success": true,
"message": "",
"data": {
"client_request_id": "cu_1780480000_abcd1234",
"status": "processing",
"items": [
{
"song_id": "",
"placeholder_id": "pending:cu_1780480000_abcd1234:0",
"client_request_id": "cu_1780480000_abcd1234",
"client_request_index": 0,
"status": "processing",
"type": "voice_generate",
"title": "夏夜海風"
}
]
}
}
生成完成回應範例
{
"success": true,
"message": "",
"data": {
"client_request_id": "cu_1780480000_abcd1234",
"status": "completed",
"items": [
{
"song_id": "song_abc123",
"client_request_id": "cu_1780480000_abcd1234",
"client_request_index": 0,
"status": "completed",
"type": "voice_generate",
"title": "夏夜海風",
"audio_url": "https://...",
"image_url": "https://...",
"duration": 180.5
}
]
}
}
頂層 status 含義
| 狀態 | 說明 |
|---|---|
not_found |
當前使用者下還沒有查到該 client_request_id 的任務記錄 |
processing |
至少還有一個結果未完成,繼續輪詢 |
completed |
所有結果都已完成,可以使用 song_id 查詢或下載 |
partial |
部分完成、部分失敗,可先處理已完成的 song_id |
failed |
所有結果失敗,查看 items[].error_message |
8. 下載單一檔案
介面位址: POST /api/music/download-file
Body 參數
| 參數名 | 型別 | 必填 | 說明 |
|---|---|---|---|
song_id |
string | 是 | 歌曲 ID |
kind |
string | 是 | 下載類型:audio、cover、wav、video |
請求範例
curl -X POST https://www.suno-api.io/api/music/download-file \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_id": "song_abc123",
"kind": "audio"
}' \
--output song.mp3
回應為檔案串流,Content-Type 和檔名以後端回傳為準。
9. 打包下載歌曲資源
介面位址: POST /api/music/download-all
Body 參數
| 參數名 | 型別 | 必填 | 說明 |
|---|---|---|---|
song_id |
string | 是 | 歌曲 ID |
請求範例
curl -X POST https://www.suno-api.io/api/music/download-all \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_id": "song_abc123"
}' \
--output song.zip
打包檔案通常包含音訊、封面和 metadata.json;如果某類資源暫未生成,則不會放入壓縮包。
常見錯誤
| message | 說明 |
|---|---|
voice audio is required |
提交來源人聲時未提供 voice_url 或 file_base64 |
invalid voice task id |
路徑中的人聲任務 ID 無效 |
voice validation is not ready |
尚未拿到驗證文字,不能提交驗證音訊 |
selected voice is not ready |
選擇的人聲尚不可用於生成歌曲(未就緒、已刪除,或不屬於當前帳號) |
selected voice does not match voice task |
請求中的 voice_id 與任務不一致 |
voice task is required |
生成人聲歌曲時缺少 voice_task_id |
record not found |
任務 / 歌曲不存在、不屬於當前 API Key 所屬帳號,或已經被刪除(刪除人聲後再查這條任務也會看到它) |
本組介面的錯誤統一回傳 HTTP 200:請以回應體裡的
success欄位判斷成敗(false即失敗,原因見message),不要只看 HTTP 狀態碼。 刪除人聲的完整語意(刪除後還能不能用、能不能恢復)見第 6 節。