API de paroles horodatées
Description du point d'accès
Les paroles horodatées récupèrent les horodatages au niveau du mot d'un morceau, pour un affichage synchronisé des paroles.
Point d'accès : POST /api/lyrics/timeline
Facturation : Gratuit (requête en lecture seule ; rien n'est facturé et aucune tâche de génération n'est créée).
Format de retour : le tableau de la timeline est renvoyé directement — il n'y a pas d'enveloppe data / success ; une fois analysé, c'est simplement un tableau.
Paramètres de la requête
Headers
| Paramètre | Type | Obligatoire | Remarques |
|---|---|---|---|
| Authorization | string | oui | Bearer YOUR_API_KEY |
| Content-Type | string | oui | application/json |
Paramètres du corps
| Paramètre | Type | Obligatoire | Par défaut | Remarques |
|---|---|---|---|---|
| model | string | non | suno-v6 | Nom de modèle côté client : suno-v6, suno-v6-wild ou suno-v6-mini |
| song_id | string | oui | - | ID du morceau |
Exemple de requête
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"
}'
Réponse
Ci-dessous une réponse réelle de production pour un morceau de 189,6 secondes en suno-v6 (cet appel comptait 69 segments ; seuls les premiers et les derniers sont conservés ici) :
[
{
"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
}
]
Référence des champs
| Champ | Type | Remarques |
|---|---|---|
word |
string | Le texte de ce segment ; il contient ses propres retours à la ligne : une ligne de paroles par segment avec \n en fin de segment et \n\n entre les paragraphes, d'où des entrées uniquement composées d'espaces |
start_s |
number | Heure de début du segment en secondes (avec décimales) |
end_s |
number | Heure de fin du segment en secondes. Le end_s du dernier segment équivaut pratiquement à la durée du morceau |
success |
boolean | Si ce segment a été aligné avec succès |
p_align |
number | Confiance de l'alignement ; mesurée de façon stable à 0.99 |
Points d'attention
- Ne cherchez pas d'enveloppe. La réponse est le tableau lui-même, pas
{"data": ...}, et il n'y a pas non plus de champsuccess. - Il peut ne pas y avoir de segment au début. Sur un morceau à introduction pure, la mesure montre le premier segment seulement à la 15e seconde, et
start_sne commence pas forcément à0; pour du karaoké, gérez vous-même le blanc initial. - Les marqueurs instrumentaux et de structure sont aussi renvoyés, sous des formes comme
[Intro],[Verse 1],Instrumental: soft arpeggiating piano, …et[End], également avec un minutage mot par mot. Avant de construire des sous-titres de paroles, filtrez ces segments par le[initial ou parInstrumental; sinon les descriptions d'arrangement s'afficheront comme des paroles. - C'est mot à mot, pas ligne à ligne. La même ligne de paroles est souvent découpée en plusieurs segments et doit être regroupée en lignes par
\n; l'heure d'une ligne est lestart_sde son premier segment. - Le nombre de segments dépend du morceau ; ne présumez pas d'un nombre fixe (mesuré : un morceau de 189,6 secondes comptait 69 segments et un corps de réponse d'environ 6,5 Ko).
Générer un fichier .lrc
Ce point d'accès ne renvoie que les données de la timeline ; il ne renvoie pas de fichier directement. Si vous avez besoin d'un .lrc, construisez les lignes à partir du start_s renvoyé au format [mm:ss.cc] (le champ word contient ses propres retours à la ligne : découpez par ligne et ignorez les lignes vides). Pour un exemple, voir « Comment obtenir les paroles horodatées (.lrc) » dans l'API de téléchargement et d'écoute des médias de morceaux.
Ci-dessous une version complète avec filtrage des marqueurs instrumentaux et de structure (un segment par ligne, utile pour vérifier d'abord la forme des données) :
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)
Remarques de compatibilité
La documentation précédente utilisait un exemple avec l'objet enveloppe { success, song_id, lyrics: [...] }. La documentation actuelle retient le tableau de la timeline renvoyé directement.
Obtenir une clé d'API
Créez une clé d'API dans la console après votre inscription. Chaque génération coûte 0,6 ¥ et renvoie 2 pistes, les téléchargements sont illimités et aucun numéro de téléphone n'est requis.
Obtenir une clé d'API Retour à la présentation