API zur Kalibrierung von Songtext-Zeitstempeln
Das ist keine Spracherkennung. Der Text übernimmt immer den Songtext, den Sie liefern; wir setzen nur jedes Zeichen an den richtigen Zeitpunkt — deshalb kann es nie passieren, dass „falsch gehörte Zeichen den Text verschieben".
Beschreibung des Endpunkts
Er richtet vorhandenen Songtext am Audio aus und liefert Zeitstempel pro Zeile und pro Zeichen — für Karaoke-Zeichenhervorhebung, mitscrollenden Text und Untertitel.
Endpunkt: POST /api/music/lyrics-align
Authentifizierung: siehe Authentifizierung; der Header lautet Authorization: Bearer YOUR_API_KEY
Abrechnung: pro Aufruf (derzeit standardmäßig 0,1 ¥ pro Aufruf); ist bei einem Plattform-Song die Stimmseparatierung angehakt, wird zusätzlich einmal der Preis „Stimme/Begleitung trennen" der Plattform berechnet. Der tatsächlich berechnete Betrag folgt der Preis-Konfiguration im Backoffice.
Durchschnittsdauer: 5–15 Sekunden (je nach Audiolänge und ob die Stimme vor Ort getrennt werden muss)
Warum kalibriert werden muss: Zeitstempel der Generierungsseite sind nicht immer exakt
Die API für zeitgestempelte Songtexte liefert direkt die Wort-für-Wort-Zeitstempel der Generierungsseite, und sie sind ungenau:
- Wiederholungen, dichte Harmonien, Rap und lange Töne driften oft insgesamt oder verschieben einzelne Zeichen;
- manchen Songs fehlt ein Stück am Anfang (etwa ein reines Intro, dessen erster Abschnitt erst in der Mitte der ersten Minute beginnt);
- manche Zeilen lassen sich schlecht an einen klaren Zeitanker binden.
Die Kalibrierung macht die Zeitausrichtung auf Basis Ihres eigenen Songtexts neu: nur die Zeit wird korrigiert, nie der Text — passend für Fälle, in denen „passt es genau" zählt (KTV-Zeichenhervorhebung, Zeichen-Untertitel, Mitsing-Bewertung).
Empfohlenes Vorgehen (drei Schritte, beste Ergebnisse)
- Zuerst die Stimme extrahieren (Stimme/Begleitung trennen) und nur die Stimmspur ausrichten — Begleitung und Harmonien stören dann nicht mehr. Messgrundlage: im Zeilenvergleich „Vollmix vs. Stimmspur" desselben Songs unterschieden sich 5 von 28 Zeilen um mehr als 0,25 s (die größte um 2,64 s); zwei unabhängige Motoren wichen auf der Stimmspur im Mittel um 0,239 s und auf dem Vollmix um 0,508 s ab — fast halb so viel Übereinstimmung. Für Zeichenhervorhebung (KTV/Untertitel) empfiehlt sich daher, sie einzuschalten. (Der genaue Gewinn wird mit dem neuen Motor neu gemessen.)
- Vollständigen Songtext liefern: den ganzen Song, Zeile für Zeile, eins zu eins zum Audio. Eine fehlende Zeile oder Passage verschiebt alle folgenden Zeilen; schreiben Sie keine Zeitstempel wie
[00:23.82]in den Text (sie werden automatisch ignoriert). - Bei einem Plattform-Song genügt
vocal_separate: true, und wir erledigen „Trennen + Ausrichten" in einem Schritt.
Drei Nutzungsarten
| Nutzung | Was Sie senden | Herkunft des Textes | Stimmseparatierung |
|---|---|---|---|
| Externer Song · öffentliche URL | audio_url + Text |
Sie liefern ihn | ❌ Nicht unterstützt |
| Externer Song · direkter Upload einer lokalen Datei (neu 2026-10) | audio_object_key + Text |
Sie liefern ihn | ❌ Nicht unterstützt |
| Plattform-Song (auf dieser Seite erzeugt) | song_id |
Wir nehmen ihn aus dem Song-Datensatz | ✅ Optional |
Wie die Parameter zusammenhängen (hier passieren die meisten Fehler — bitte genau lesen)
song_idsenden → Plattform-Song: senden Sie nicht zusätzlichlyrics/audio_url/audio_object_key;audio_urloderaudio_object_keysenden → externer Song: nur eines von beiden, und keinsong_id;vocal_separatewirkt nur bei Plattform-Songs; bei einem externen Song wird es abgelehnt (das Audio liegt nicht bei uns, es kann nicht getrennt werden).
Neu: direkter Upload einer lokalen Datei (das Audio läuft nicht über unsere Server)
Nutzen Sie das, wenn das Audio auf Ihrem Rechner liegt und Sie es nicht erst in Ihren eigenen öffentlichen Speicher legen möchten. Zwei Schritte:
POST /api/music/lyrics-align/upload-ticketmitfile_name/file_size/content_typeliefert eineput_url(signierte URL ohne langlebige Zugangsdaten) und einenobject_key;- Laden Sie die Datei per
PUTaufput_urlund übernehmen Sie dencontent_typeaus der Antwort unverändert (er ist Teil der Signatur; ein geändertes Zeichen ergibt 403); - Senden Sie beim Ausrichten
audio_object_keystattaudio_url.
Die Zugangsdaten sind einmalig: nach dem Ausrichten (Erfolg oder Fehler) löscht der Server das Objekt, und derselbe Key führt zu einem Fehler.
Neu: der Songtext ist jetzt optional
Früher war bei externen Songs Text Pflicht. Jetzt kann er fehlen: der Server führt eine Erkennung aus und nutzt den erkannten Text als Songtext.
Der Preis dafür muss klar sein: der Text richtet sich dann nach dem Erkennungsergebnis, einzelne Zeichen können falsch sein. Solche Antworten sind gekennzeichnet mit
lyrics_source: "asr", confidence: "low" und in warnings[]
{"code":"no_reference_lyrics"}.
Für Zeichenhervorhebung / KTV liefern Sie bitte immer den Originaltext.
Anfrageparameter
Headers
| Parameter | Typ | Erforderlich | Hinweise |
|---|---|---|---|
| Authorization | string | ja | Bearer YOUR_API_KEY |
| Content-Type | string | ja | application/json |
Body-Parameter
| Parameter | Typ | Erforderlich | Standard | Hinweise |
|---|---|---|---|---|
| song_id | string | eines von zwei | - | ID des Plattform-Songs |
| lyrics | string | nein | - | Originaltext, Zeilen durch \n getrennt. Kann jetzt entfallen |
| audio_url | string | eines von zwei für extern | - | Audioadresse; muss öffentlich herunterladbar sein |
| audio_object_key | string | eines von zwei für extern | - | Key des direkt hochgeladenen Objekts (vorher /lyrics-align/upload-ticket aufrufen) |
| vocal_separate | boolean | nein | false |
Ob zuerst die Stimme getrennt wird (nur Plattform-Songs) |
| language | string | nein | automatisch | Chinese / English usw.; ohne Angabe aus dem Text geschätzt |
| granularity | string | nein | both |
both / line (keine Zeichenausgabe) / word |
| sections | string | nein | keep |
keep behält Marker wie [Chorus] (sie zählen nicht zur Timeline) / drop |
| format | string | nein | json |
json / lrc / lrc-word (die letzten beiden liefern zusätzlich die Texte lrc und lrc_word) |
Grenzen
| Punkt | Grenze |
|---|---|
| Audiolänge | ≤ 6 Minuten (mehr ergibt einen Fehler und volle Erstattung) |
| Audioquelle | Muss öffentlich herunterladbar sein; Adressen, die eine Anmeldung brauchen, werden nicht akzeptiert |
| Textformat | Reiner Text, Zeilen mit \n; Marker wie [Verse] oder 【主歌】 bleiben erhalten, zählen aber nicht zur Timeline |
| Stapel | Ein Song pro Aufruf; für mehrere selbst schleifen |
| Ergebnisspeicherung | Dieser Endpunkt persistiert nichts; speichern Sie das Ergebnis selbst |
Beispielanfragen
Externer Song (Text + Audioadresse)
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": "Ich gehe durch die kalten Straßen\nDer Nachtwind streift meine Augen\nDie Zeit fließt wie das Wasser",
"audio_url": "https://your-bucket.example.com/song.mp3"
}'
Plattform-Song (ohne Trennung)
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"}'
Plattform-Song + Stimmseparatierung (für Karaoke empfohlen)
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}'
Antwort
Erfolgsantwort
{
"success": true,
"lyrics_source": "platform",
"vocal_separate": false,
"coverage": 0.935,
"exact": 196,
"fuzzy": 4,
"total": 214,
"lines": [
{
"text": "Ich gehe durch die kalten Straßen",
"start": 21.66,
"end": 24.06,
"chars": [
{"char": "I", "start": 21.66, "end": 21.74, "word": true},
{"char": "c", "start": 21.98, "end": 22.22, "word": true}
]
}
]
}
Feldreferenz
| Feld | Typ | Hinweise |
|---|---|---|
success |
boolean | Ob die Anfrage erfolgreich war |
lyrics_source |
string | platform = Text aus dem Plattform-Song; user = Text von Ihnen; asr = kein Text geliefert, Text stammt aus der Erkennung |
vocal_separate |
boolean | Ob diesmal die Stimmseparatierung durchlaufen wurde |
confidence |
string | high / low (bei lyrics_source=asr immer low) |
warnings[] |
array | Hinweise auf Abstriche; ohne Text mit {"code":"no_reference_lyrics"} |
coverage |
number | Ausrichtungsqualität: Anteil der Zeichen mit klarem Zeitanker (0–1) |
exact / fuzzy / total |
number | exakte Zeichen / Homophon-Zeichen / gültige Textzeichen |
lines[].text |
string | Eine Textzeile, Zeichen für Zeichen identisch mit Ihrem Original |
lines[].start / end |
number | Start und Ende der Zeile (Sekunden) |
lines[].section |
boolean | Ob die Zeile ein Abschnittsmarker ist (true = keine Zeit, keine Hervorhebung) |
lines[].chars[] |
array | Zeiten pro Zeichen: char, start/end in Sekunden, word ob es zur Timeline zählt (Satzzeichen sind false) |
words[] |
array | flache Zeichenliste: text / start / end / line; entfällt bei granularity=line |
lrc |
string | LRC-Text pro Zeile (nur bei format=lrc oder lrc-word) |
lrc_word |
string | erweitertes Zeichen-LRC mit <mm:ss.xx>-Tags in der Zeile (nur bei format=lrc-word) |
Wie coverage zu nutzen ist (drei Stufen)
| coverage | Empfohlene Nutzung |
|---|---|
| ≥ 0,9 | Zeichenhervorhebung (Karaoke) möglich |
| 0,8 – 0,9 | Zeichen und ganze Zeilen gemischt, oder nur ganze Zeilen hervorheben und Zeichen als Anhaltspunkt |
| < 0,8 | nur Zeilenhervorhebung (Wiederholungen, dichte Harmonien, Dialekte und Rap fallen oft niedrig aus) |
Status und Laufzeiten
| Szenario | Gemessene Dauer |
|---|---|
| Plattform-Song · ohne Trennung | ca. 4,5 s |
| Plattform-Song · Trennung (Stimmspur vorhanden) | ca. 11 s |
| Plattform-Song · Trennung (vor Ort nötig) | ca. 25 s, bis zu ca. 1 Minute |
| Externer Song · Text + Audioadresse | ca. 5–15 s (je nach Länge) |
Das Limit eines Serverlaufs beträgt 8 Minuten; setzen Sie den Client-Timeout auf 120 Sekunden oder mehr.
Fehlerantworten
{
"success": false,
"message": "音频超过 6 分钟上限(实际 7.2 分钟)"
}
| Szenario | Berechnet? |
|---|---|
| Kein Audio (keines der drei Felder) | Keine Berechnung (Verarbeitung nicht gestartet) |
audio_url und audio_object_key zugleich |
Keine Berechnung (Verarbeitung nicht gestartet) |
| Direkt hochgeladenes Objekt noch nicht da / schon gelöscht | Keine Berechnung (Verarbeitung nicht gestartet) |
Ungültige granularity / sections / format |
Keine Berechnung (Verarbeitung nicht gestartet) |
| Plattform-Song existiert nicht / gehört nicht zum Konto | Keine Berechnung (Verarbeitung nicht gestartet) |
| Parameter fehlen oder sind ungültig | Keine Berechnung (Verarbeitung nicht gestartet) |
| Audio über der 6-Minuten-Grenze | Volle Erstattung |
| Audio nicht herunterladbar (nicht öffentlich / Anmeldung nötig) | Volle Erstattung |
| Kein Text geliefert und serverseitige Erkennung fehlgeschlagen | Volle Erstattung |
| Stimmseparatierung angehakt, aber keine nutzbare Stimmspur | Volle Erstattung (inklusive Trennkosten) |
| Fehler oder Timeout des Ausrichtungsdienstes | Volle Erstattung |
Grundsatz: ohne Endergebnis volle Erstattung. Berechnet wird erst, wenn tatsächlich Zeichen-Zeitstempel zurückkommen, und die Erstattung läuft automatisch, ohne Antrag.
Abrechnung
| Posten | Wann berechnet | Hinweise |
|---|---|---|
| Kalibrierung der Songtext-Zeitstempel (Basis) | bei jedem Aufruf | pro Aufruf (derzeit standardmäßig 0,1 ¥); der tatsächliche Betrag folgt der Preis-Konfiguration im Backoffice |
| Transkriptionszuschlag | nur ohne gelieferten Text | Der Server muss erst eine Spracherkennung laufen lassen — Kosten, die die Stufe „mit Text" nicht hat, deshalb separat bepreist |
| Stimmseparatierung (optional, nur Plattform-Songs) | bei angehaktem vocal_separate |
einmal zum bestehenden Preis „Stimme/Begleitung trennen" berechnet und zusammen mit diesem Endpunkt abgerechnet |
Die Kombination:
zu zahlen = Basispreis + (kein Text geliefert ? Transkriptionszuschlag : 0) + (Trennung angehakt ? Trennungspreis : 0)
Die Trennkosten fallen nur einmal an: haben Sie den Song schon getrennt und die Stimmspur liegt direkt vor, berechnet sie dieser Endpunkt; muss vor Ort getrennt werden, berechnet sie der Trennungsschritt.
Vollständiges Beispiel (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("Ausrichtungsqualität coverage =", res["coverage"])
for line in res["lines"]:
print(f'{line["start"]:7.2f} {line["text"]}')
# Zeichen-Karaoke: jedes Zeichen in line["chars"] hat eigenes start / end
Häufige Fragen
F: Ist die Ausgabe pro Zeichen oder pro Zeile?
A: Beides. lines[].start ist pro Zeile, lines[].chars[].start / end pro Zeichen; der Player nimmt, was er braucht.
F: Warum ist der zurückgegebene Text identisch mit meinem? A: Das ist so gewollt. Wir erkennen nicht um und schreiben nicht um, wir richten nur die Zeit aus — der Text kann also nie „in Tippfehler korrigiert" werden.
F: coverage ist hoch, es klingt aber trotzdem leicht versetzt.
A: Der Zeichenfehler liegt meist im Bereich von Zehntel Millisekunden bis einigen Dutzend Millisekunden; ist der ganze Song um einen festen Wert versetzt, liegt am Anfang des Audios wahrscheinlich eine Stille — schneiden Sie sie ab und versuchen Sie es erneut.
F: Warum ging die Trennung gerade noch, und jetzt heißt es „Stimmspur nicht verfügbar"? A: Trennergebnisse sind kurzlebige temporäre Adressen (gemessen: Ablauf nach etwa einer halben Stunde). Dann versucht der Endpunkt automatisch erneut zu trennen; scheitert das ebenfalls, gibt es volle Erstattung. „Erst trennen, später kalibrieren" ist also unzuverlässig — machen Sie beides im selben Ablauf.
F: Muss ich einen Plattform-Song selbst vorher trennen?
A: Nein. Mit vocal_separate: true prüfen wir, ob der Song bereits eine Stimmspur hat; gibt es keine nutzbare, melden wir einen Fehler und erstatten, statt den Vollmix durchzureichen.
F: Geht das in Stapeln? A: Ein Song pro Anfrage. Für Stapel schleifen Sie; jeder Aufruf wird normal berechnet, daher empfiehlt sich lokales Caching.
F: Wird das Ergebnis gespeichert? A: Dieser Endpunkt persistiert nichts; speichern Sie den Rückgabewert selbst (Zeilen- und Zeichen-Zeitstempel stehen in der Antwort).
API-Schlüssel erhalten
Erstellen Sie nach der Anmeldung einen API-Schlüssel in der Konsole. Jede Generierung kostet 0,6 ¥ und liefert 2 Tracks, Downloads sind unbegrenzt und eine Telefonnummer ist nicht erforderlich.
API-Schlüssel holen Zurück zur Übersicht