時間軸歌詞 API

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

介面說明

時間軸歌詞用於取得歌曲逐詞級別的時間戳,可用於歌詞同步顯示。

介面位址: POST /api/lyrics/timeline

計費: 免費(唯讀查詢,不扣費、不產生生成任務)。

返回格式: 直接返回時間軸陣列,沒有 data / success 外層包裝,解析後就是一個陣列。

請求參數

Headers

參數名 型別 必填 說明
Authorization string 是 Bearer YOUR_API_KEY
Content-Type string 是 application/json

請求主體參數

參數名 型別 必填 預設值 說明
model string 否 suno-v6 對客模型名:suno-v6、suno-v6-wild 或 suno-v6-mini
song_id string 是 - 歌曲 ID

請求範例

curl -X POST https://www.suno-api.io/api/lyrics/timeline \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-v6",
    "song_id": "clip_id"
  }'

回應結果

下面是生產環境一首 189.6 秒、suno-v6 歌曲的真實返回(該次共 69 段,這裡只保留首尾幾段):

[
  {
    "word": "[Intro]\n\n\n[",
    "start_s": 15,
    "end_s": 15.04277,
    "success": true,
    "p_align": 0.99
  },
  {
    "word": "Instrumental: ",
    "start_s": 15.04704,
    "end_s": 15.10264,
    "success": true,
    "p_align": 0.99
  },
  {
    "word": "End]\n\n\n",
    "start_s": 189.16974,
    "end_s": 189.654,
    "success": true,
    "p_align": 0.99
  }
]

欄位說明

欄位 型別 說明
word string 該片段對應的文字,自帶換行:一行歌詞一段、段尾帶 \n,段落之間是 \n\n,因此會出現只含空白的內容
start_s number 片段開始時間,單位秒(帶小數)
end_s number 片段結束時間,單位秒。最後一段的 end_s 基本等於歌曲時長
success boolean 該片段是否對齊成功
p_align number 對齊信心度,實測穩定在 0.99

使用注意

  1. 不要找外層包裝。返回就是陣列本身,不是 {"data": ...},也沒有 success 欄位。
  2. 開頭可能沒有片段。純前奏的歌曲實測從第 15 秒才出現第一個片段,start_s 不保證從 0 開始;做卡拉 OK 時請自己處理開頭的空檔。
  3. 器樂與結構標記也會返回,形如 [Intro]、[Verse 1]、Instrumental: soft arpeggiating piano, …、[End],並且同樣逐詞給出時間。做歌詞字幕前建議按 [ 開頭或 Instrumental 過濾掉這些片段,否則會把編曲描述當成歌詞顯示。
  4. 是逐詞而不是逐行。同一句歌詞常被拆成多個片段,需要按 \n 合併成行;一行的時間取該行第一個片段的 start_s。
  5. 段數與歌曲有關,不要假設固定段數(實測 189.6 秒的歌為 69 段,回應體約 6.5 KB)。

產生 .lrc 檔案

本介面只返回時間軸資料,不直接返回檔案。需要 .lrc 時,用返回的 start_s 按 [mm:ss.cc] 格式拼行即可(word 欄位自帶換行,按行拆開,空行跳過)。範例見 歌曲媒體下載與試聽 API 的「時間軸歌詞(.lrc)怎麼取」。

下面是帶器樂/結構標記過濾的完整寫法(一段一行,適合先驗證資料形態):

import re

SKIP = re.compile(r"^\[.*\]$|^Instrumental:")

def to_lrc(segments):
    lines = []
    for seg in segments:
        if not seg.get("success", True):
            continue
        text = (seg.get("word") or "").strip()
        if not text or SKIP.match(text):
            continue
        cs = int(max(0.0, float(seg["start_s"])) * 100 + 0.5)
        lines.append(f"[{cs // 6000:02d}:{(cs % 6000) // 100:02d}.{cs % 100:02d}]{text}")
    return "\n".join(lines)

相容說明

舊版文件中曾使用 { success, song_id, lyrics: [...] } 包裝物件範例。當前新版文件以直接返回時間軸陣列為準。

下一篇音樂商用授權書 API

取得 API 金鑰

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

取得 API 金鑰 回到總覽