Şarkı sözü zaman damgası kalibrasyon API'si
Bu ses tanıma değildir. Metin her zaman sizin verdiğiniz orijinal sözleri kullanır; biz yalnızca her karakteri doğru ana yerleştiririz — yani "yanlış duyulan karakterlerin sözleri kaydırması" diye bir şey olmaz.
Uç nokta açıklaması
Mevcut sözleri sesle hizalar ve satır + karakter bazında zaman damgaları döndürür: karaoke karakter vurgusu, kayan söz ve altyazı üretimi için.
Uç nokta: POST /api/music/lyrics-align
Kimlik doğrulama: Kimlik doğrulama sayfasına bakın; başlık Authorization: Bearer YOUR_API_KEY
Faturalama: çağrı başına (şu anda varsayılan çağrı başına 0,1 ¥); platform şarkısında vokal ayrıştırma işaretliyse platformun "vokal/eşlik ayrıştırma" fiyatı bir kez daha alınır. Gerçekte tahsil edilen tutar güncel arka ofis fiyat yapılandırmasına göre belirlenir.
Ortalama süre: 5–15 saniye (sesin uzunluğuna ve vokalin yerinde ayrıştırılması gerekip gerekmediğine göre)
Kalibrasyon neden gerekli: üretim tarafındaki zaman damgaları her zaman doğru değil
Zaman damgalı şarkı sözü API'si üretim tarafının kelime bazlı zaman damgalarını doğrudan döndürür ve bunlar hatalıdır:
- tekrarlar, yoğun armoniler, rap ve uzun notalarda genel kayma ya da tek karakter kayması sık görülür;
- bazı şarkıların başında bir bölüm eksiktir (örneğin saf giriş; ilk parça ancak on beşinci saniyede başlar);
- bazı satırları net bir zaman çapasına bağlamak zordur.
Kalibrasyon, zaman hizalamasını kendi verdiğiniz sözler üzerinden yeniden yapar: yalnızca zaman düzeltilir, metin asla, bu da "tam oturuyor mu" sorusunun önemli olduğu durumlara uygundur (KTV karakter vurgusu, karakter bazlı altyazı, eşlik ederek söyleme puanlaması).
Önerilen yöntem (üç adım, en iyi sonuç)
- Önce saf vokali ayırın (vokal/eşlik ayrıştırma) ve yalnızca vokal kanalı hizalayın — eşlik ve armoniler artık karışmaz. Ölçüm dayanağı: aynı şarkının "tam mix vs vokal kanalı" satır satır karşılaştırmasında 28 satırın 5'i 0,25 saniyeden fazla farklıydı (en büyüğü 2,64 saniye); iki bağımsız motor vokal kanalında ortalama 0,239 saniye, tam mixta 0,508 saniye farklıydı — uyum neredeyse yarı yarıya. Bu yüzden karakter vurgusu (KTV/altyazı) için açmanız önerilir. (Kazancın tam ölçüsü yeni motorla yeniden ölçülüyor.)
- Tam sözleri verin: şarkının tamamı, satır satır, sesle bire bir. Eksik bir cümle ya da bölüm sonraki tüm satırları kaydırır; sözlere
[00:23.82]gibi zaman damgaları yazmayın (otomatik yok sayılır). - Platform şarkısında
vocal_separate: trueyeterlidir; "ayrıştırma + hizalama" tek adımda yapılır.
Üç kullanım biçimi
| Biçim | Ne gönderilir | Sözlerin kaynağı | Vokal ayrıştırma |
|---|---|---|---|
| Harici şarkı · genel URL | audio_url + sözler |
Siz verirsiniz | ❌ Desteklenmez |
| Harici şarkı · yerel dosyayı doğrudan yükleme (2026-10'da eklendi) | audio_object_key + sözler |
Siz verirsiniz | ❌ Desteklenmez |
| Platform şarkısı (bu sitede üretilen) | song_id |
Şarkı kaydından biz alırız | ✅ İsteğe bağlı |
Parametrelerin ilişkisi (en çok burada hata yapılır, dikkatle okuyun)
song_idgönderirseniz → platform şarkısı yolu:lyrics/audio_url/audio_object_keyalanlarını ayrıca göndermeyin;audio_urlveyaaudio_object_keygönderirseniz → harici şarkı yolu: ikisinden yalnızca biri, vesong_idgöndermeyin;vocal_separateyalnızca platform şarkılarında geçerlidir; harici şarkıda gönderilirse reddedilir (ses bizde olmadığı için ayrıştırılamaz).
Yeni: yerel dosyayı doğrudan yükleme (ses bizim sunucularımızdan geçmez)
Ses kendi makinenizdeyse ve önce kendi genel depolamanıza yüklemek istemiyorsanız bunu kullanın. İki adım:
POST /api/music/lyrics-align/upload-ticketçağrısınıfile_name/file_size/content_typeile yapın;put_url(uzun ömürlü kimlik bilgisi içermeyen imzalı URL) veobject_keyalırsınız;- Dosyayı
put_urladresinePUTile gönderin ve yanıttakicontent_typedeğerini aynen taşıyın (imzaya dahildir; tek karakter değişirse 403 alırsınız); - Hizalamayı gönderirken
audio_urlyerineaudio_object_keyverin.
Kimlik bilgisi tek kullanımlıktır: hizalama bitince (başarılı ya da başarısız) sunucu nesneyi siler ve aynı anahtarı yeniden kullanmak hata verir.
Yeni: sözler artık zorunlu değil
Eskiden harici şarkıda söz zorunluydu. Artık vermeyebilirsiniz: sunucu önce bir tanıma yapar ve tanınan metni söz olarak kullanır.
Bedelini açıkça söylemek gerekir: metin artık tanıma sonucuna bağlıdır, tek karakterler yanlış olabilir. Bu yanıtlar
lyrics_source: "asr", confidence: "low" ile ve warnings[] içinde
{"code":"no_reference_lyrics"} ile işaretlenir.
Karakter vurgusu / KTV için mutlaka orijinal sözleri verin.
İstek parametreleri
Headers
| Parametre | Tür | Zorunlu | Notlar |
|---|---|---|---|
| Authorization | string | evet | Bearer YOUR_API_KEY |
| Content-Type | string | evet | application/json |
Gövde parametreleri
| Parametre | Tür | Zorunlu | Varsayılan | Notlar |
|---|---|---|---|---|
| song_id | string | ikiden biri | - | Platform şarkı ID'si |
| lyrics | string | hayır | - | Orijinal sözler, satırlar \n ile. Artık verilmeyebilir |
| audio_url | string | harici için ikiden biri | - | Ses adresi; herkese açık indirilebilir olmalı |
| audio_object_key | string | harici için ikiden biri | - | Doğrudan yüklenen nesnenin anahtarı (önce /lyrics-align/upload-ticket çağırın) |
| vocal_separate | boolean | hayır | false |
Önce vokal ayrıştırılsın mı (yalnızca platform şarkıları) |
| language | string | hayır | otomatik | Chinese / English vb.; verilmezse sözlerden tahmin edilir |
| granularity | string | hayır | both |
both / line (karakter bazlı çıktı yok) / word |
| sections | string | hayır | keep |
keep [Chorus] gibi bölüm etiketlerini korur (zaman çizelgesine girmez) / drop |
| format | string | hayır | json |
json / lrc / lrc-word (son ikisi lrc ve lrc_word metinlerini de döndürür) |
Sınırlar
| Öğe | Sınır |
|---|---|
| Ses süresi | ≤ 6 dakika (aşarsa hata döner ve tam iade) |
| Ses kaynağı | Herkese açık indirilebilir olmalı; oturum gerektiren adresler kabul edilmez |
| Söz biçimi | Düz metin, satırlar \n; [Verse], 【主歌】 gibi bölüm etiketleri aynen korunur ama zaman çizelgesine girmez |
| Toplu iş | Çağrı başına bir şarkı; birden fazlası için kendiniz döngü kurun |
| Sonucu saklama | Bu uç nokta hiçbir şey kaydetmez; sonucu kendiniz saklayın |
İstek örnekleri
Harici şarkı (sözler + ses adresi)
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": "Soğuk sokaklarda yürüyorum\nGece rüzgârı gözlerimi okşuyor\nZaman su gibi akıyor",
"audio_url": "https://your-bucket.example.com/song.mp3"
}'
Platform şarkısı (ayrıştırma yok)
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"}'
Platform şarkısı + vokal ayrıştırma (karaoke için önerilir)
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}'
Yanıt
Başarılı yanıt
{
"success": true,
"lyrics_source": "platform",
"vocal_separate": false,
"coverage": 0.935,
"exact": 196,
"fuzzy": 4,
"total": 214,
"lines": [
{
"text": "Soğuk sokaklarda yürüyorum",
"start": 21.66,
"end": 24.06,
"chars": [
{"char": "S", "start": 21.66, "end": 21.74, "word": true},
{"char": "o", "start": 21.98, "end": 22.22, "word": true}
]
}
]
}
Alan açıklamaları
| Alan | Tür | Notlar |
|---|---|---|
success |
boolean | İsteğin başarılı olup olmadığı |
lyrics_source |
string | platform = sözler platform şarkısından; user = sözleri siz verdiniz; asr = söz vermediniz, karakterler tanımadan geliyor |
vocal_separate |
boolean | Bu kez vokal ayrıştırmadan geçilip geçilmediği |
confidence |
string | high / low (lyrics_source=asr iken her zaman low) |
warnings[] |
array | Bozulma uyarıları; söz yoksa {"code":"no_reference_lyrics"} içerir |
coverage |
number | Hizalama kalitesi: net zaman çapası olan karakter oranı (0–1) |
exact / fuzzy / total |
number | tam eşleşen / eşsesli eşleşen / geçerli söz karakterleri |
lines[].text |
string | Bir söz satırı, karakter karakter sizin orijinalinizle aynı |
lines[].start / end |
number | satırın başlangıç ve bitiş zamanı (saniye) |
lines[].section |
boolean | satır bölüm etiketi mi (true = zaman yok, vurgu yok) |
lines[].chars[] |
array | karakter bazlı zamanlar: char, start/end saniye, word zaman çizelgesine giriyor mu (noktalama false) |
words[] |
array | düz karakter listesi: text / start / end / line; granularity=line iken dönmez |
lrc |
string | satır bazlı LRC metni (yalnızca format=lrc veya lrc-word) |
lrc_word |
string | satır içi <mm:ss.xx> etiketli gelişmiş karakter LRC (yalnızca format=lrc-word) |
coverage nasıl kullanılır (üç kademe)
| coverage | Önerilen kullanım |
|---|---|
| ≥ 0,9 | karakter vurgusu (karaoke) yapılabilir |
| 0,8 – 0,9 | karakter ve satır karışık, ya da yalnızca satır vurgusu ve karakter yalnızca referans |
| < 0,8 | yalnızca satır vurgusu (tekrarlar, yoğun armoniler, lehçeler ve rap düşük çıkar) |
Durum ve süreler
| Senaryo | Ölçülen süre |
|---|---|
| Platform şarkısı · ayrıştırma yok | yaklaşık 4,5 sn |
| Platform şarkısı · ayrıştırma (vokal kanalı hazır) | yaklaşık 11 sn |
| Platform şarkısı · ayrıştırma (yerinde gerekli) | yaklaşık 25 sn, en fazla yaklaşık 1 dakika |
| Harici şarkı · sözler + ses adresi | yaklaşık 5–15 sn (uzunluğa göre) |
Sunucuda tek çalıştırma sınırı 8 dakikadır; istemci zaman aşımını 120 saniye veya üzerine ayarlayın.
Hata yanıtları
{
"success": false,
"message": "音频超过 6 分钟上限(实际 7.2 分钟)"
}
| Senaryo | Ücret alınır mı? |
|---|---|
| Ses yok (üçü de verilmedi) | Alınmaz (işlem başlamadı) |
audio_url ve audio_object_key birlikte |
Alınmaz (işlem başlamadı) |
| Doğrudan yüklenen nesne henüz yok / silinmiş | Alınmaz (işlem başlamadı) |
Geçersiz granularity / sections / format |
Alınmaz (işlem başlamadı) |
| Platform şarkısı yok / bu hesaba ait değil | Alınmaz (işlem başlamadı) |
| Eksik veya geçersiz parametre | Alınmaz (işlem başlamadı) |
| Ses 6 dakika sınırını aşıyor | Tam iade |
| Ses indirilemiyor (genel adres değil / giriş gerekiyor) | Tam iade |
| Söz verilmedi ve sunucu tanıması başarısız | Tam iade |
| Vokal ayrıştırma işaretli ama kullanılabilir vokal kanalı yok | Tam iade (ayrıştırma ücreti dahil) |
| Hizalama servisi hatası veya zaman aşımı | Tam iade |
İlke: nihai sonuç yoksa tam iade. Ücret yalnızca karakter zaman damgaları gerçekten döndüğünde alınır ve iade otomatiktir, başvuru gerekmez.
Faturalama
| Kalem | Ne zaman alınır | Notlar |
|---|---|---|
| Söz zaman damgası kalibrasyonu (temel) | her çağrıda | çağrı başına (şu anda varsayılan 0,1 ¥); gerçek tutar arka ofis fiyat yapılandırmasına göre belirlenir |
| Deşifre ek ücreti | yalnızca söz verilmediğinde | sunucu önce ses tanıma çalıştırmalıdır; "sözlü" kademede olmayan bir maliyet olduğu için ayrı fiyatlanır |
| Vokal ayrıştırma (isteğe bağlı, yalnızca platform şarkıları) | vocal_separate işaretlendiğinde |
platformun mevcut "vokal/eşlik ayrıştırma" fiyatıyla bir kez alınır ve bu uç noktayla birlikte hesaplanır |
Birleşim:
ödenecek = temel fiyat + (söz verilmedi ? deşifre ek ücreti : 0) + (ayrıştırma işaretli ? ayrıştırma fiyatı : 0)
Vokal ayrıştırma ücreti yalnızca bir kez alınır: şarkıyı zaten ayrıştırdıysanız ve vokal kanalı doğrudan varsa bunu bu uç nokta alır; yerinde ayrıştırma gerekiyorsa ayrıştırma adımı alır.
Tam örnek (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("hizalama kalitesi coverage =", res["coverage"])
for line in res["lines"]:
print(f'{line["start"]:7.2f} {line["text"]}')
# karakter karaokesi: line["chars"] içindeki her karakterin kendi start / end değeri var
Sık sorulan sorular
S: Çıktı karakter bazlı mı satır bazlı mı?
C: İkisi de. lines[].start satır bazlı, lines[].chars[].start / end karakter bazlıdır; oynatıcı hangisi gerekiyorsa onu kullanır.
S: Dönen metin neden gönderdiğimle birebir aynı? C: Tasarım gereği. Tanıyıp yeniden yazmıyoruz, yalnızca zamanı hizalıyoruz; sözler asla "yazım hatasına düzeltilmez".
S: coverage yüksek ama yine de biraz kaymış duyuluyor.
C: Karakter hizalama hatası genelde onlarca milisaniye düzeyindedir; tüm şarkı sabit bir miktar kaymışsa büyük olasılıkla sesin başında bir sessizlik vardır; kırpıp yeniden deneyin.
S: Az önce ayrıştırma çalışıyordu, şimdi "vokal kanalı kullanılamıyor" diyor. C: Ayrıştırma sonuçları kısa ömürlü geçici adreslerdir (ölçüm: yaklaşık yarım saat sonra geçersiz olur). Bu durumda uç nokta otomatik olarak yeniden ayrıştırmayı dener; yine başarısız olursa tam iade yapılır. Yani "şimdi ayrıştır, sonra kalibre et" güvenilir değil; ikisini aynı akışta yapın.
S: Platform şarkısını kendim mi ayrıştırmalıyım?
C: Hayır. vocal_separate: true ile şarkıda zaten vokal kanalı var mı diye bakarız; kullanılabilir kanal yoksa hata verip iade ederiz, tam mixi geçiştirmeyiz.
S: Toplu yapılabilir mi? C: İstek başına bir şarkı. Toplu için döngü kurun; her çağrı normal faturalanır, sonuçları yerelde önbelleklemeniz önerilir.
S: Sonuç kaydediliyor mu? C: Bu uç nokta hiçbir şey kaydetmez; dönen değeri kendiniz saklayın (satır ve karakter zaman damgaları yanıttadır).
API anahtarı alın
Kaydolduktan sonra konsoldan bir API anahtarı oluşturun. Her üretim 0,6 ¥ tutarındadır ve 2 parça döner, indirmeler sınırsızdır ve telefon numarası gerekmez.
API anahtarı al Genel bakışa dön