API voor songteksten met tijdstempels
Beschrijving van het endpoint
Songteksten met tijdstempels halen tijdstempels op woordniveau van een nummer op, voor gesynchroniseerde weergave van de tekst.
Endpoint: POST /api/lyrics/timeline
Facturering: Gratis (alleen-lezen opvraag; er wordt niets afgerekend en er wordt geen generatieopdracht aangemaakt).
Retourformaat: de tijdlijnarray wordt direct teruggegeven — er is geen data- / success-omhulsel; na het parsen is het gewoon een array.
Verzoekparameters
Headers
| Parameter | Type | Verplicht | Opmerkingen |
|---|---|---|---|
| Authorization | string | ja | Bearer YOUR_API_KEY |
| Content-Type | string | ja | application/json |
Body-parameters
| Parameter | Type | Verplicht | Standaard | Opmerkingen |
|---|---|---|---|---|
| model | string | nee | suno-v6 | Modelnaam voor klanten: suno-v6, suno-v6-wild of suno-v6-mini |
| song_id | string | ja | - | Nummer-ID |
Voorbeeldverzoek
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"
}'
Antwoord
Hieronder staat een echte productie-respons voor een nummer van 189,6 seconde in suno-v6 (die aanroep had 69 segmenten; hier zijn alleen de eerste en laatste bewaard):
[
{
"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
}
]
Veldreferentie
| Veld | Type | Opmerkingen |
|---|---|---|
word |
string | De tekst van dit segment; het bevat zijn eigen regeleinden: één songtekstregel per segment met \n aan het einde en \n\n tussen alinea's, waardoor er items met alleen spaties voorkomen |
start_s |
number | Starttijd van het segment in seconden (met decimalen) |
end_s |
number | Eindtijd van het segment in seconden. De end_s van het laatste segment is vrijwel de duur van het nummer |
success |
boolean | Of dit segment goed is uitgelijnd |
p_align |
number | Betrouwbaarheid van de uitlijning; gemeten stabiel op 0.99 |
Waar u op moet letten
- Zoek geen omhulsel. Het antwoord is de array zelf, niet
{"data": ...}, en er is ook geensuccess-veld. - Aan het begin kan een segment ontbreken. Bij een nummer met een pure intro liet de meting het eerste segment pas op seconde 15 zien, en
start_sbegint niet gegarandeerd bij0; voor karaoke behandelt u de opening zelf. - Ook instrumentale en structuurmarkeringen worden teruggegeven, in vormen als
[Intro],[Verse 1],Instrumental: soft arpeggiating piano, …en[End], eveneens met tijden per woord. Filter deze segmenten vóór het bouwen van ondertitels weg op een leidende[of opInstrumental; anders verschijnen arrangementbeschrijvingen als songtekst. - Het is per woord, niet per regel. Dezelfde regel tekst wordt vaak in meerdere segmenten opgesplitst en moet met
\ntot regels worden samengevoegd; de tijd van een regel is destart_svan het eerste segment. - Het aantal segmenten hangt van het nummer af; ga niet uit van een vast aantal (gemeten: een nummer van 189,6 seconde had 69 segmenten en een antwoordbody van ongeveer 6,5 KB).
Een .lrc-bestand genereren
Dit endpoint geeft alleen tijdlijngegevens terug; het geeft geen bestand direct terug. Hebt u .lrc nodig, bouw dan regels uit de teruggegeven start_s in de notatie [mm:ss.cc] (het veld word bevat eigen regeleinden — splits per regel en sla lege regels over). Zie voor een voorbeeld "Tijdstempel-songteksten (.lrc) ophalen" in de API voor het downloaden en beluisteren van nummer-media.
Hieronder staat een volledige versie met filtering van instrumentale en structuurmarkeringen (één segment per regel, handig om eerst de vorm van de data te controleren):
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)
Compatibiliteitsopmerkingen
De eerdere documentatie gebruikte een voorbeeld met het omhulobject { success, song_id, lyrics: [...] }. De huidige documentatie gaat uit van de direct teruggegeven tijdlijnarray.
Een API-sleutel aanvragen
Maak na je registratie een API-sleutel aan in de console. Elke generatie kost ¥0,6 en levert 2 nummers op, downloads zijn onbeperkt en een telefoonnummer is niet nodig.
API-sleutel ophalen Terug naar overzicht