API kalibrasi timestamp lirik
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:
- pengulangan, harmoni padat, rap, dan nada panjang sering bergeser keseluruhan atau menggeser karakter tertentu;
- sebagian lagu kehilangan satu bagian di awal (misalnya intro murni, fragmen pertama baru mulai di detik belasan);
- sebagian baris sulit dipautkan ke jangkar waktu yang jelas.
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)
- 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.)
- 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). - 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)
- Mengirim
song_id→ jalur lagu platform: jangan kirimlyrics/audio_url/audio_object_keyjuga; - Mengirim
audio_urlatauaudio_object_key→ jalur lagu eksternal: hanya salah satu, dan jangan kirimsong_id; vocal_separatehanya berlaku untuk lagu platform; pada lagu eksternal akan ditolak (audionya tidak ada di sisi kami, tidak bisa dipisahkan).
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:
POST /api/music/lyrics-align/upload-ticketdenganfile_name/file_size/content_typedan Anda menerimaput_url(URL bertanda tangan, tanpa kredensial jangka panjang) sertaobject_key;- Lakukan
PUTberkas keput_url, bawacontent_typedari respons apa adanya (ikut serta dalam tanda tangan; satu karakter berubah berarti 403); - Saat mengirim penyelarasan, kirim
audio_object_keyalih-alihaudio_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).
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