【推薦】複製音色 API

2026-09-18 更新 · Suno-API 團隊

✅ 新接入推薦使用本鏈路。 依據大量使用者的實際評測,這條鏈路生成的歌曲原聲還原度較高,成品裡的人聲更接近你上傳樣本中的本人音色,因此作為目前對外推薦的首選鏈路。

對照:早期的人聲複製與指定人聲生成 API(不推薦) 仍然可用,但導覽裡已標註「不推薦」,不再推薦新接入。

說明:本文件只描述你需要呼叫的介面。素材處理、任務排程、內容校驗等環節都由伺服器自動完成,客戶端無需實作。


0. 五分鐘上手

只要四步,就能從一段人聲樣本拿到兩首成品歌。

① 建立音色    POST /api/music/voice-profile/create      → 拿到 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

最小可用範例(curl):

API_KEY="sk-你的密鑰"
BASE="https://www.suno-api.io"

# ① 建立音色(上傳一段人聲樣本,建議 10 秒以上、10MB 以內)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3" \
  -F "title=我的音色" \
  -F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}

# ② 用這個音色翻唱一首歌(song_clip_id = 要翻唱的那首歌的 clip id)
curl -sS -X POST "$BASE/api/music/voice-profile/cover" \
  -H "Authorization: Bearer $API_KEY" \
  -H "X-Create-Ui-Client-Request-Id: cover-$(date +%s)" \
  -H "Content-Type: application/json" \
  -d '{
        "model": "suno-v6",
        "voice_id": "vp_2026…",
        "song_clip_id": "5b773e9a-…",
        "lyrics": "[Verse 1]\n歌詞正文…",
        "style_requirements": "慢速民謠,木吉他",
        "audio_weight": 0.85,
        "max_mode": false
      }'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}

# ③ 輪詢(一次傳多個 id,用半形逗號分隔)
curl -sS -X POST "$BASE/api/music/query" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"suno-v6","song_ids":"id1,id2"}'

# ④ 完成後下載 mp3(status=completed 才能拿到檔案)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
  -H "Authorization: Bearer $API_KEY" -o song1.mp3

1. 公共約定

1.1 網域與環境

環境 Base URL 用途
生產 https://www.suno-api.io 正式對客

下文所有路徑都相對於 Base URL,例如 POST /api/music/voice-profile/create 的完整位址是 https://www.suno-api.io/api/music/voice-profile/create。

1.2 驗證

所有介面都用同一個請求標頭,值就是你在主控台建立的 API Key:

Authorization: Bearer sk-xxxxxxxx

1.3 請求主體格式

1.4 兩種回應外殼(對客只需認這兩種)

「音色管理」類介面(create / create-from-clip / list / detail / delete)用業務外殼:

{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }

「音色翻唱」走生成通道,用生成外殼:成功是 code/message/data,失敗是 error 物件:

{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }

判定建議:先看 HTTP 狀態碼,再看 success === false,最後看 code !== 200 或是否存在 error。 業務失敗不保證 HTTP 非 200(音色管理類介面出錯時 HTTP 仍是 200),所以不能只看 HTTP 狀態碼。

1.5 冪等

建立音色(含「從現有音訊建立」)是真正冪等的:同一個 Key 下,同一個 client_request_id 重複提交只會建一條音色,第二次直接回傳第一次的結果(success=true、同一個 voice_id)。用法是客戶端自己生成一個 id(例如 UUID),逾時重試時沿用同一個值。

翻唱提交不做請求級去重(它是一次計費生成),請注意兩點:

  1. 提交標識放在請求標頭 X-Create-Ui-Client-Request-Id: <你的提交 id>。它會寫進伺服器任務記錄,便於事後排查;它不會阻止重複扣費。
  2. 提交逾時 ≠ 失敗:請求可能已經被受理並在生成。重試前建議先 GET /api/music/songs?p=1&page_size=20(分頁參數是 p / page_size,也可用相容寫法 ps)看最近是否已經出現 generation_type=voice_profile_cover 的新歌,確認沒有再把同樣的請求重發一次。

create 與 create-from-clip 的 body 裡也用 client_request_id 欄位(見 §3、§4)。

1.6 計費總覽

動作 介面 價格 說明
建立音色(普通) POST /api/music/voice-profile/create 免費 上傳樣本不消耗 Suno 額度
建立音色(從現有音訊) POST /api/music/voice-profile/create-from-clip 免費 伺服器只登記素材引用,不重新上傳
強化複製 同上,enhanced=true 依「強化上傳價」(預設 10 元/次) 非同步,失敗自動退款
音色翻唱 POST /api/music/voice-profile/cover 1.2 元/次;max_mode=true 時 2.4 元/次 一次回傳 2 首
查詢 / 列表 / 詳情 / 刪除 — 免費
下載(自行取直鏈) 回應裡的 audio_url 免費 直接播放下發位址
下載(轉 wav / 歌詞等) POST /api/music/free2 0.2 元/成功首 見 §8

價格隨時可透過公開介面讀取,不要寫死(見 §9):

curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
#   "generation_price": "0.6",
#   "voice_generation_price": "1.2",      ← 音色翻唱基準價
#   "max_mode_factor": "2",
#   "enhanced_upload_price": "10",        ← 強化複製價
#   "voice_auto_verify_price": "5",
#   "voice_long_term_clone_price": "5"
# }

翻唱採用預扣費 + 失敗退款:

1.7 狀態字典

音色的 status:

值 含義 可用來翻唱
ready 已就緒 ✅
processing 僅強化複製(enhanced=true)會出現,正在處理 ❌(要等 ready)
failed 建立失敗,看 error_message;強化複製已退款 ❌

歌曲的 status(查詢介面回傳值):

值 含義 可下載
submitted / queued / processing 生成中(可能已有試聽串流) ❌
completed 完成 ✅
failed 失敗,費用已退回 ❌

2. 介面總覽

# 方法 路徑 作用 計費
1 POST /api/music/voice-profile/create 建立音色(上傳 / URL / base64) 免費(enhanced=true 除外)
2 POST /api/music/voice-profile/create-from-clip 用自己已有的音訊建立音色 免費
3 GET /api/music/voice-profile/list 音色列表 免費
4 GET /api/music/voice-profile/{voice_id} 音色詳情(含強化複製進度) 免費
5 POST /api/music/voice-profile/delete 刪除音色 免費
6 POST /api/music/voice-profile/cover 用音色翻唱 / 唱新歌 1.2 元(MAX 2.4)
7 POST /api/music/query 批量查詢歌曲狀態 免費
8 GET /api/music/songs/{song_id} 單首詳情 免費
9 GET /api/music/download 下載成品檔案 免費(mp3/播放連結)
10 POST /api/music/free2 轉 wav / 歌詞等 0.2 元/成功首
11 POST /api/music/free2/cached 取已歸檔的下載位址 免費
12 GET /api/music/songs 我的作品列表(分頁) 免費

3. 建立音色

POST /api/music/voice-profile/create

把一段人聲音訊登記成「音色」,得到 voice_id。音色對平台而言就是「一段音訊 + 它在曲庫裡的 clip」,因此建立成功後這段來源音訊永久保留(用於後續翻唱)。

3.1 三種入參形態(任選其一)

形態 A:multipart 上傳檔案(推薦)

Content-Type: multipart/form-data

file=<音訊二進位>          # 必填
title=<音色名稱>            # 選填,空則取檔名去掉副檔名
file_name=<原始檔名>
source_file_name=<原始檔名>
source_kind=upload|record   # 選填,來源標記(上傳 / 錄製),預設 upload
enhanced=false|true         # 選填,true = 強化複製(見 §3.5)
client_request_id=<冪等鍵>   # 選填
voice_id=<自訂 ID>           # 選填,一般不用
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"

形態 B:JSON + 公網音訊 URL

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": "我的音色"
      }'

形態 C:JSON + base64

{
  "file_base64": "data:audio/mpeg;base64,//uQxAAA…",
  "file_name": "my-voice.mp3",
  "title": "我的音色"
}

3.2 音訊要求

項 要求 備註
體積 ≤ 10MB 超限會在閘道被截斷,表現為「被 Suno 拒絕」,請先壓縮或剪短
時長 最少 6 秒;建議 10–60 秒 不足 6 秒會被平台拒絕:Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds.
格式 mp3 / wav / m4a / aac / flac / ogg 以副檔名判定
內容 乾淨人聲,避免翻唱成品 / 帶伴奏的原曲 與曲庫已有錄音高度相似會被拒絕:This audio matches an existing recording in our catalog.(實測)

3.3 回應

{
  "success": true,
  "message": "",
  "data": {
    "voice_id": "vp_20260926080618509168500DXXrxe",
    "clip_id": "91cc5935-389f-4193-b56b-cc796c15562d",
    "song_id": "91cc5935-389f-4193-b56b-cc796c15562d",
    "account_id": "acc_1790085275308",
    "title": "我的音色",
    "source_file_name": "my-voice.mp3",
    "audio_url": "https://suno-api-p-1437223057.cos.ap-guangzhou.myqcloud.com/create-ui/voice-source/2026/09/26/xxx.mp3",
    "image_url": "https://cdn2.suno.ai/image_91cc5935-389f-4193-b56b-cc796c15562d.jpeg",
    "duration_s": 29.18,
    "enhanced": false,
    "source_kind": "upload",
    "status": "ready",
    "client_request_id": "",
    "created_at": 1790409978,
    "updated_at": 1790409998
  }
}

欄位說明(create / list / detail 三個介面共用同一套欄位):

欄位 型別 說明
voice_id string 音色 ID,後續翻唱用它
clip_id / song_id string 該音色音訊在 Suno 側的 clip id(兩者相同),排查用
account_id string 承接帳號標識(排查用,客戶端無需關心)
title string 音色名稱
source_file_name string 原始檔名
audio_url string 來源音訊的長期直鏈,可用於試聽;永久保留
image_url string 音色封面(Suno 為人聲音訊生成的封面);沒有封面時該鍵整個不出現
duration_s number 音色樣本時長(秒)
enhanced bool 是否強化複製建立
source_kind string upload(上傳)/ record(錄製)/ clip(取自已有音訊)
status string ready / processing / failed
error_message string 失敗原因,僅 failed 時出現
task_id number 強化複製的底層任務號,僅 enhanced=true 時有值
pre_consumed_quota number 預扣費額度(僅強化複製有值)
created_at / updated_at number Unix 秒

created_at / updated_at 是秒級時間戳(10 位),不是毫秒。

3.4 常見錯誤

HTTP message 原因與處理
200 one of file_path, file_base64, or file_url is required 沒有帶上音訊內容
200 Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. 樣本太短,改 ≥6 秒(建議 ≥10 秒)
200 This audio matches an existing recording in our catalog. 樣本與曲庫已有錄音高度相似,換一段乾淨的乾聲
200 upload succeeded without clip or account identity 平台回包異常,重試
200 audio file exceeds 30 MB limit 超過伺服器上限(對客實際請按 10MB 控制)
401 invalid token API Key 錯誤

3.5 強化複製(enhanced=true)

用於「音色樣本本身帶有版權歌詞 / 需要做加強上傳」的場景,價格依強化上傳價(預設 10 元/次,失敗自動退款):

curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3" -F "title=我的音色" -F "enhanced=true"

4. 用已有音訊建立音色

如果你不想重新上傳:把自己已經上傳或已經生成的一段音訊直接複製成音色。免費、冪等。

POST /api/music/voice-profile/create-from-clip
Content-Type: application/json

{
  "source_song_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
  "title": "徐清 強",
  "client_request_id": "vp-clip-1789…"
}

回應 = §3.3 的全部欄位,另加兩個唯讀欄位:

欄位 說明
reused true = 這個音訊之前已經是你的音色,本次直接複用
source_type 該音訊的來源類型:generate / custom_generate / voice_generate / upload_source / enhanced_upload
{
  "success": true,
  "data": {
    "voice_id": "vp_20260926081712557959800Z5gvlt",
    "clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
    "title": "徐清 強",
    "status": "ready",
    "enhanced": true,
    "reused": true,
    "source_type": "enhanced_upload"
  }
}

錯誤(message 原文,建議直接顯示或做本地化):

message 含義
source audio not found clip 不存在或不屬於你
source audio is invalid 該音訊還在生成中 / 是中間產物,尚不可用
source_song_id is required 沒傳 source_song_id

5. 音色列表 / 詳情 / 刪除

5.1 列表

GET /api/music/voice-profile/list
GET /api/music/voice-profile/list?include_deleted=true
{
  "success": true,
  "message": "",
  "data": {
    "items": [ { "voice_id": "vp_…", "title": "我的音色", "status": "ready", "audio_url": "…", "image_url": "…" } ],
    "total": 1
  }
}

欄位與 §3.3 完全一致。預設不回傳已刪除的音色。

5.2 詳情

GET /api/music/voice-profile/{voice_id}

回傳單個音色物件(data 為物件本身,不是陣列)。強化複製在處理中時,會額外帶上:

欄位 說明
progress_percent 0–100 的整數
progress_stage 階段標識,例如 media_preparing
progress_message 給使用者看的進度文案

5.3 刪除

POST /api/music/voice-profile/delete
Content-Type: application/json

{ "voice_id": "vp_2026…" }
{ "success": true, "message": "", "data": { "voice_id": "vp_2026…", "status": "deleted" } }

6. 用音色翻唱(核心介面)

POST /api/music/voice-profile/cover
Content-Type: application/json

一次提交 生成 2 首(與普通生成一致)。

6.1 兩種場景

場景 觸發條件 說明
A 翻唱指定歌曲 傳了 song_clip_id 用你的音色去唱這首歌(旋律 / 節奏 / 段落沿用原曲,人聲換成你的音色)
B 用音色唱新歌 不傳 song_clip_id 只給音色 + 歌詞(選填)+ 風格要求,讓模型按風格全新創作旋律後演唱

回應裡的 resolved_scene 會回顯 cover 或 sing,便於你確認走了哪條路。

6.2 請求欄位

欄位 型別 必填 預設 說明
model string 是 — 對客模型名,見 §6.5。不傳會報 model is required(HTTP 500)
voice_id string 二選一 — 音色 ID(vp_…),必須 status=ready
voice_clip_id string 二選一 — 也可以直接用音色的 clip id;兩者都傳時以 voice_id 為準
song_clip_id string 否 空 要翻唱的那首歌的 clip id(song_id)。不傳 = 場景 B
lyrics string 否 空 歌詞全文,逐字上送,不做改寫 / 截斷;≤ 3000 字元
cover_requirements string 否 空 翻唱要求(自然語言),例如「咬字更清晰一些」。會拼進固定提示詞
style_requirements string 否 空 風格要求,例如「慢速民謠,木吉他」
title string 否 空 這兩首成品在工作區裡的標題(會影響後續查詢回傳的 song_title)
negative_tags string 否 空 排除風格,例如 電子, 說唱;≤ 1000 字元
vocal_gender string 否 空 m / f(也接受 male / female);空 = 不限
duration number 否 空 期望時長(秒),1–480 的整數;空 = 平台自動。平台實際最短約 30 秒:填更小的值實測也只能得到約 30 秒的成品
audio_weight number 否 0.85 音訊參考度,0–1 小數。越高越貼近音色樣本
style_weight number 否 空 風格影響,0–1 小數
weirdness_constraint number 否 空 創意度,0–1 小數(介面若用百分比,請先除以 100)
variety number 否 空 多樣性,0–4 的整數(不是百分比),僅 v6 系列支援
max_mode boolean 否 false Max Mode,價格 ×2
client_request_id string 否 空 提交標識,寫入伺服器任務記錄用於排查(不做去重)

建議同時帶上請求標頭 X-Create-Ui-Client-Request-Id: <同一個提交 id>:它才會寫進伺服器任務記錄,是事後排查的主鍵(詳見 §1.5)。

量綱提醒:audio_weight / style_weight / weirdness_constraint 是 0–1 小數,variety 是 0–4 整數,duration 是秒。混用會被拒絕或效果異常。

場景 B 的歌詞選填(模型會自行處理),但要唱指定內容時請務必傳 lyrics。

6.3 回應

{
  "code": 200,
  "message": "success",
  "data": {
    "voice_id": "vp_20260926081712557959800Z5gvlt",
    "voice_clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
    "song_clip_id": "5b773e9a-a035-4134-a4a4-29c9961d3ccb",
    "resolved_scene": "cover",
    "model": "suno-v6",
    "audio_weight": 0.85,
    "clips": [
      {
        "song_id": "0f2a…",
        "status": "processing",
        "song_title": "",
        "model_version": "suno-v6",
        "audio_url": "",
        "play_url": "https://media.suno-api.io/play/0f2a…?expires=…&signature=…",
        "lyrics": "",
        "description": "【任務】這是一次翻唱。…(伺服器固定結構段 + 你填寫的翻唱/風格要求)"
      },
      {
        "song_id": "7c91…",
        "status": "processing",
        "model_version": "suno-v6",
        "audio_url": ""
      }
    ],
    "source_updates": []
  }
}

要點:

  1. 成品標識用 clips[].song_id(本介面不回 id 欄位)。
  2. 立刻拿到 2 個 song_id,此時 status 還是 processing(只代表已受理),audio_url 為空;要輪詢到 completed 才能下載。play_url 是平台試聽串流,提交階段就可能出現,會過期。
  3. description 是伺服器最終上送的提示詞(固定結構段 + 你填寫的 cover_requirements / style_requirements),排查效果時很好用。
  4. source_updates 是伺服器的素材處理結果,客戶端可忽略。
  5. 你傳的 title 會寫進伺服器任務記錄,在後續查詢裡體現為 song_title;提交回包的 clips[].song_title 通常為空,屬正常。

6.4 錯誤

{ "error": { "message": "該音色不存在或已被刪除(voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
HTTP message 原因
500 model is required 請求體缺 model(這是通路選擇的必需欄位)
400 voice_id is required and must be a ready voice 沒傳 voice_id,或傳的是佔位值 / 未就緒音色
400 該音色不存在或已被刪除(voice_id=vp_xxx)… 音色已刪除、不存在,或不屬於當前帳號。請改用其他可用音色,或重新建立一個音色
400 該音色已被刪除(voice_id=vp_xxx)… 用 voice_clip_id 直傳素材時,這段素材對應的音色已刪除;處理方式同上
400 voice is not ready yet (status=processing) 音色還在建立中,等 ready 再試
400 song_clip_id must be a real completed clip song_clip_id 是佔位符 / 未完成
400 song_clip_id must differ from the voice clip 翻唱對象不能等於音色樣本本身
400 audio_weight must be a number between 0 and 1 滑桿量綱用錯(傳了百分數)
400 duration must be an integer between 1 and 480 seconds 時長不是 1–480 的整數
400 vocal_gender must be one of m, f, male, female 性別取值非法
400 variety must be an integer between 0 and 4 / variety is only supported on v6 models 多樣性取值或模型不支援

餘額不足會在提交階段直接回傳計費錯誤,不會產生半成品任務。

6.5 可用模型(對客模型名)

對客模型名 說明
suno-v6 預設,推薦
suno-v6-wild 更奔放
suno-v6-mini 輕量

請使用對客模型名(上面的名字)。chirp-* 是平台內部名稱,不要直接使用。


7. 查詢進度

7.1 批量查詢(推薦)

POST /api/music/query
Content-Type: application/json

{ "model": "suno-v6", "song_ids": "id1,id2" }
[
  {
    "song_id": "0f2a…",
    "song_title": "兩隻老虎",
    "status": "completed",
    "audio_url": "https://suno-api-hk-1437223057.cos.ap-hongkong.myqcloud.com/assets/0f2a…-mp3.mp3",
    "cover_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
    "duration": 115.15,
    "model_version": "suno-v6",
    "generation_type": "voice_profile_cover",
    "play_url": "https://media.suno-api.io/play/…?expires=…&signature=…",
    "lyrics": "[Verse 1]…",
    "prompt": "[Verse 1]…",
    "description": "【任務】這是一次翻唱。…(伺服器最終提示詞)",
    "style_tags": "…",
    "created_at": "2026-09-25T18:19:09.918Z",
    "video_url": ""
  }
]
欄位 說明
status 見 §1.7;completed 才算完成
audio_url mp3 直鏈,completed 後才有值
cover_url 封面位址
duration 實際時長(秒)
generation_type 音色翻唱產出的歌固定是 voice_profile_cover
play_url 帶簽名試聽位址(會過期)
song_title 任務標題(即你提交時傳的 title;不傳則由伺服器兜底)
lyrics / prompt 成品歌詞 / 歌詞原文
description 伺服器最終上送的提示詞(含固定結構段)
style_tags 最終風格描述
created_at ISO 8601 字串(注意與詳情介面的 Unix 秒不同)

輪詢建議:間隔 5–10 秒,總逾時 10–15 分鐘(冷帳號最慢實測約 4 分半;極少數更久)。不要用 audio_url 是否空來判斷完成,要用 status。

相容提示:本介面以 song_id 為標識;早期個別回應裡出現過 id 欄位,穩妥寫法是 row.song_id || row.id。

7.2 單首詳情

GET /api/music/songs/{song_id}
{
  "success": true,
  "data": {
    "song_id": "0f2a…",
    "title": "兩隻老虎",
    "status": "completed",
    "generation_type": "voice_profile_cover",
    "model": "suno-v6",
    "duration": 115.15,
    "audio_url": "https://…/assets/0f2a…-mp3.mp3",
    "image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
    "wav_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=wav",
    "video_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=video",
    "created_at": 1790411012,
    "completed_at": 1790411500,
    "parameters": {
      "prompt": "[Verse 1]…",
      "style_tags": "…",
      "title": "兩隻老虎",
      "model": "suno-v6",
      "generation_type": "voice_profile_cover",
      "source_song_id": "5b773e9a-…"
    },
    "parameter_retention": {
      "core_parameters_available": true,
      "extended_parameters_available": false,
      "sources": ["suno_tasks"],
      "unavailable_fields": ["negative_tags", "vocal_gender", "style_weight", "weirdness_constraint"]
    }
  }
}

7.3 我的作品列表

GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=關鍵詞

分頁參數:p(頁碼,從 1 開始)/ page_size(每頁筆數,相容寫法 ps)。可選 status、q(標題關鍵詞)。預設按建立時間倒序。

{
  "success": true,
  "data": {
    "page": 1,
    "page_size": 20,
    "total": 42,
    "items": [
      {
        "song_id": "0f2a…",
        "title": "兩隻老虎",
        "status": "completed",
        "generation_type": "voice_profile_cover",
        "model": "suno-v6",
        "duration": 115.15,
        "audio_url": "https://…/assets/0f2a…-mp3.mp3",
        "image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
        "created_at": 1790411012,
        "completed_at": 1790411500
      }
    ]
  }
}

用 generation_type=voice_profile_cover 可以把「用音色翻唱產出的歌」與其他生成結果區分開。


8. 下載成品

8.1 直接取 mp3(推薦,免費)

三種都可以,任選其一:

  1. 用查詢結果裡的 audio_url(物件儲存直鏈,最省事)。
  2. GET /api/music/download?song_id=<id>&kind=mp3 → 直接回傳音訊位元組流(Content-Disposition 已帶檔名)。
  3. POST /api/music/download-url(拿帶簽名的臨時位址)。
curl -sS -L "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=mp3" \
  -H "Authorization: Bearer $API_KEY" -o song.mp3

kind 取值:mp3(等價於 song)/ playback(串流播放)/ wav / video / lyrics / timestamped_lyrics。 其中 timestamped_lyrics(.lrc)目前僅部分歌曲支援,失敗時請改用 時間軸歌詞 API 自行生成。 回應直接是檔案位元組流,Content-Type 與 Content-Disposition(檔名)都已帶好;GET /api/music/songs/{song_id} 回傳的 wav_url / video_url 就是帶上 kind=wav|video 的同一個入口。

8.2 轉 wav / 取歌詞 / 中繼資料(計費)

POST /api/music/free2
Content-Type: application/json

{ "song_ids": ["0f2a…"], "files": ["mp3", "wav", "lyrics"] }
{
  "success": true,
  "data": {
    "songs": [
      { "song_id": "0f2a…", "files": [ { "type": "mp3", "url": "https://…" }, { "type": "wav", "url": "https://…" } ] }
    ],
    "requested_songs": 1,
    "succeeded_songs": 1,
    "price": 0.2
  }
}

9. 價格查詢

GET /api/pricing/catalog

公開介面,無需驗證。對客要顯示的單價都在 data.catalog.meta(字串):

鍵 含義 當前值
generation_price 普通生成 0.6
voice_generation_price 音色翻唱基準價 1.2
max_mode_factor Max Mode 倍率 2
enhanced_upload_price 強化複製 / 強化上傳 10
voice_auto_verify_price 人聲自動驗證 5
voice_long_term_clone_price 長期音色複製 5

價格會在後台調整,請即時讀取,不要寫死在客戶端。翻唱實際扣費 = voice_generation_price ×(max_mode 為真時再 × max_mode_factor)。


10. 限制與注意事項

  1. 上傳體積:≤ 10MB(伺服器可接受的上限更高,但入口閘道在 10MiB 處會截斷超大請求體,表現為「被 Suno 拒絕」,請自行先攔)。
  2. 樣本時長:最少 6 秒,建議 10–60 秒;過短會被平台拒絕。
  3. 樣本內容:乾淨人聲,避免與已有錄音高度相似(會被曲庫比對拒絕)。
  4. 文字上限:lyrics ≤ 3000 字元,style_requirements / negative_tags / title 建議分別 ≤ 1000 / 1000 / 100 字元(風格與翻唱要求會拼進提示詞,合計請控制在 3000 字元內)。
  5. 歌詞不做改寫:傳入什麼就唱什麼(逐字一致),不做本地截斷。
  6. 每首歌固定 2 首產出,不要假設回傳 1 首。
  7. 來源音訊永久保留:音色刪除了來源音訊也不清理;這是為了保證後續翻唱可用與合規追溯。
  8. 音色必須 ready:processing 的音色不能用於翻唱。
  9. 請求逾時:冷帳號首次提交最慢實測約 4 分半,客戶端逾時請設 ≥ 6 分鐘。翻唱不做請求級去重,逾時後請先核對是否已經產生新歌(§1.5),再決定是否重發。
  10. 音色歸屬:音色按建立者歸屬管理;翻唱只接受已就緒(ready)且未刪除的音色。不存在、已刪除或不屬於本帳號,都會回傳 400:該音色不存在或已被刪除(voice_id=…)。

11. 常見問題(FAQ)

Q1. 建立音色會不會扣錢? 普通建立與「從已有音訊建立」都免費;只有翻唱(1.2 元 / MAX 2.4 元)和強化複製(預設 10 元)計費。

Q2. 音色樣本能不能用帶伴奏的成品歌? 不建議。帶音樂或與曲庫已有錄音高度相似會被平台拒絕(This audio matches an existing recording in our catalog.)。請用純人聲乾聲。

Q3. 為什麼提交翻唱後 audio_url 是空的? 提交只代表已受理,status 還是 processing。輪詢 /api/music/query 到 status=completed 後才有可播 / 可下載位址。

Q4. 場景 B(不傳 song_clip_id)要不要傳歌詞? 選填。要唱指定內容就傳 lyrics;不傳時模型會自行處理,但可控性較差。

Q5. 客戶自己上傳的音訊能直接當音色嗎? 可以:create 的 file_url 形態,或先上傳成歌曲再呼叫 create-from-clip。

Q6. 失敗了會退錢嗎? 被直接拒絕的請求(參數錯誤 / 平台報錯)實測不扣費;已受理但最終失敗的任務會退回預扣金額。終態失敗時任務回傳 status=failed 與 error_message。

Q7. 刪除音色後,之前用它生成的歌還能聽嗎? 能。刪除只影響這個音色能否繼續用於新的翻唱。

Q8. 一次能翻唱多長的歌? duration 傳 1–480 秒;不傳則由平台按原曲 / 素材自動決定。注意平台的成品最短約 30 秒:填小於 30 秒的值,實測出來仍是 29.96 / 29.76 秒。


附錄 A:完整呼叫範例(Node.js,含輪詢與下載)

const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };

// ① 建立音色(multipart)
async function createVoice(filePath, title) {
  const fd = new FormData();
  fd.set("file", new Blob([await (await import("node:fs/promises")).readFile(filePath)], { type: "audio/mpeg" }), "my-voice.mp3");
  fd.set("file_name", "my-voice.mp3");
  fd.set("source_file_name", "my-voice.mp3");
  fd.set("title", title);
  fd.set("client_request_id", `vp-create-${Date.now()}`);
  const res = await fetch(`${BASE}/api/music/voice-profile/create`, { method: "POST", headers: H, body: fd });
  const body = await res.json();
  if (!body.success) throw new Error(body.message);
  return body.data; // { voice_id, status, audio_url, ... }
}

// ② 翻唱
async function cover(voiceId, songClipId, lyrics) {
  const submissionId = `vp-cover-${Date.now()}`;
  const res = await fetch(`${BASE}/api/music/voice-profile/cover`, {
    method: "POST",
    headers: { ...H, "Content-Type": "application/json", "X-Create-Ui-Client-Request-Id": submissionId },
    body: JSON.stringify({
      model: "suno-v6",
      voice_id: voiceId,
      song_clip_id: songClipId || "",
      lyrics: lyrics || "",
      style_requirements: "慢速民謠,木吉他",
      audio_weight: 0.85,
      max_mode: false,
      client_request_id: submissionId,
    }),
  });
  const body = await res.json();
  if (body.error) throw new Error(body.error.message);
  return body.data; // { resolved_scene, clips: [{ song_id, status }] }
}

// ③ 輪詢到完成(5 秒一次,最多 15 分鐘)
async function waitUntilCompleted(songIds) {
  const deadline = Date.now() + 15 * 60 * 1000;
  while (Date.now() < deadline) {
    const res = await fetch(`${BASE}/api/music/query`, {
      method: "POST",
      headers: { ...H, "Content-Type": "application/json" },
      body: JSON.stringify({ model: "suno-v6", song_ids: songIds.join(",") }),
    });
    const songs = await res.json(); // 裸陣列
    if (songs.every((s) => s.status === "completed" || s.status === "failed")) return songs;
    await new Promise((r) => setTimeout(r, 5000));
  }
  throw new Error("timeout waiting for cover");
}

// ④ 下載
async function download(songId, outPath) {
  const res = await fetch(`${BASE}/api/music/download?song_id=${encodeURIComponent(songId)}&kind=mp3`, { headers: H });
  if (!res.ok) throw new Error(`download failed: ${res.status}`);
  (await import("node:fs/promises")).writeFile(outPath, Buffer.from(await res.arrayBuffer()));
}

const voice = await createVoice("./my-voice.mp3", "我的音色");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\n歌詞…");
const ids = result.clips.map((c) => c.song_id);
const songs = await waitUntilCompleted(ids);
for (const [i, s] of songs.entries()) {
  if (s.status === "completed") await download(s.song_id, `./out-${i}.mp3`);
}

附錄 B:變更記錄

日期 變更
2026-10-15 刪除語意寫實(§5.3);翻唱對「已刪除 / 越權」的 voice_id 會在預扣費前直接 400,錯誤表與 FAQ 同步(配合當日上線的音色刪除門禁)
2026-10-13 開頭補充「為什麼推薦本鏈路」說明:據大量使用者實際評測,本鏈路生成歌曲的原聲還原度較高
2026-09-26 首版:建立音色(三種入參)/ 已有音訊建立 / 列表詳情刪除 / 音色翻唱(A、B 場景)/ 進度查詢 / 下載 / 價格讀取,含實測證據
下一篇風格增強 API

取得 API 金鑰

註冊後即可在主控台建立 API 金鑰。每次生成 0.6 元可得 2 首歌,下載不限次數,且不需要手機號碼。

取得 API 金鑰 回到總覽