文件
音樂生成
使用 Suno V5/V5.5 文字生成音樂——支援人聲、歌詞和風格控制。提供兩種 API 格式:一種是單次呼叫的同步端點,會等待曲目生成完成;另一種是提交並輪詢的非同步 API 組合(支援簽章 webhook),適合正式環境使用。
端點:POST /v1/audio/music(同步,先介紹),以及 POST /v1/audio/music/jobs + GET /v1/audio/music/jobs/{id}(非同步,建議用於正式環境)。每個請求會生成 兩首曲目;生成約需 1–3 分鐘。價格:使用 suno-v5 時,每次生成請求 $0.09;使用 suno-v5-5 時,每次 $0.09——兩首曲目只收取一次費用,從預付餘額扣除,生成失敗不會收費。
快速入門(同步)
傳入 prompt 和 Suno 模型。請求會保持連線,直到兩首曲目準備就緒,然後回傳永久網址。
import requests
# Synchronous: one request blocks until the tracks are ready (1-3 min).
resp = requests.post(
"https://api.kunavo.com/v1/audio/music",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"model": "suno-v5",
"prompt": "upbeat lofi hip hop for late-night coding, mellow piano",
"instrumental": True,
},
timeout=600, # generation can take a few minutes
)
# Suno returns ~2 tracks per request.
for track in resp.json()["data"]:
print(track["url"], track.get("image_url"))參數
| 參數 | 類型 | 備註 |
|---|---|---|
model | 字串(必填) | 音樂模型 slug——suno-v5 或 suno-v5-5。 |
prompt | 字串(必填) | 音樂描述(或自訂模式中的歌詞)。 |
instrumental | bool | true = 無人聲。預設為 false。 |
customMode | bool | Suno 進階模式——明確指定結構/歌詞/風格。 |
style | string | 風格/曲風提示,例如「lofi, jazz, chill」。 |
title | string | 曲目標題。 |
webhook_url | string (https) | 僅限非同步——在此推送已簽署的終端事件。請參閱 Webhooks。 |
音樂模型
| 識別碼(slug) | 提供者 | 備註 |
|---|---|---|
suno-v5 | Suno | Suno V5——支援人聲、歌詞和風格融合。 |
suno-v5-5 | Suno | Suno V5.5——最新版本,保真度更高,生成內容更長。 |
請查看 /models,取得即時清單和每次呼叫的價格。
非同步 API(提交 + 輪詢)
端點:POST /v1/audio/music/jobs + GET /v1/audio/music/jobs/{id}。與非同步影片 API 的模式相同,因此相同的輪詢/webhook 程式碼可用於不同媒體類型。
同步端點會讓 HTTP 連線保持數分鐘——用於指令碼很方便,但在行動裝置上不可靠。非同步端點組合會立即回傳 msc_* ID;你可以輪詢 GET /v1/audio/music/jobs/{id},直到 status 成為 completed 或 failed。模型、價格和永久 CDN URL 均相同。
import requests, time
# 1. Submit — returns immediately with a msc_ task id. No long-lived connection.
submit = requests.post(
"https://api.kunavo.com/v1/audio/music/jobs",
headers={
"Authorization": f"Bearer {API_KEY}",
# Optional: retrying with the same key inside ~24h returns the
# original task rather than submitting again.
"Idempotency-Key": "my-song-uuid",
},
json={
"model": "suno-v5",
"prompt": "dreamy synthwave with a driving bassline",
"title": "Midnight Drive",
},
timeout=60,
).json()
task_id = submit["id"] # "msc_abc..."
status = submit["status"] # "queued"
# 2. Poll until terminal. Recommended cadence: 5s, backing off to 30s.
while status not in ("completed", "failed"):
time.sleep(5)
r = requests.get(
f"https://api.kunavo.com/v1/audio/music/jobs/{task_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=30,
).json()
status = r["status"]
if status == "failed":
raise RuntimeError(r["error"]["message"])
for track in r["output"]["tracks"]:
print(track["url"])回應格式
| 欄位 | 類型 | 備註 |
|---|---|---|
id | string | 以 msc_ 為前綴的工作 ID。 |
object | string | "music". |
status | string | queued | in_progress | completed | failed。 |
model | string | 你提交的模型 slug。 |
created_at | int | 我們接受提交時的 Unix 秒數。 |
completed_at | int | null | 進入終止狀態時的 Unix 秒數——待處理時為 null。 |
expires_at | int | 結果清除前的 Unix 秒數(約 30 天)。 |
progress | int | 終止前為 0,之後為 100。 |
output | object | null | 完成時為 {tracks[], archived}。 |
output. | array | 每個項目:{url, stream_url, image_ |
error | object | null | 失敗時為 {code, message}。 |
標頭與慣例
Idempotency-Key(選用,≤128 個字元)——在同一帳戶中使用相同金鑰重複提交時,會回傳原有工作,而不會建立重複項目。POST /v1/audio/music/jobs在新提交時回傳 202 Accepted;若冪等性金鑰重播結果,則回傳 200 OK。GET以擁有者為範圍:查詢屬於其他帳戶的工作時會回傳 404。- 建議輪詢間隔:5 秒,逐步增加至 30 秒。
Webhook
提交時傳入 webhook_url(https),工作終止時,Kunavo 會立即在此傳送簽署的 music.completed/music.failed 事件,並在失敗時重試且逐步延長間隔。事件的 data 欄位與上方 GET 回應的內容完全相同。
# Pass webhook_url on submit to be pushed a signed event on terminal —
# instead of (or alongside) polling:
# {"model": "suno-v5", "prompt": "...", "webhook_url": "https://you.com/hook"}
#
# Verify the HMAC signature on your receiver (Flask shown):
import hmac, hashlib
from flask import request, abort
def verify(secret: str) -> dict:
ts = request.headers["X-Kunavo-Webhook-Timestamp"]
sig = request.headers["X-Kunavo-Webhook-Signature"] # "sha256=<hex>"
raw = request.get_data(as_text=True)
expected = "sha256=" + hmac.new(
secret.encode(), f"{ts}.{raw}".encode(), hashlib.sha256
).hexdigest()
if not hmac.compare_digest(expected, sig):
abort(401)
return request.get_json()
# Event body:
# { "id": "evt_...", "object": "event",
# "type": "music.completed" | "music.failed",
# "created_at": 1700000000,
# "data": { ...the GET /v1/audio/music/jobs/{id} payload... } }{timestamp}.{rawBody} 計算的 HMAC-SHA256,並以 X-Kunavo-Webhook-Signature: sha256=<hex> 傳送。演算法與影片 webhook 相同,因此一個驗證器即可處理兩者。如何選擇
| 同步 /v1/ | 非同步 /v1/ | |
|---|---|---|
| 最適合 | 一次性指令碼、Notebook | 正式環境、行動裝置、webhook |
| 網路 | 連線保持 1–3 分鐘 | 幾秒內提交;輪詢或接收推送 |
| 失敗復原 | 失去回應 = 失去結果 | 在 expires_at 到期前,隨時重新查詢該 ID |
| Webhook | — | 已簽署的 music. |
回應與儲存
每首曲目的 url(音訊)和 image_url(封面圖)都是 永久 的 files.kunavo.com 連結——Kunavo 會將每個結果封存至自己的 CDN,因此不同於原始 Suno URL,這些連結永不過期。stream_url 是 Suno 的原始串流連結(方便立即播放)。每首曲目也會出現在 /app/assets 中。
output.archived 會是 false,而網址會改用 Suno 的暫時連結(約 24 小時後到期)——遇到這種情況時,請自行重新託管。