API voor het kalibreren van tijdstempels van songteksten
Dit is geen spraakherkenning. De tekst gebruikt altijd de originele songtekst die u aanlevert; wij zetten alleen elk teken op het juiste moment — dus "verkeerd gehoorde tekens die de tekst laten verschuiven" gebeurt nooit.
Beschrijving van het endpoint
Het lijnt bestaande songtekst uit op audio en levert tijdstempels per regel en per teken — voor teken-voor-teken markering zoals karaoke, meescrollende tekst en ondertitelgeneratie.
Endpoint: POST /api/music/lyrics-align
Authenticatie: zie Authenticatie; de header is Authorization: Bearer YOUR_API_KEY
Facturering: per aanroep (momenteel standaard 0,1 ¥ per aanroep); staat bij een nummer van het platform de stemseparatie aangevinkt, dan wordt nog één keer het platformtarief "stem/begeleiding scheiden" gerekend. Het werkelijk gefactureerde bedrag volgt de prijsconfiguratie in de back-office.
Gemiddelde duur: 5–15 seconden (afhankelijk van de audiolengte en of de stem ter plaatse gescheiden moet worden)
Waarom kalibreren nodig is: tijdstempels van de generatiekant zijn niet altijd nauwkeurig
De API voor songteksten met tijdstempels geeft de tijdstempels per woord rechtstreeks van de generatiekant terug, en die zijn niet nauwkeurig:
- reprises, dichte harmonieën, rap en lange tonen wijken vaak in hun geheel af of verschuiven losse tekens;
- bij sommige nummers ontbreekt een stuk aan het begin (bijvoorbeeld een pure intro, waarbij het eerste fragment pas rond de vijftien seconden begint);
- sommige regels zijn moeilijk aan een duidelijk tijdsanker te koppelen.
De kalibratie doet de tijduitlijning opnieuw op basis van de songtekst die u zelf aanlevert: alleen de tijd wordt gecorrigeerd, nooit de tekst — geschikt voor situaties waarin "klopt het precies" telt (tekenmarkering als in KTV, ondertitels per teken, meezingbeoordeling).
Aanbevolen aanpak (drie stappen, beste resultaat)
- Isoleer eerst de stem (stem/begeleiding scheiden) en lijn alleen het stemspoor uit — begeleiding en harmonieën storen dan niet meer. Meetbasis: bij een regel-voor-regelvergelijking "volledige mix vs stemspoor" van hetzelfde nummer verschilden 5 van de 28 regels meer dan 0,25 s (de grootste 2,64 s); twee onafhankelijke engines verschilden gemiddeld 0,239 s op het stemspoor en 0,508 s op de volledige mix — bijna half zoveel overeenstemming. Voor tekenmarkering (KTV/ondertitels) is aanzetten dus aan te raden. (De exacte winst wordt opnieuw gemeten met de nieuwe engine.)
- Lever de volledige songtekst: het hele nummer, regel voor regel, één op één met de audio. Een ontbrekende zin of sectie verschuift alle volgende regels; zet geen tijdstempels zoals
[00:23.82]in de tekst (die worden automatisch genegeerd). - Bij een nummer van het platform volstaat
vocal_separate: trueen doen wij "scheiden + uitlijnen" in één stap.
Drie manieren om het te gebruiken
| Gebruik | Wat u stuurt | Herkomst van de tekst | Stemseparatie |
|---|---|---|---|
| Extern nummer · openbare URL | audio_url + tekst |
U levert die aan | ❌ Niet ondersteund |
| Extern nummer · directe upload van een lokaal bestand (nieuw 2026-10) | audio_object_key + tekst |
U levert die aan | ❌ Niet ondersteund |
| Nummer van het platform (op deze site gegenereerd) | song_id |
Wij halen die uit het nummerrecord | ✅ Optioneel |
Hoe de parameters samenhangen (hier gaat het het vaakst mis — lees goed)
song_idsturen → route nummer van het platform: stuur niet ooklyrics/audio_url/audio_object_key;audio_urlofaudio_object_keysturen → route extern nummer: slechts één van de twee, en geensong_id;vocal_separatewerkt alleen bij nummers van het platform; bij een extern nummer wordt het geweigerd (de audio is niet bij ons, dus niet te scheiden).
Nieuw: directe upload van een lokaal bestand (de audio gaat niet via onze servers)
Gebruik dit als de audio op uw machine staat en u die niet eerst naar uw eigen openbare opslag wilt sturen. Twee stappen:
POST /api/music/lyrics-align/upload-ticketmetfile_name/file_size/content_typeen u krijgt eenput_url(ondertekende URL zonder langlevende inloggegevens) en eenobject_key;- Doe een
PUTvan het bestand naarput_urlen neem decontent_typeuit het antwoord ongewijzigd over (die hoort bij de handtekening; één gewijzigd teken geeft 403); - Stuur bij het uitlijnen
audio_object_keyin plaats vanaudio_url.
De inloggegevens zijn eenmalig: zodra het uitlijnen klaar is (gelukt of mislukt) verwijdert de server het object, en dezelfde sleutel opnieuw gebruiken geeft een fout.
Nieuw: de songtekst is nu optioneel
Vroeger was tekst verplicht bij een extern nummer. Nu mag die ontbreken: de server doet eerst een herkenning en gebruikt de herkende tekst als songtekst.
De keerzijde moet duidelijk zijn: de tekst volgt dan het herkenningsresultaat, dus losse tekens kunnen fout zijn. Zulke antwoorden zijn gemarkeerd met
lyrics_source: "asr", confidence: "low" en in warnings[]
{"code":"no_reference_lyrics"}.
Voor tekenmarkering / KTV levert u altijd de originele tekst aan.
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 |
|---|---|---|---|---|
| song_id | string | een van twee | - | ID van het nummer van het platform |
| lyrics | string | nee | - | Originele tekst, regels gescheiden door \n. Mag nu ontbreken |
| audio_url | string | een van twee voor extern | - | Audioadres; moet openbaar downloadbaar zijn |
| audio_object_key | string | een van twee voor extern | - | Sleutel van het direct geüploade object (roep eerst /lyrics-align/upload-ticket aan) |
| vocal_separate | boolean | nee | false |
Of eerst de stem gescheiden wordt (alleen nummers van het platform) |
| language | string | nee | automatisch | Chinese / English enz.; zonder waarde afgeleid uit de tekst |
| granularity | string | nee | both |
both / line (geen uitvoer per teken) / word |
| sections | string | nee | keep |
keep houdt markeringen zoals [Chorus] (ze horen niet bij de tijdlijn) / drop |
| format | string | nee | json |
json / lrc / lrc-word (de laatste twee geven ook de tekst lrc en lrc_word) |
Limieten
| Punt | Limiet |
|---|---|
| Audiolengte | ≤ 6 minuten (langer geeft een fout en volledige terugbetaling) |
| Audiobron | Moet openbaar downloadbaar zijn; adressen die een sessie vereisen worden niet geaccepteerd |
| Tekstformaat | Platte tekst, regels met \n; sectiemarkeringen zoals [Verse] of 【主歌】 blijven staan maar horen niet bij de tijdlijn |
| Batches | Eén nummer per aanroep; voor meerdere zelf lussen |
| Resultaat bewaren | Dit endpoint bewaart niets; bewaar het resultaat zelf |
Voorbeeldverzoeken
Extern nummer (tekst + audioadres)
curl -X POST https://www.suno-api.io/api/music/lyrics-align \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"lyrics": "Ik loop door koude straten\nDe nachtwind strijkt langs mijn ogen\nDe tijd stroomt als water",
"audio_url": "https://your-bucket.example.com/song.mp3"
}'
Nummer van het platform (zonder separatie)
curl -X POST https://www.suno-api.io/api/music/lyrics-align \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"song_id": "17e52af7-b5df-4877-a98a-dce94e0e6aa2"}'
Nummer van het platform + stemseparatie (aanbevolen voor karaoke)
curl -X POST https://www.suno-api.io/api/music/lyrics-align \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"song_id": "17e52af7-b5df-4877-a98a-dce94e0e6aa2", "vocal_separate": true}'
Antwoord
Succesantwoord
{
"success": true,
"lyrics_source": "platform",
"vocal_separate": false,
"coverage": 0.935,
"exact": 196,
"fuzzy": 4,
"total": 214,
"lines": [
{
"text": "Ik loop door koude straten",
"start": 21.66,
"end": 24.06,
"chars": [
{"char": "I", "start": 21.66, "end": 21.74, "word": true},
{"char": "k", "start": 21.98, "end": 22.22, "word": true}
]
}
]
}
Referentie van velden
| Veld | Type | Opmerkingen |
|---|---|---|
success |
boolean | Of het verzoek is gelukt |
lyrics_source |
string | platform = tekst uit het nummer van het platform; user = tekst van u; asr = geen tekst gegeven en de tekens komen uit herkenning |
vocal_separate |
boolean | Of er deze keer stemseparatie is gebruikt |
confidence |
string | high / low (altijd low bij lyrics_source=asr) |
warnings[] |
array | Meldingen over degradatie; zonder tekst met {"code":"no_reference_lyrics"} |
coverage |
number | Kwaliteit van de uitlijning: aandeel tekens met een duidelijk tijdsanker (0–1) |
exact / fuzzy / total |
number | exacte tekens / homofone tekens / geldige teksttekens |
lines[].text |
string | Eén tekstregel, teken voor teken gelijk aan uw origineel |
lines[].start / end |
number | begin- en eindtijd van de regel (seconden) |
lines[].section |
boolean | of de regel een sectiemarkering is (true = geen tijd, geen markering) |
lines[].chars[] |
array | tijden per teken: char, start/end in seconden, word of het bij de tijdlijn hoort (leestekens zijn false) |
words[] |
array | platte lijst per teken: text / start / end / line; niet bij granularity=line |
lrc |
string | LRC-tekst per regel (alleen bij format=lrc of lrc-word) |
lrc_word |
string | uitgebreide teken-LRC met <mm:ss.xx>-tags in de regel (alleen bij format=lrc-word) |
Hoe u coverage gebruikt (drie niveaus)
| coverage | Aangeraden gebruik |
|---|---|
| ≥ 0,9 | tekenmarkering (karaoke) kan |
| 0,8 – 0,9 | teken en hele regel gemengd, of alleen hele regels markeren en het teken als indicatie gebruiken |
| < 0,8 | alleen regelmarkering (reprises, dichte harmonieën, dialecten en rap vallen vaak laag uit) |
Status en doorlooptijden
| Scenario | Gemeten tijd |
|---|---|
| Nummer van het platform · zonder separatie | ongeveer 4,5 s |
| Nummer van het platform · separatie (stemspoor al aanwezig) | ongeveer 11 s |
| Nummer van het platform · separatie (ter plaatse nodig) | ongeveer 25 s, tot ongeveer 1 minuut |
| Extern nummer · tekst + audioadres | ongeveer 5–15 s (afhankelijk van de lengte) |
De limiet van één serverrun is 8 minuten; zet de client-timeout op 120 seconden of meer.
Foutantwoorden
{
"success": false,
"message": "音频超过 6 分钟上限(实际 7.2 分钟)"
}
| Scenario | Wordt er afgerekend? |
|---|---|
| Geen audio (geen van de drie) | Niets afgerekend (verwerking niet gestart) |
audio_url en audio_object_key tegelijk |
Niets afgerekend (verwerking niet gestart) |
| Het direct geüploade object staat er nog niet / is verwijderd | Niets afgerekend (verwerking niet gestart) |
Ongeldige granularity / sections / format |
Niets afgerekend (verwerking niet gestart) |
| Nummer van het platform bestaat niet / hoort niet bij het account | Niets afgerekend (verwerking niet gestart) |
| Parameters ontbreken of zijn ongeldig | Niets afgerekend (verwerking niet gestart) |
| Audio langer dan de limiet van 6 minuten | Volledige terugbetaling |
| Audio niet downloadbaar (geen openbaar adres / login nodig) | Volledige terugbetaling |
| Geen tekst gegeven en serverherkenning mislukt | Volledige terugbetaling |
| Stemseparatie aangevinkt maar geen bruikbaar stemspoor | Volledige terugbetaling (inclusief de separatiekosten) |
| Storing of timeout van de uitlijndienst | Volledige terugbetaling |
Uitgangspunt: geen eindresultaat betekent volledige terugbetaling. Er wordt pas afgerekend als de tekentijdstempels echt worden teruggegeven, en de terugbetaling gebeurt automatisch, zonder aanvraag.
Facturering
| Post | Wanneer afgerekend | Opmerkingen |
|---|---|---|
| Kalibratie van de teksttijdstempels (basis) | bij elke aanroep | per aanroep (momenteel standaard 0,1 ¥); het werkelijke bedrag volgt de prijsconfiguratie in de back-office |
| Transcriptietoeslag | alleen als u geen tekst aanlevert | de server moet eerst spraakherkenning draaien, een kostenpost die het niveau "met tekst" niet heeft, dus apart geprijsd |
| Stemseparatie (optioneel, alleen nummers van het platform) | bij aangevinkt vocal_separate |
één keer tegen het bestaande tarief "stem/begeleiding scheiden" en samen met dit endpoint afgerekend |
De combinatie:
te betalen = basisprijs + (geen tekst aangeleverd ? transcriptietoeslag : 0) + (separatie aangevinkt ? separatieprijs : 0)
De stemseparatie wordt maar één keer gerekend: hebt u het nummer al gescheiden en is het stemspoor direct beschikbaar, dan rekent dit endpoint het; moet er ter plaatse gescheiden worden, dan rekent de separatiestap het.
Volledig voorbeeld (Python)
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://www.suno-api.io"
def align_lyrics(song_id=None, lyrics=None, audio_url=None, vocal_separate=False):
payload = {}
if song_id:
payload["song_id"] = song_id
payload["vocal_separate"] = vocal_separate
else:
payload["lyrics"] = lyrics
payload["audio_url"] = audio_url
r = requests.post(
f"{BASE}/api/music/lyrics-align",
headers={"Authorization": f"Bearer {API_KEY}"},
json=payload,
timeout=600,
)
data = r.json()
if not data.get("success"):
raise RuntimeError(data.get("message"))
return data
res = align_lyrics(song_id="17e52af7-b5df-4877-a98a-dce94e0e6aa2", vocal_separate=True)
print("kwaliteit van de uitlijning coverage =", res["coverage"])
for line in res["lines"]:
print(f'{line["start"]:7.2f} {line["text"]}')
# karaoke per teken: elk teken in line["chars"] heeft eigen start / end
Veelgestelde vragen
V: Is de uitvoer per teken of per regel?
A: Beide. lines[].start is per regel, lines[].chars[].start / end per teken; de speler pakt wat nodig is.
V: Waarom is de teruggegeven tekst identiek aan wat ik stuurde? A: Dat is het ontwerp. We herkennen niet en herschrijven niet, we lijnen alleen de tijd uit — de tekst kan dus nooit "in een typefout gecorrigeerd" worden.
V: De coverage is hoog maar het klinkt toch licht verschoven.
A: De fout per teken ligt meestal in de orde van tientallen milliseconden; is het hele nummer een vaste hoeveelheid verschoven, dan staat er waarschijnlijk stilte aan het begin van de audio: knip die weg en probeer opnieuw.
V: Waarom werkte de separatie net wel en zegt het nu "stemspoor niet beschikbaar"? A: Separatie-resultaten zijn kortlevende tijdelijke adressen (gemeten: verlopen na ongeveer een half uur). Dan probeert het endpoint automatisch opnieuw te scheiden; lukt dat alsnog niet, dan volgt volledige terugbetaling. "Nu scheiden, later kalibreren" is dus onbetrouwbaar: doe beide in dezelfde flow.
V: Moet ik een nummer van het platform zelf eerst scheiden?
A: Nee. Met vocal_separate: true controleren we of het nummer al een stemspoor heeft; is er geen bruikbaar spoor, dan geven we een fout en betalen terug in plaats van de volledige mix door te schuiven.
V: Kan het in batches? A: Eén nummer per verzoek. Voor batches lussen; elke aanroep wordt normaal gefactureerd, dus lokaal cachen is aan te raden.
V: Wordt het resultaat bewaard? A: Dit endpoint bewaart niets; bewaar de teruggegeven waarde zelf (regel- en tekentijdstempels staan in het antwoord).
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