API di testi con timestamp
Descrizione dell'endpoint
I testi con timestamp recuperano i timestamp a livello di parola di un brano, per mostrare il testo sincronizzato.
Endpoint: POST /api/lyrics/timeline
Fatturazione: Gratuito (richiesta di sola lettura; non viene addebitato nulla e non viene creata alcuna attività di generazione).
Formato di ritorno: l'array della timeline viene restituito direttamente — non esiste un involucro data / success; una volta analizzato è semplicemente un array.
Parametri della richiesta
Headers
| Parametro | Tipo | Obbligatorio | Note |
|---|---|---|---|
| Authorization | string | sì | Bearer YOUR_API_KEY |
| Content-Type | string | sì | application/json |
Parametri del corpo
| Parametro | Tipo | Obbligatorio | Predefinito | Note |
|---|---|---|---|---|
| model | string | no | suno-v6 | Nome del modello lato cliente: suno-v6, suno-v6-wild o suno-v6-mini |
| song_id | string | sì | - | ID del brano |
Esempio di richiesta
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"
}'
Risposta
Qui sotto c'è una risposta reale di produzione per un brano di 189,6 secondi in suno-v6 (quella chiamata aveva 69 segmenti; qui sono conservati solo i primi e gli ultimi):
[
{
"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
}
]
Riferimento dei campi
| Campo | Tipo | Note |
|---|---|---|
word |
string | Il testo di questo segmento; contiene i propri a capo: una riga di testo per segmento con \n in fondo e \n\n tra i paragrafi, quindi compaiono voci fatte solo di spazi |
start_s |
number | Ora di inizio del segmento in secondi (con decimali) |
end_s |
number | Ora di fine del segmento in secondi. Il end_s dell'ultimo segmento equivale praticamente alla durata del brano |
success |
boolean | Se questo segmento è stato allineato correttamente |
p_align |
number | Confidenza dell'allineamento; dalle misurazioni resta stabile su 0.99 |
Cose a cui fare attenzione
- Non cercare un involucro. La risposta è l'array stesso, non
{"data": ...}, e non ha nemmeno un camposuccess. - All'inizio può non esserci alcun segmento. In un brano con sola introduzione, la misurazione ha mostrato il primo segmento solo al secondo 15, e
start_snon è garantito partire da0; per il karaoke gestisci tu lo spazio iniziale. - Vengono restituiti anche marcatori strumentali e di struttura, in forme come
[Intro],[Verse 1],Instrumental: soft arpeggiating piano, …e[End], anch'essi con tempi parola per parola. Prima di costruire sottotitoli, filtra questi segmenti in base al[iniziale o aInstrumental; altrimenti le descrizioni dell'arrangiamento verranno mostrate come testo. - È per parola, non per riga. La stessa riga di testo viene spesso divisa in più segmenti e va unita in righe tramite
\n; l'ora di una riga è lostart_sdel suo primo segmento. - Il numero di segmenti dipende dal brano; non dare per scontata una quantità fissa (misurato: un brano di 189,6 secondi aveva 69 segmenti e un corpo di risposta di circa 6,5 KB).
Generare un file .lrc
Questo endpoint restituisce solo i dati della timeline; non restituisce un file direttamente. Quando serve un .lrc, costruisci le righe dallo start_s restituito nel formato [mm:ss.cc] (il campo word contiene i propri a capo: dividi per riga e salta le righe vuote). Per un esempio vedi «Come ottenere il testo con timestamp (.lrc)» nell'API di download e anteprima dei media dei brani.
Qui sotto c'è una versione completa con il filtro dei marcatori strumentali e di struttura (un segmento per riga, utile per verificare prima la forma dei dati):
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)
Note di compatibilità
La documentazione precedente usava un esempio con l'oggetto involucro { success, song_id, lyrics: [...] }. La documentazione attuale prende come riferimento l'array della timeline restituito direttamente.
Ottenere una chiave API
Dopo la registrazione puoi creare una chiave API nella console. Ogni generazione costa 0,6 ¥ e restituisce 2 brani, i download sono illimitati e non serve un numero di telefono.
Ottieni chiave API Torna alla panoramica