API kalibrasi cap masa lirik
Ini bukan pengecaman pertuturan. Teks sentiasa menggunakan lirik asal yang anda berikan; kami hanya meletakkan setiap aksara pada masa yang betul — jadi "aksara yang salah didengar menyebabkan lirik tidak sepadan" tidak akan berlaku.
Penerangan endpoint
Ia menjajarkan lirik sedia ada dengan audio dan memulangkan cap masa peringkat baris dan aksara, untuk sorotan aksara demi aksara gaya karaoke, lirik bergulir dan penjanaan sari kata.
Endpoint: POST /api/music/lyrics-align
Pengesahan: lihat Pengesahan; pengepalanya Authorization: Bearer YOUR_API_KEY
Pengebilan: setiap panggilan (kini lalai 0.1 ¥ setiap panggilan); jika lagu platform dan pisahkan vokal ditanda, sekali lagi dikenakan harga "pisahkan vokal/iringan" platform. Jumlah yang benar-benar dicaj mengikut tetapan harga dalam back-office.
Masa purata: 5–15 saat (bergantung panjang audio dan sama ada vokal perlu dipisahkan di tempat)
Mengapa perlu kalibrasi: cap masa di sisi penjanaan tidak sentiasa tepat
API lirik bertimestamp memulangkan cap masa perkataan demi perkataan terus daripada sisi penjanaan, dan ia tidak tepat:
- ulangan, harmoni padat, rap dan not panjang sering bergeser keseluruhan atau menggeser aksara tertentu;
- sebahagian lagu kehilangan bahagian di awal (contohnya intro semata-mata, serpihan pertama baru bermula pada saat belasan);
- sesetengah baris sukar dipautkan pada sauh masa yang jelas.
Kalibrasi menyusun semula penjajaran masa berdasarkan lirik yang anda berikan sendiri: hanya masa dibetulkan, teks tidak pernah diubah — sesuai untuk kes yang mementingkan "betul-betul sepadan" (sorotan per aksara gaya KTV, sari kata per aksara, pemarkahan nyanyian bersama).
Cara yang disyorkan (tiga langkah, hasil terbaik)
- Asingkan vokal tulen dahulu (pisahkan vokal/iringan) dan jajarkan hanya trek vokal — iringan dan harmoni tidak lagi mengganggu. Asas ukuran: dalam perbandingan baris demi baris "campuran penuh vs trek vokal" lagu yang sama, 5 daripada 28 baris berbeza lebih 0.25 saat (terbesar 2.64 saat); dua enjin bebas berbeza purata 0.239 saat pada trek vokal dan 0.508 saat pada campuran penuh — ketekalan hampir separuh. Jadi untuk sorotan per aksara (KTV/sari kata) sebaiknya dihidupkan. (Peningkatan sebenar sedang diukur semula dengan enjin baharu.)
- Berikan lirik lengkap: seluruh lagu, baris demi baris, sepadan satu dengan satu dengan audio. Ayat atau bahagian yang hilang akan menggeser semua baris berikutnya; jangan masukkan cap masa seperti
[00:23.82]dalam lirik (ia diabaikan automatik). - Untuk lagu platform, cukup tanda
vocal_separate: truedan kami buat "pisah + jajar" dalam satu langkah.
Tiga cara penggunaan
| Cara | Apa yang dihantar | Asal lirik | Pisahkan vokal |
|---|---|---|---|
| Lagu luar · URL awam | audio_url + lirik |
Anda berikan | ❌ Tidak disokong |
| Lagu luar · muat naik terus fail tempatan (baharu 2026-10) | audio_object_key + lirik |
Anda berikan | ❌ Tidak disokong |
| Lagu platform (lagu yang dijana di laman ini) | song_id |
Kami ambil daripada rekod lagu | ✅ Pilihan |
Hubungan parameter (paling kerap tersalah — baca dengan teliti)
- Menghantar
song_id→ laluan lagu platform: jangan hantarlyrics/audio_url/audio_object_keysekali lagi; - Menghantar
audio_urlatauaudio_object_key→ laluan lagu luar: hanya satu daripada dua, dan jangan hantarsong_id; vocal_separatehanya berkesan untuk lagu platform; jika dihantar pada lagu luar ia ditolak (audio bukan di pihak kami, tidak boleh dipisahkan).
Baharu: muat naik terus fail tempatan (audio tidak melalui pelayan kami)
Gunakan apabila audio ada pada mesin anda dan anda tidak mahu memuat naiknya ke storan awam sendiri dahulu. Dua langkah:
POST /api/music/lyrics-align/upload-ticketdenganfile_name/file_size/content_typedan anda menerimaput_url(URL bertandatangan, tanpa kredensial jangka panjang) sertaobject_key;- Lakukan
PUTfail keput_url, bawacontent_typedaripada respons sebagaimana adanya (ia terlibat dalam tandatangan; satu aksara berubah bermakna 403); - Semasa menghantar penjajaran, hantar
audio_object_keydan bukanaudio_url.
Kredensial adalah sekali guna: setelah penjajaran selesai (berjaya atau gagal) pelayan akan memadam objek ini, dan menggunakan key yang sama semula akan menyebabkan ralat.
Baharu: lirik kini boleh tidak dihantar
Dahulu lagu luar wajib ada lirik. Kini boleh ditinggalkan: pelayan menjalankan pengecaman sekali dan menggunakan teks yang dikecam sebagai lirik.
Kosnya mesti dinyatakan jelas: teks mengikut hasil pengecaman, jadi beberapa aksara mungkin salah. Respons sebegitu ditandakan dengan
lyrics_source: "asr", confidence: "low" dan dalam warnings[] ada
{"code":"no_reference_lyrics"}.
Untuk sorotan per aksara / KTV, sentiasa berikan lirik asal.
Parameter permintaan
Headers
| Parameter | Jenis | Wajib | Nota |
|---|---|---|---|
| Authorization | string | ya | Bearer YOUR_API_KEY |
| Content-Type | string | ya | application/json |
Parameter body
| Parameter | Jenis | Wajib | Lalai | Nota |
|---|---|---|---|---|
| song_id | string | satu daripada dua | - | ID lagu platform |
| lyrics | string | tidak | - | Lirik asal, baris dipisah \n. Kini boleh tidak dihantar |
| audio_url | string | satu daripada dua untuk luar | - | Alamat audio; mesti boleh dimuat turun awam |
| audio_object_key | string | satu daripada dua untuk luar | - | Key objek muat naik terus (panggil /lyrics-align/upload-ticket dahulu) |
| vocal_separate | boolean | tidak | false |
Sama ada memisahkan vokal dahulu (hanya lagu platform) |
| language | string | tidak | automatik | Chinese / English dsb.; jika kosong diteka daripada lirik |
| granularity | string | tidak | both |
both / line (tiada output per aksara) / word |
| sections | string | tidak | keep |
keep mengekalkan penanda seperti [Chorus] (tidak masuk garis masa) / drop |
| format | string | tidak | json |
json / lrc / lrc-word (dua terakhir turut memulangkan teks lrc dan lrc_word) |
Had
| Item | Had |
|---|---|
| Tempoh audio | ≤ 6 minit (lebih akan memulangkan ralat dan bayaran balik penuh) |
| Sumber audio | Mesti boleh dimuat turun awam; alamat yang memerlukan log masuk tidak diterima |
| Format lirik | Teks biasa, baris dipisah \n; penanda bahagian seperti [Verse] atau 【主歌】 dikekalkan tetapi tidak masuk garis masa |
| Berkelompok | Satu lagu setiap panggilan; untuk banyak lagu, buat gelung sendiri |
| Simpan hasil | Endpoint ini tidak menyimpan apa-apa; simpan hasilnya sendiri |
Contoh permintaan
Lagu luar (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\nMasa 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 (disyorkan 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 berjaya
{
"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 medan
| Medan | Jenis | Nota |
|---|---|---|
success |
boolean | Sama ada permintaan berjaya |
lyrics_source |
string | platform = lirik daripada lagu platform; user = lirik daripada anda; asr = anda tidak beri lirik, teks datang daripada pengecaman |
vocal_separate |
boolean | Sama ada kali ini melalui pemisahan vokal |
confidence |
string | high / low (sentiasa low apabila lyrics_source=asr) |
warnings[] |
array | amaran degradasi; tanpa lirik mengandungi {"code":"no_reference_lyrics"} |
coverage |
number | Kualiti penjajaran: nisbah aksara dengan sauh masa jelas (0–1) |
exact / fuzzy / total |
number | aksara tepat / homofon / aksara lirik yang sah |
lines[].text |
string | satu baris lirik, aksara demi aksara sama dengan asal anda |
lines[].start / end |
number | masa mula dan tamat baris (saat) |
lines[].section |
boolean | sama ada baris ini penanda bahagian (true = tiada masa, tiada sorotan) |
lines[].chars[] |
array | masa per aksara: char, start/end saat, word sama ada masuk garis masa (tanda baca false) |
words[] |
array | senarai aksara rata: text / start / end / line; tidak dipulangkan apabila granularity=line |
lrc |
string | teks LRC per baris (hanya apabila format=lrc atau lrc-word) |
lrc_word |
string | LRC per aksara diperkaya, dengan tag <mm:ss.xx> dalam baris (hanya apabila format=lrc-word) |
Cara guna coverage (tiga tahap)
| coverage | Penggunaan disyorkan |
|---|---|
| ≥ 0.9 | sorotan per aksara (karaoke) boleh dibuat |
| 0.8 – 0.9 | campur per aksara dan baris, atau sorot baris sahaja dan aksara sebagai rujukan |
| < 0.8 | hanya sorotan per baris (ulangan, harmoni padat, dialek dan rap sering rendah) |
Status dan masa
| Senario | Masa diukur |
|---|---|
| Lagu platform · tanpa pemisahan | kira-kira 4.5 saat |
| Lagu platform · pemisahan (trek vokal sudah ada) | kira-kira 11 saat |
| Lagu platform · pemisahan (perlu dipisah di tempat) | kira-kira 25 saat, paling lama kira-kira 1 minit |
| Lagu luar · lirik + alamat audio | kira-kira 5–15 saat (bergantung panjang) |
Had satu larian di pelayan ialah 8 minit; tetapkan timeout klien 120 saat atau lebih.
Respons ralat
{
"success": false,
"message": "音频超过 6 分钟上限(实际 7.2 分钟)"
}
| Senario | Dikenakan caj? |
|---|---|
| Tiada audio (ketiga-tiga kosong) | Tidak (pemprosesan belum bermula) |
audio_url dan audio_object_key serentak |
Tidak (pemprosesan belum bermula) |
| Objek muat naik terus belum ada / sudah dipadam | Tidak (pemprosesan belum bermula) |
granularity / sections / format tidak sah |
Tidak (pemprosesan belum bermula) |
| Lagu platform tidak wujud / bukan milik akaun ini | Tidak (pemprosesan belum bermula) |
| Parameter hilang atau tidak sah | Tidak (pemprosesan belum bermula) |
| Audio melebihi had 6 minit | Bayaran balik penuh |
| Audio tidak boleh dimuat turun (alamat bukan awam / perlu log masuk) | Bayaran balik penuh |
| Tidak beri lirik dan pengecaman pelayan gagal | Bayaran balik penuh |
| Tanda pisahkan vokal tetapi tiada trek vokal boleh guna | Bayaran balik penuh (termasuk kos pemisahan) |
| Perkhidmatan penjajaran bermasalah atau timeout | Bayaran balik penuh |
Prinsip: tiada hasil akhir bermakna bayaran balik penuh. Caj dikenakan hanya apabila cap masa per aksara benar-benar dipulangkan, dan bayaran balik dibuat automatik, tanpa permohonan.
Pengebilan
| Item | Bila dikenakan | Nota |
|---|---|---|
| Kalibrasi cap masa lirik (asas) | setiap panggilan | setiap panggilan (kini lalai 0.1 ¥); jumlah sebenar mengikut tetapan harga dalam back-office |
| Caj tambahan transkripsi | hanya apabila lirik tidak diberikan | pelayan perlu menjalankan pengecaman pertuturan dahulu, kos yang tidak ada pada tahap "ada lirik", jadi dihargai berasingan |
| Pemisahan vokal (pilihan, hanya lagu platform) | apabila vocal_separate ditanda |
dikenakan sekali pada harga "pisahkan vokal/iringan" yang sedia ada dan diselesaikan bersama endpoint ini |
Gabungannya:
bayar = harga asas + (lirik tidak diberi ? caj transkripsi : 0) + (pemisahan ditanda ? harga pemisahan : 0)
Kos pemisahan vokal dikenakan sekali sahaja: jika anda sudah memisahkan dan trek vokal tersedia terus, endpoint ini yang mengenakannya; jika perlu dipisah di tempat, langkah pemisahan yang mengenakannya.
Contoh penuh (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("kualiti penjajaran coverage =", res["coverage"])
for line in res["lines"]:
print(f'{line["start"]:7.2f} {line["text"]}')
# karaoke per aksara: setiap aksara dalam line["chars"] ada start / end sendiri
Soalan lazim
S: Output per aksara atau per baris?
J: Kedua-duanya. lines[].start per baris, lines[].chars[].start / end per aksara; pemain ambil yang perlu.
S: Mengapa teks yang dipulangkan sama dengan yang saya hantar? J: Memang begitu rekaannya. Kami tidak mengecam lalu menulis semula, hanya menjajarkan masa, jadi lirik tidak akan "dibetulkan menjadi salah taip".
S: coverage tinggi tetapi masih kedengaran sedikit melencong.
J: Ralat per aksara biasanya puluhan milisaat; kalau seluruh lagu melencong dengan nilai tetap, kemungkinan besar ada bahagian senyap di awal audio — potong dahulu lalu cuba lagi.
S: Mengapa tadi pemisahan boleh guna, sebentar kemudian berkata "trek vokal tidak tersedia"? J: Hasil pemisahan ialah alamat sementara berumur pendek (diukur: luput kira-kira setengah jam). Dalam kes itu endpoint akan cuba memisahkan semula secara automatik; jika tetap gagal, ada bayaran balik penuh. Jadi cara "pisah dahulu, kalibrasi kemudian" tidak boleh dipercayai — buat kedua-duanya dalam aliran yang sama.
S: Perlukah saya pisahkan lagu platform sendiri dahulu?
J: Tidak. Dengan vocal_separate: true kami semak sama ada lagu sudah ada trek vokal; jika tiada yang boleh guna, kami beri ralat dan memulangkan dana, bukan menyuap campuran penuh.
S: Boleh berkelompok? J: Satu lagu setiap permintaan. Untuk kelompok, buat gelung; setiap panggilan dicaj seperti biasa, jadi sebaiknya cache hasil secara tempatan.
S: Hasilnya disimpan? J: Endpoint ini tidak menyimpan apa-apa; simpan sendiri nilai yang dipulangkan (cap masa per baris dan per aksara ada dalam respons).
Dapatkan kunci API
Cipta kunci API dalam konsol selepas mendaftar. Setiap penjanaan berharga 0.6 ¥ dan mengembalikan 2 lagu, muat turun tanpa had dan nombor telefon tidak diperlukan.
Dapatkan kunci API Kembali ke gambaran