API für zeitgestempelte Songtexte
Beschreibung des Endpunkts
Zeitgestempelte Songtexte liefern Zeitstempel auf Wortebene für einen Song — für die synchronisierte Anzeige des Textes.
Endpunkt: POST /api/lyrics/timeline
Abrechnung: Kostenlos (reine Leseabfrage; es wird nichts berechnet und kein Generierungsauftrag erzeugt).
Rückgabeformat: Das Timeline-Array wird direkt zurückgegeben — es gibt keine data- / success-Hülle; nach dem Parsen ist es einfach ein Array.
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 |
|---|---|---|---|---|
| model | string | nein | suno-v6 | Modellname für Kunden: suno-v6, suno-v6-wild oder suno-v6-mini |
| song_id | string | ja | - | Song-ID |
Beispielanfrage
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"
}'
Antwort
Unten steht eine echte Produktionsantwort für einen 189,6 Sekunden langen Song in suno-v6 (dieser Aufruf hatte 69 Segmente; hier sind nur die ersten und letzten erhalten):
[
{
"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
}
]
Feldreferenz
| Feld | Typ | Hinweise |
|---|---|---|
word |
string | Der Text dieses Segments; er enthält eigene Zeilenumbrüche: eine Textzeile pro Segment mit \n am Segmentende und \n\n zwischen Absätzen, daher gibt es Einträge, die nur aus Leerzeichen bestehen |
start_s |
number | Startzeit des Segments in Sekunden (mit Nachkommastellen) |
end_s |
number | Endzeit des Segments in Sekunden. Das end_s des letzten Segments entspricht praktisch der Songlänge |
success |
boolean | Ob dieses Segment erfolgreich ausgerichtet wurde |
p_align |
number | Konfidenz der Ausrichtung; gemessen stabil bei 0.99 |
Wichtige Hinweise
- Suchen Sie keine Hülle. Die Antwort ist das Array selbst, nicht
{"data": ...}, und es gibt auch keinsuccess-Feld. - Am Anfang kann ein Segment fehlen. Bei einem Song mit reinem Intro zeigte die Messung das erste Segment erst bei Sekunde 15, und
start_sbeginnt nicht garantiert bei0; für Karaoke behandeln Sie die Lücke am Anfang selbst. - Auch Instrumental- und Strukturmarker werden zurückgegeben, in Formen wie
[Intro],[Verse 1],Instrumental: soft arpeggiating piano, …und[End], ebenfalls mit Zeitangaben Wort für Wort. Filtern Sie diese Segmente vor dem Bau von Untertiteln über das führende[oderInstrumentalheraus; sonst erscheinen Arrangement-Beschreibungen als Songtext. - Es ist wortweise, nicht zeilenweise. Dieselbe Textzeile wird oft in mehrere Segmente zerlegt und muss per
\nzu Zeilen zusammengeführt werden; die Zeit einer Zeile ist dasstart_sihres ersten Segments. - Die Segmentzahl hängt vom Song ab; gehen Sie nicht von einer festen Anzahl aus (gemessen: ein 189,6-Sekunden-Song hatte 69 Segmente und einen Antwort-Body von etwa 6,5 KB).
Eine .lrc-Datei erzeugen
Dieser Endpunkt liefert nur Timeline-Daten; er liefert keine Datei direkt. Wenn Sie .lrc brauchen, bauen Sie die Zeilen aus dem zurückgegebenen start_s im Format [mm:ss.cc] (das Feld word enthält eigene Zeilenumbrüche — nach Zeilen aufteilen und leere Zeilen überspringen). Ein Beispiel steht unter „Wie man zeitgestempelte Songtexte (.lrc) erhält“ in der API zum Herunterladen und Anhören von Song-Medien.
Unten steht eine vollständige Variante mit Filterung der Instrumental- und Strukturmarker (ein Segment pro Zeile, gut geeignet, um zuerst die Datenform zu prüfen):
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)
Kompatibilitätshinweise
Die frühere Dokumentation verwendete ein Beispiel mit dem Hüllobjekt { success, song_id, lyrics: [...] }. Die aktuelle Dokumentation betrachtet das direkt zurückgegebene Timeline-Array als maßgeblich.
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