文件

文件

音樂生成

使用 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"))
Suno 生成曲目需時 1–3 分鐘。同步端點會在伺服器端保持連線,直到曲目準備就緒,輪詢時間上限約為 6 分鐘,因此請將 HTTP 用戶端的逾時時間設為相近值(≥600s)。若生成時間更長、流量屬於正式環境,或使用行動/不穩定網路,建議使用非同步 API——提交請求會在數秒內回應。

參數

參數類型備註
model字串(必填)音樂模型 slug——suno-v5 或 suno-v5-5。
prompt字串(必填)音樂描述(或自訂模式中的歌詞)。
instrumentalbooltrue = 無人聲。預設為 false。
customModeboolSuno 進階模式——明確指定結構/歌詞/風格。
stylestring風格/曲風提示,例如「lofi, jazz, chill」。
titlestring曲目標題。
webhook_urlstring (https)僅限非同步——在此推送已簽署的終端事件。請參閱 Webhooks。

音樂模型

識別碼(slug)提供者備註
suno-v5SunoSuno V5——支援人聲、歌詞和風格融合。
suno-v5-5SunoSuno 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"])

回應格式

欄位類型備註
idstring以 msc_ 為前綴的工作 ID。
objectstring"music".
statusstringqueued | in_progress | completed | failed。
modelstring你提交的模型 slug。
created_atint我們接受提交時的 Unix 秒數。
completed_atint | null進入終止狀態時的 Unix 秒數——待處理時為 null。
expires_atint結果清除前的 Unix 秒數(約 30 天)。
progressint終止前為 0,之後為 100。
outputobject | null完成時為 {tracks[], archived}。
output.tracksarray每個項目:{url, stream_url, image_url}。url / image_url 是永久 CDN 連結。
errorobject | 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/audio/music非同步 /v1/audio/music/jobs
最適合一次性指令碼、Notebook正式環境、行動裝置、webhook
網路連線保持 1–3 分鐘幾秒內提交;輪詢或接收推送
失敗復原失去回應 = 失去結果在 expires_at 到期前,隨時重新查詢該 ID
Webhook—已簽署的 music.completed/music.failed

回應與儲存

每首曲目的 url(音訊)和 image_url(封面圖)都是 永久 的 files.kunavo.com 連結——Kunavo 會將每個結果封存至自己的 CDN,因此不同於原始 Suno URL,這些連結永不過期。stream_url 是 Suno 的原始串流連結(方便立即播放)。每首曲目也會出現在 /app/assets 中。

如果封存失敗,output.archived 會是 false,而網址會改用 Suno 的暫時連結(約 24 小時後到期)——遇到這種情況時,請自行重新託管。

接下來可以查看