API kalibrasi timestamp lirik

Diperbarui 2026-09-18 · tim Suno-API

Ini bukan pengenalan suara. Teks selalu memakai lirik asli yang Anda berikan; kami hanya menempatkan setiap karakter pada waktu yang tepat — jadi "karakter yang salah dengar membuat lirik meleset" tidak akan terjadi.

Deskripsi endpoint

Menyelaraskan lirik yang sudah ada dengan audio dan mengembalikan timestamp per baris dan per karakter, untuk penyorotan karakter demi karakter ala karaoke, lirik bergulir, dan pembuatan subtitle.

Endpoint: POST /api/music/lyrics-align

Autentikasi: lihat Autentikasi; headernya Authorization: Bearer YOUR_API_KEY

Biaya: ditagih per panggilan (saat ini default 0,1 ¥ per panggilan); pada lagu platform dengan pisahkan vokal dicentang, sekali lagi dikenakan harga "pisahkan vokal/instrumen" platform. Jumlah yang benar-benar ditagih mengikuti konfigurasi harga di back-office.

Waktu rata-rata: 5–15 detik (tergantung panjang audio dan apakah vokal harus dipisahkan saat itu)

Mengapa perlu kalibrasi: timestamp sisi pembuatan tidak selalu akurat

API lirik bertimestamp mengembalikan timestamp per kata langsung dari sisi pembuatan, dan itu tidak akurat:

Kalibrasi menyusun ulang penyelarasan waktu berdasarkan lirik yang Anda berikan sendiri: hanya waktu yang dikoreksi, teks tidak pernah diubah — cocok untuk kasus yang menuntut "pas atau tidak" (penyorotan per karakter ala KTV, subtitle per karakter, penilaian bernyanyi bersama).

Cara yang disarankan (tiga langkah, hasil terbaik)

  1. Ekstrak vokal murni dulu (pisahkan vokal/instrumen) dan selaraskan hanya trek vokal — instrumen dan harmoni tidak lagi mengganggu. Dasar pengukuran: dalam perbandingan baris per baris "mix penuh vs trek vokal" lagu yang sama, 5 dari 28 baris berbeda lebih dari 0,25 detik (terbesar 2,64 detik); dua mesin yang independen berbeda rata-rata 0,239 detik pada trek vokal dan 0,508 detik pada mix penuh — konsistensinya hampir setengahnya. Jadi untuk penyorotan per karakter (KTV/subtitle) sebaiknya diaktifkan. (Besaran peningkatannya sedang diukur ulang dengan mesin baru.)
  2. Berikan lirik lengkap: seluruh lagu, per baris, cocok satu-satu dengan audio. Kalimat atau bagian yang hilang akan menggeser seluruh baris berikutnya; jangan sertakan timestamp seperti [00:23.82] di lirik (otomatis diabaikan).
  3. Untuk lagu platform cukup centang vocal_separate: true, dan kami melakukan "pisahkan + selaraskan" dalam satu langkah.

Tiga cara pemakaian

Cara Yang dikirim Asal lirik Pisahkan vokal
Lagu eksternal · URL publik audio_url + lirik Anda menyediakannya ❌ Tidak didukung
Lagu eksternal · unggah langsung berkas lokal (baru 2026-10) audio_object_key + lirik Anda menyediakannya ❌ Tidak didukung
Lagu platform (dibuat di situs ini) song_id Kami ambil dari catatan lagu ✅ Opsional

Hubungan parameternya (paling sering salah — baca dengan saksama)

Baru: unggah langsung berkas lokal (audio tidak melewati server kami)

Pakai ini bila audio ada di komputer Anda dan Anda tidak mau mengunggahnya dulu ke penyimpanan publik sendiri. Dua langkah:

  1. POST /api/music/lyrics-align/upload-ticket dengan file_name / file_size / content_type dan Anda menerima put_url (URL bertanda tangan, tanpa kredensial jangka panjang) serta object_key;
  2. Lakukan PUT berkas ke put_url, bawa content_type dari respons apa adanya (ikut serta dalam tanda tangan; satu karakter berubah berarti 403);
  3. Saat mengirim penyelarasan, kirim audio_object_key alih-alih audio_url.

Kredensialnya sekali pakai: setelah penyelarasan selesai (berhasil atau gagal) server menghapus objek ini, dan memakai key yang sama lagi akan menghasilkan galat.

Baru: lirik kini boleh tidak dikirim

Dulu lagu eksternal wajib beri lirik. Sekarang boleh dilewatkan: server menjalankan pengenalan sekali dan memakai teks hasil pengenalan sebagai lirik.

Konsekuensinya harus dikatakan jelas: teksnya mengikuti hasil pengenalan, sehingga beberapa karakter bisa salah. Respons seperti itu ditandai dengan lyrics_source: "asr", confidence: "low" dan di warnings[] ada {"code":"no_reference_lyrics"}.

Untuk penyorotan per karakter / KTV, selalu sediakan lirik aslinya.

Parameter permintaan

Headers

Parameter Tipe Wajib Catatan
Authorization string ya Bearer YOUR_API_KEY
Content-Type string ya application/json

Parameter body

Parameter Tipe Wajib Default Catatan
song_id string salah satu dari dua - ID lagu platform
lyrics string tidak - Lirik asli, baris dipisah \n. Kini boleh tidak dikirim
audio_url string salah satu dari dua untuk eksternal - Alamat audio; harus bisa diunduh publik
audio_object_key string salah satu dari dua untuk eksternal - Key objek unggahan langsung (panggil /lyrics-align/upload-ticket dulu)
vocal_separate boolean tidak false Apakah memisahkan vokal dulu (hanya lagu platform)
language string tidak otomatis Chinese / English dsb.; bila kosong ditebak dari lirik
granularity string tidak both both / line (tanpa keluaran per karakter) / word
sections string tidak keep keep mempertahankan penanda seperti [Chorus] (tidak ikut timeline) / drop
format string tidak json json / lrc / lrc-word (dua terakhir juga mengembalikan teks lrc dan lrc_word)

Batasan

Item Batasan
Durasi audio ≤ 6 menit (lebih dari itu mengembalikan galat dan pengembalian penuh)
Sumber audio Harus bisa diunduh publik; alamat yang butuh login tidak diterima
Format lirik Teks biasa, baris dipisah \n; penanda bagian seperti [Verse] atau 【主歌】 dipertahankan tetapi tidak ikut timeline
Batch Satu lagu per panggilan; untuk banyak lagu, buat loop sendiri
Menyimpan hasil Endpoint ini tidak menyimpan apa pun; simpan hasilnya sendiri

Contoh permintaan

Lagu eksternal (lirik + alamat audio)

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": "Berjalan di jalan yang dingin\nAngin malam menyentuh mataku\nWaktu mengalir seperti air",
    "audio_url": "https://your-bucket.example.com/song.mp3"
  }'

Lagu platform (tanpa pemisahan)

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"}'

Lagu platform + pisahkan vokal (disarankan untuk 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}'

Respons

Respons berhasil

{
  "success": true,
  "lyrics_source": "platform",
  "vocal_separate": false,
  "coverage": 0.935,
  "exact": 196,
  "fuzzy": 4,
  "total": 214,
  "lines": [
    {
      "text": "Berjalan di jalan yang dingin",
      "start": 21.66,
      "end": 24.06,
      "chars": [
        {"char": "B", "start": 21.66, "end": 21.74, "word": true},
        {"char": "e", "start": 21.98, "end": 22.22, "word": true}
      ]
    }
  ]
}

Penjelasan kolom

Kolom Tipe Catatan
success boolean Apakah permintaan berhasil
lyrics_source string platform = lirik dari lagu platform; user = lirik dari Anda; asr = Anda tidak memberi lirik dan teksnya dari pengenalan
vocal_separate boolean Apakah kali ini melalui pemisahan vokal
confidence string high / low (selalu low saat lyrics_source=asr)
warnings[] array peringatan degradasi; bila tanpa lirik berisi {"code":"no_reference_lyrics"}
coverage number Kualitas penyelarasan: proporsi karakter dengan jangkar waktu jelas (0–1)
exact / fuzzy / total number karakter cocok persis / cocok homofon / karakter lirik yang valid
lines[].text string satu baris lirik, karakter demi karakter sama dengan aslinya
lines[].start / end number waktu mulai dan akhir baris (detik)
lines[].section boolean apakah baris ini penanda bagian (true = tanpa waktu, tanpa sorotan)
lines[].chars[] array waktu per karakter: char, start/end detik, word apakah masuk timeline (tanda baca bernilai false)
words[] array daftar karakter datar: text / start / end / line; tidak dikembalikan bila granularity=line
lrc string teks LRC per baris (hanya bila format=lrc atau lrc-word)
lrc_word string LRC per karakter yang diperkaya, dengan tag <mm:ss.xx> di baris (hanya bila format=lrc-word)

Cara memakai coverage (tiga tingkat)

coverage Pemakaian yang disarankan
≥ 0,9 bisa untuk penyorotan per karakter (karaoke)
0,8 – 0,9 campur per karakter dan per baris, atau sorot hanya per baris dan karakter sebagai acuan
< 0,8 hanya sorotan per baris (pengulangan, harmoni padat, dialek, dan rap sering rendah)

Status dan durasi

Skenario Waktu terukur
Lagu platform · tanpa pemisahan sekitar 4,5 detik
Lagu platform · pemisahan (trek vokal sudah ada) sekitar 11 detik
Lagu platform · pemisahan (harus dipisah saat itu) sekitar 25 detik, maksimal sekitar 1 menit
Lagu eksternal · lirik + alamat audio sekitar 5–15 detik (tergantung panjang)

Batas satu kali eksekusi di server adalah 8 menit; setel timeout klien 120 detik atau lebih.

Respons galat

{
  "success": false,
  "message": "音频超过 6 分钟上限(实际 7.2 分钟)"
}
Skenario Dikenai biaya?
Tidak ada audio (ketiganya kosong) Tidak (pemrosesan belum dimulai)
audio_url dan audio_object_key bersamaan Tidak (pemrosesan belum dimulai)
Objek unggahan langsung belum ada / sudah dihapus Tidak (pemrosesan belum dimulai)
granularity / sections / format tidak valid Tidak (pemrosesan belum dimulai)
Lagu platform tidak ada / bukan milik akun ini Tidak (pemrosesan belum dimulai)
Parameter hilang atau tidak valid Tidak (pemrosesan belum dimulai)
Audio melebihi batas 6 menit Pengembalian penuh
Audio tidak bisa diunduh (alamat non-publik / butuh login) Pengembalian penuh
Tidak memberi lirik dan pengenalan server gagal Pengembalian penuh
Centang pisahkan vokal tapi tidak ada trek vokal yang bisa dipakai Pengembalian penuh (termasuk biaya pemisahan)
Layanan penyelarasan bermasalah atau timeout Pengembalian penuh

Prinsip: tanpa hasil akhir berarti pengembalian penuh. Biaya dikenakan hanya bila timestamp per karakter benar-benar dikembalikan, dan pengembaliannya otomatis, tanpa permohonan.

Penagihan

Item Kapan dikenakan Catatan
Kalibrasi timestamp lirik (dasar) setiap panggilan per panggilan (kini default 0,1 ¥); jumlah sebenarnya mengikuti konfigurasi harga di back-office
Biaya tambahan transkripsi hanya bila lirik tidak diberikan server harus menjalankan pengenalan suara dulu, biaya yang tidak dimiliki tingkat "dengan lirik", jadi dihargai terpisah
Pemisahan vokal (opsional, hanya lagu platform) saat vocal_separate dicentang dikenakan sekali dengan harga "pisahkan vokal/instrumen" yang berlaku dan diselesaikan bersama endpoint ini

Gabungannya:

bayar = harga dasar + (lirik tidak diberikan ? biaya transkripsi : 0) + (pemisahan dicentang ? harga pemisahan : 0)

Biaya pemisahan vokal hanya dikenakan sekali: jika Anda sudah memisahkan dan trek vokalnya langsung tersedia, endpoint ini yang menagih; jika harus dipisah saat itu, langkah pemisahan yang menagih.

Contoh lengkap (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("kualitas penyelarasan coverage =", res["coverage"])
for line in res["lines"]:
    print(f'{line["start"]:7.2f}  {line["text"]}')
    # karaoke per karakter: setiap karakter di line["chars"] punya start / end sendiri

Pertanyaan umum

T: Keluarannya per karakter atau per baris? J: Keduanya. lines[].start per baris, lines[].chars[].start / end per karakter; pemutar memakai yang diperlukan.

T: Kenapa teks yang dikembalikan sama persis dengan yang saya kirim? J: Memang begitu rancangannya. Kami tidak mengenali lalu menulis ulang, hanya menyelaraskan waktu, jadi lirik tidak akan pernah "dikoreksi jadi salah ketik".

T: coverage tinggi tapi masih terdengar agak meleset. J: Galat per karakter biasanya puluhan milidetik; kalau seluruh lagu meleset dengan nilai tetap, kemungkinan besar ada bagian sunyi di awal audio — potong dulu lalu coba lagi.

T: Kenapa tadi pemisahan bisa dipakai, sebentar kemudian bilang "trek vokal tidak tersedia"? J: Hasil pemisahan adalah alamat sementara berumur pendek (terukur: kedaluwarsa sekitar setengah jam). Dalam kasus itu endpoint mencoba memisahkan ulang otomatis; jika tetap gagal, ada pengembalian penuh. Jadi cara "pisahkan dulu, kalibrasi nanti" tidak andal — lakukan keduanya dalam satu alur.

T: Apakah lagu platform harus saya pisahkan sendiri dulu? J: Tidak. Dengan vocal_separate: true kami periksa apakah lagu sudah punya trek vokal; bila tidak ada yang bisa dipakai, kami beri galat dan mengembalikan dana, bukan menyodorkan mix penuh.

T: Bisa batch? J: Satu lagu per permintaan. Untuk batch, buat loop; setiap panggilan ditagih normal, jadi sebaiknya cache hasilnya secara lokal.

T: Apakah hasilnya disimpan? J: Endpoint ini tidak menyimpan apa pun; simpan sendiri nilai yang dikembalikan (timestamp per baris dan per karakter ada di respons).

BerikutnyaAPI sertifikat lisensi komersial musik

Dapatkan kunci API

Buat kunci API di konsol setelah mendaftar. Setiap pembuatan berbiaya 0,6 ¥ dan menghasilkan 2 lagu, unduhan tidak terbatas, dan nomor telepon tidak diperlukan.

Ambil kunci API Kembali ke ringkasan