API de letras com marcas de tempo
Descrição do endpoint
As letras com marcas de tempo obtêm as marcas de tempo ao nível da palavra de uma música, para apresentação sincronizada da letra.
Endpoint: POST /api/lyrics/timeline
Cobrança: Grátis (consulta só de leitura; não se cobra nada e não se cria qualquer tarefa de geração).
Formato de retorno: o array da linha do tempo é devolvido diretamente — não há envelope data / success; depois de analisado é simplesmente um array.
Parâmetros da requisição
Headers
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
| Authorization | string | sim | Bearer YOUR_API_KEY |
| Content-Type | string | sim | application/json |
Parâmetros do corpo
| Parâmetro | Tipo | Obrigatório | Padrão | Observações |
|---|---|---|---|---|
| model | string | não | suno-v6 | Nome de modelo para o cliente: suno-v6, suno-v6-wild ou suno-v6-mini |
| song_id | string | sim | - | ID da música |
Exemplo de requisição
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"
}'
Resposta
Abaixo está uma resposta real de produção de uma música de 189,6 segundos em suno-v6 (essa chamada teve 69 segmentos; aqui só se mantêm os primeiros e os últimos):
[
{
"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
}
]
Referência de campos
| Campo | Tipo | Observações |
|---|---|---|
word |
string | O texto deste segmento; inclui as suas próprias quebras de linha: uma linha de letra por segmento com \n no fim e \n\n entre parágrafos, pelo que aparecem entradas só com espaços |
start_s |
number | Hora de início do segmento em segundos (com decimais) |
end_s |
number | Hora de fim do segmento em segundos. O end_s do último segmento é praticamente a duração da música |
success |
boolean | Se este segmento foi alinhado com sucesso |
p_align |
number | Confiança do alinhamento; nas medições mantém-se em 0.99 |
Coisas a ter em atenção
- Não procure um envelope. A resposta é o próprio array, não
{"data": ...}, e também não tem camposuccess. - Pode não haver segmento no início. Numa música com introdução pura, a medição mostrou o primeiro segmento só ao segundo 15, e não há garantia de que
start_scomece em0; para karaoke, trate você mesmo o intervalo inicial. - Também são devolvidos marcadores instrumentais e de estrutura, em formas como
[Intro],[Verse 1],Instrumental: soft arpeggiating piano, …e[End], igualmente com tempos palavra a palavra. Antes de montar legendas de letra, filtre estes segmentos pelo[inicial ou porInstrumental; caso contrário verá descrições do arranjo como se fossem letra. - É por palavra, não por linha. A mesma linha de letra costuma ser dividida em vários segmentos e tem de ser unida em linhas por
\n; a hora de uma linha é ostart_sdo seu primeiro segmento. - O número de segmentos depende da música; não assuma uma quantidade fixa (medido: uma música de 189,6 segundos tinha 69 segmentos e um corpo de resposta de cerca de 6,5 KB).
Gerar um ficheiro .lrc
Este endpoint devolve apenas dados da linha do tempo; não devolve um ficheiro diretamente. Quando precisar de .lrc, construa as linhas a partir do start_s devolvido no formato [mm:ss.cc] (o campo word inclui as suas próprias quebras de linha: divida por linha e salte as linhas vazias). Para um exemplo, veja «Como obter a letra com marcas de tempo (.lrc)» na API de download e pré-visualização de mídia de músicas.
Abaixo está uma versão completa com filtragem de marcadores instrumentais e de estrutura (um segmento por linha, útil para verificar primeiro a forma dos dados):
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)
Notas de compatibilidade
A documentação anterior usava um exemplo com o objeto envelope { success, song_id, lyrics: [...] }. A documentação atual toma como referência o array da linha do tempo devolvido diretamente.
Obter uma chave de API
Crie uma chave de API no console após o cadastro. Cada geração custa ¥0,6 e devolve 2 faixas, os downloads são ilimitados e não é preciso número de telefone.
Obter chave de API Voltar à visão geral