API کالیبراسیون مهر زمانی متن ترانه
این تشخیص گفتار نیست. متن همیشه همان متن ترانه اصلی خودتان است؛ ما فقط هر نویسه را در لحظه درست میگذاریم — بنابراین «جابهجایی متن بهخاطر نویسههای اشتباه شنیدهشده» رخ نمیدهد.
توضیح نقطه پایانی
متن ترانه موجود را با صدا همتراز میکند و مهر زمانی سطح خط و سطح نویسه برمیگرداند؛ برای برجستهسازی نویسهبهنویسه سبک کاراوکه، متن ترانه چرخان و ساخت زیرنویس.
نقطه پایانی: POST /api/music/lyrics-align
احراز هویت: احراز هویت را ببینید؛ سرآیند Authorization: Bearer YOUR_API_KEY
صورتحساب: برای هر فراخوانی (فعلاً پیشفرض 0.1 یوان برای هر فراخوانی)؛ اگر آهنگ از پلتفرم باشد و جداسازی آواز را تیک بزنید، یکبار دیگر با قیمت «جداسازی آواز/موسیقی همراهی» پلتفرم حساب میشود. مبلغی که واقعاً کسر میشود تابع پیکربندی قیمت در پنل مدیریت است.
زمان میانگین: ۵ تا ۱۵ ثانیه (بسته به طول صدا و اینکه جداسازی آواز همان لحظه لازم باشد یا نه)
چرا کالیبراسیون لازم است: مهرهای زمانی سمت تولید همیشه دقیق نیستند
API متن ترانه با مهر زمانی مهرهای زمانی واژهبهواژه سمت تولید را مستقیم برمیگرداند و آنها دقیق نیستند:
- تکرارها، هارمونیهای متراکم، رپ و نتهای بلند اغلب کل بخش را جابهجا میکنند یا چند نویسه را میلغزاند؛
- بعضی آهنگها ابتدایشان یک بخش کم دارد (مثلاً مقدمه بیکلام، و اولین قطعه از ثانیه پانزدهم شروع میشود)؛
- بعضی خطوط را سخت میتوان به لنگر زمانی روشن وصل کرد.
کالیبراسیون همترازی زمانی را بر پایه متن ترانهای که خودتان میدهید از نو انجام میدهد: فقط زمان اصلاح میشود، متن هرگز — مناسب جاهایی که «درست مینشیند یا نه» مهم است (برجستهسازی نویسهبهنویسه مثل KTV، زیرنویس نویسهای، نمرهدهی همخوانی).
روش پیشنهادی (سه گام، بهترین نتیجه)
- ابتدا آواز خالص را جدا کنید (جداسازی آواز/موسیقی همراهی) و فقط مسیر آواز را همتراز کنید — موسیقی همراهی و هارمونی دیگر مزاحم نیستند. مبنای اندازهگیری: در مقایسه خطبهخط «میکس کامل در برابر مسیر آواز» از همان آهنگ، ۵ خط از ۲۸ خط بیش از ۰.۲۵ ثانیه اختلاف داشتند (بیشترین ۲.۶۴ ثانیه)؛ دو موتور مستقل روی مسیر آواز بهطور میانگین ۰.۲۳۹ ثانیه و روی میکس کامل ۰.۵۰۸ ثانیه اختلاف داشتند — یعنی همخوانی تقریباً نصف. بنابراین برای برجستهسازی نویسهای (KTV/زیرنویس) توصیه میشود روشن باشد. (میزان دقیق بهبود با موتور جدید در حال اندازهگیری مجدد است.)
- متن ترانه کامل بدهید: کل آهنگ، خطبهخط، یکبهیک با صدا. یک جمله یا بند جاافتاده همه خطوط بعدی را جابهجا میکند؛ مهر زمانیهایی مثل
[00:23.82]را در متن نگذارید (خودکار نادیده گرفته میشوند). - برای آهنگ پلتفرم کافی است
vocal_separate: trueرا تیک بزنید تا «جداسازی + همترازی» را یکمرحلهای انجام دهیم.
سه روش استفاده
| روش | چه میفرستید | متن از کجا | جداسازی آواز |
|---|---|---|---|
| آهنگ بیرونی · نشانی عمومی | audio_url + متن |
خودتان میدهید | ❌ پشتیبانی نمیشود |
| آهنگ بیرونی · بارگذاری مستقیم فایل محلی (افزودهشده 2026-10) | audio_object_key + متن |
خودتان میدهید | ❌ پشتیبانی نمیشود |
| آهنگ پلتفرم (آهنگی که در همین سایت ساخته شده) | song_id |
از سابقه آهنگ برمیداریم | ✅ اختیاری |
رابطه پارامترها (بیشترین محل اشتباه — با دقت بخوانید)
- ارسال
song_id→ مسیر آهنگ پلتفرم:lyrics/audio_url/audio_object_keyرا دیگر نفرستید؛ - ارسال
audio_urlیاaudio_object_key→ مسیر آهنگ بیرونی: فقط یکی از این دو، وsong_idرا نفرستید؛ vocal_separateتنها برای آهنگهای پلتفرم کار میکند؛ برای آهنگ بیرونی رد میشود (صدا سمت ما نیست، جداسازی ممکن نیست).
جدید: بارگذاری مستقیم فایل محلی (صدا از سرورهای ما نمیگذرد)
این را وقتی استفاده کنید که صدا روی رایانه خودتان است و نمیخواهید اول آن را به فضای ذخیرهسازی عمومی خود بفرستید. دو گام:
POST /api/music/lyrics-align/upload-ticketباfile_name/file_size/content_typeو یکput_url(نشانی امضاشده، بدون اعتبارنامه بلندمدت) وobject_keyمیگیرید؛- فایل را با
PUTبهput_urlبفرستید، وcontent_typeموجود در پاسخ را عیناً همراه ببرید (در امضا نقش دارد؛ تغییر یک نویسه یعنی 403)؛ - هنگام ارسال درخواست همترازی، بهجای
audio_urlمقدارaudio_object_keyرا بفرستید.
اعتبارنامه یکبارمصرف است: پس از پایان همترازی (موفق یا ناموفق) سرور این شیء را حذف میکند و استفاده مجدد از همان کلید خطا میدهد.
جدید: متن ترانه دیگر اجباری نیست
پیشتر آهنگ بیرونی متن لازم داشت. اکنون میتوانید نفرستید: سرور یکبار تشخیص انجام میدهد و متن تشخیصدادهشده را بهعنوان متن ترانه به کار میبرد.
باید هزینهاش را صریح گفت: متن آنگاه تابع نتیجه تشخیص است و ممکن است چند نویسه نادرست باشد. چنین پاسخهایی با
lyrics_source: "asr" و confidence: "low" علامت میخورند و در warnings[] مقدار
{"code":"no_reference_lyrics"} میآید.
برای برجستهسازی نویسهای / KTV همیشه متن اصلی را بدهید.
پارامترهای درخواست
Headers
| پارامتر | نوع | الزامی | یادداشت |
|---|---|---|---|
| Authorization | string | بله | Bearer YOUR_API_KEY |
| Content-Type | string | بله | application/json |
پارامترهای بدنه
| پارامتر | نوع | الزامی | پیشفرض | یادداشت |
|---|---|---|---|---|
| song_id | string | یکی از دو | - | شناسه آهنگ پلتفرم |
| lyrics | string | خیر | - | متن اصلی، خطوط با \n. اکنون میتوان نفرستاد |
| audio_url | string | یکی از دو برای بیرونی | - | نشانی صدا؛ باید قابل دانلود عمومی باشد |
| audio_object_key | string | یکی از دو برای بیرونی | - | کلید شیء بارگذاری مستقیم (اول /lyrics-align/upload-ticket را صدا بزنید) |
| vocal_separate | boolean | خیر | false |
آیا ابتدا آواز جدا شود (فقط آهنگهای پلتفرم) |
| language | string | خیر | تشخیص خودکار | Chinese / English و مانند آن؛ اگر نفرستید از متن حدس زده میشود |
| granularity | string | خیر | both |
both / line (بدون خروجی نویسهای) / word |
| sections | string | خیر | keep |
keep نشانههایی مثل [Chorus] را نگه میدارد (در خط زمانی شرکت نمیکنند) / drop |
| format | string | خیر | json |
json / lrc / lrc-word (دو مورد آخر متنهای lrc و lrc_word را هم میدهند) |
محدودیتها
| مورد | محدودیت |
|---|---|
| مدت صدا | حداکثر ۶ دقیقه (بیشتر خطا میدهد و بازپرداخت کامل) |
| منبع صدا | باید قابل دانلود عمومی باشد؛ نشانیهایی که ورود لازم دارند پذیرفته نمیشوند |
| قالب متن | متن ساده، خطوط با \n؛ نشانههای بند مثل [Verse] یا 【主歌】 عیناً میمانند اما در خط زمانی شرکت نمیکنند |
| دستهای | هر درخواست یک آهنگ؛ برای چند آهنگ خودتان حلقه بزنید |
| ذخیره نتیجه | این نقطه پایانی چیزی ذخیره نمیکند؛ نتیجه را خودتان نگه دارید |
نمونه درخواست
آهنگ بیرونی (متن + نشانی صدا)
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": "در خیابانهای سرد قدم میزنم\nنسیم شب چشمهایم را نوازش میدهد\nزمان چون آب میگذرد",
"audio_url": "https://your-bucket.example.com/song.mp3"
}'
آهنگ پلتفرم (بدون جداسازی)
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"}'
آهنگ پلتفرم + جداسازی آواز (برای کاراوکه توصیه میشود)
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}'
پاسخ
پاسخ موفق
{
"success": true,
"lyrics_source": "platform",
"vocal_separate": false,
"coverage": 0.935,
"exact": 196,
"fuzzy": 4,
"total": 214,
"lines": [
{
"text": "در خیابانهای سرد قدم میزنم",
"start": 21.66,
"end": 24.06,
"chars": [
{"char": "د", "start": 21.66, "end": 21.74, "word": true},
{"char": "ر", "start": 21.98, "end": 22.22, "word": true}
]
}
]
}
توضیح فیلدها
| فیلد | نوع | یادداشت |
|---|---|---|
success |
boolean | آیا درخواست موفق بود |
lyrics_source |
string | platform = متن از آهنگ پلتفرم؛ user = متن از شما؛ asr = متنی ندادید و نویسهها از تشخیص آمدهاند |
vocal_separate |
boolean | آیا این بار از جداسازی آواز گذشته است |
confidence |
string | high / low (وقتی lyrics_source=asr همیشه low) |
warnings[] |
array | هشدارهای تنزل؛ بدون متن شامل {"code":"no_reference_lyrics"} |
coverage |
number | کیفیت همترازی: نسبت نویسههای دارای لنگر زمانی روشن (۰ تا ۱) |
exact / fuzzy / total |
number | نویسههای دقیق / همآوا / نویسههای معتبر متن |
lines[].text |
string | یک خط از متن، نویسهبهنویسه برابر اصل شما |
lines[].start / end |
number | زمان شروع و پایان خط (ثانیه) |
lines[].section |
boolean | آیا این خط نشانه بند است (true = بدون زمان و بدون برجستهسازی) |
lines[].chars[] |
array | زمان هر نویسه: char، start/end ثانیه، word آیا در خط زمانی هست (نشانههای نگارشی false) |
words[] |
array | فهرست تخت نویسهای: text / start / end / line؛ با granularity=line برگردانده نمیشود |
lrc |
string | متن LRC خطی (تنها با format=lrc یا lrc-word) |
lrc_word |
string | LRC نویسهای پیشرفته با برچسبهای <mm:ss.xx> داخل خط (تنها با format=lrc-word) |
نحوه استفاده از coverage (سه سطح)
| coverage | کاربرد پیشنهادی |
|---|---|
| ≥ ۰.۹ | برجستهسازی نویسهای (کاراوکه) ممکن است |
| ۰.۸ تا ۰.۹ | ترکیب نویسهای و خطی، یا فقط برجستهسازی خطی و نویسهها تنها برای مرجع |
| < ۰.۸ | فقط برجستهسازی خطی (تکرارها، هارمونی متراکم، لهجه و رپ معمولاً پایین درمیآیند) |
وضعیت و زمانها
| سناریو | زمان اندازهگیریشده |
|---|---|
| آهنگ پلتفرم · بدون جداسازی | حدود ۴.۵ ثانیه |
| آهنگ پلتفرم · جداسازی (مسیر آواز موجود) | حدود ۱۱ ثانیه |
| آهنگ پلتفرم · جداسازی (نیاز به جداسازی همان لحظه) | حدود ۲۵ ثانیه، حداکثر حدود ۱ دقیقه |
| آهنگ بیرونی · متن + نشانی صدا | حدود ۵ تا ۱۵ ثانیه (بسته به طول) |
حد یک اجرا روی سرور ۸ دقیقه است؛ مهلت سمت کلاینت را ۱۲۰ ثانیه یا بیشتر بگذارید.
پاسخهای خطا
{
"success": false,
"message": "音频超过 6 分钟上限(实际 7.2 分钟)"
}
| سناریو | آیا هزینه میگیرد؟ |
|---|---|
| صدایی نیست (هیچکدام از سه مورد) | نمیگیرد (پردازش شروع نشده) |
ارسال همزمان audio_url و audio_object_key |
نمیگیرد (پردازش شروع نشده) |
| شیء بارگذاری مستقیم هنوز ذخیره نشده / حذف شده | نمیگیرد (پردازش شروع نشده) |
granularity / sections / format نامعتبر |
نمیگیرد (پردازش شروع نشده) |
| آهنگ پلتفرم وجود ندارد / متعلق به این حساب نیست | نمیگیرد (پردازش شروع نشده) |
| پارامتر ناقص یا نامعتبر | نمیگیرد (پردازش شروع نشده) |
| صدا بیشتر از حد ۶ دقیقه | بازپرداخت کامل |
| صدا قابل دانلود نیست (نشانی غیرعمومی / نیاز به ورود) | بازپرداخت کامل |
| متن ندادید و تشخیص سرور ناموفق بود | بازپرداخت کامل |
| جداسازی آواز تیک خورده ولی مسیر آواز قابل استفاده نیست | بازپرداخت کامل (شامل هزینه جداسازی) |
| خطا یا مهلت سرویس همترازی | بازپرداخت کامل |
اصل: بدون نتیجه نهایی، بازپرداخت کامل. هزینه تنها زمانی کسر میشود که مهرهای زمانی نویسهای واقعاً برگردند، و بازپرداخت خودکار است و درخواست لازم ندارد.
صورتحساب
| مورد | چه وقت گرفته میشود | یادداشت |
|---|---|---|
| کالیبراسیون مهر زمانی متن (پایه) | هر فراخوانی | برای هر فراخوانی (فعلاً پیشفرض 0.1 یوان)؛ مبلغ واقعی تابع پیکربندی قیمت در پنل مدیریت است |
| هزینه افزودن رونویسی | تنها وقتی متن نمیدهید | سرور باید یکبار تشخیص گفتار اجرا کند؛ هزینهای که رده «با متن» ندارد، پس جدا قیمتگذاری شده است |
| جداسازی آواز (اختیاری، فقط آهنگ پلتفرم) | وقتی vocal_separate تیک خورده |
یکبار با قیمت موجود «جداسازی آواز/موسیقی همراهی» گرفته و همراه این نقطه پایانی تسویه میشود |
ترکیب:
قابل پرداخت = قیمت پایه + (متن نمیدهید ? هزینه رونویسی : 0) + (جداسازی تیک خورده ? قیمت جداسازی : 0)
هزینه جداسازی آواز تنها یکبار گرفته میشود: اگر پیشتر جدا کردهاید و مسیر آواز مستقیماً در دسترس است، همین نقطه پایانی میگیرد؛ و اگر جداسازی همان لحظه لازم است، گام جداسازی میگیرد.
نمونه کامل (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("کیفیت همترازی coverage =", res["coverage"])
for line in res["lines"]:
print(f'{line["start"]:7.2f} {line["text"]}')
# کاراوکه نویسهای: هر نویسه در line["chars"] مقدار start / end خودش را دارد
پرسشهای رایج
پ: خروجی نویسهای است یا خطی؟
پاسخ: هر دو. lines[].start خطی است و lines[].chars[].start / end نویسهای؛ پخشکننده هر کدام را لازم دارد برمیدارد.
پ: چرا متن برگشتی دقیقاً همان چیزی است که فرستادم؟ پاسخ: طراحی همین است. ما تشخیص و بازنویسی نمیکنیم و فقط زمان را همتراز میکنیم، پس متن هرگز «به غلط املایی اصلاح» نمیشود.
پ: coverage بالاست اما هنوز کمی کج شنیده میشود.
پاسخ: خطای نویسهای معمولاً در حد دهها میلیثانیه است؛ اگر کل آهنگ با یک مقدار ثابت کج است، احتمالاً ابتدای صدا سکوت دارد — آن را ببرید و دوباره امتحان کنید.
پ: چرا همین حالا جداسازی کار میکرد و چند لحظه بعد «مسیر آواز در دسترس نیست» میگوید؟ پاسخ: نتایج جداسازی نشانیهای موقت کوتاهعمر هستند (اندازهگیری: پس از حدود نیمساعت منقضی میشوند). در این حالت نقطه پایانی خودکار دوباره جداسازی را امتحان میکند؛ اگر باز هم نشد بازپرداخت کامل انجام میشود. پس روش «اول جدا کن، بعد کالیبره کن» قابل اتکا نیست؛ هر دو را در یک جریان انجام دهید.
پ: آیا باید آهنگ پلتفرم را خودم جدا کنم؟
پاسخ: نه. با vocal_separate: true بررسی میکنیم آهنگ مسیر آواز دارد یا نه؛ اگر مسیر قابل استفاده نباشد خطا میدهیم و پول را برمیگردانیم، نه اینکه میکس کامل را جای آن بدهیم.
پ: دستهای میشود؟ پاسخ: هر درخواست یک آهنگ. برای دسته حلقه بزنید؛ هر فراخوانی عادی حساب میشود، پس نتیجهها را محلی کش کنید.
پ: نتیجه ذخیره میشود؟ پاسخ: این نقطه پایانی چیزی ذخیره نمیکند؛ مقدار برگشتی را خودتان نگه دارید (مهرهای زمانی خطی و نویسهای در پاسخ هستند).
دریافت کلید API
پس از ثبتنام از کنسول یک کلید API بسازید. هر تولید ۰٫۶ یوان هزینه دارد و ۲ قطعه برمیگرداند، دانلودها نامحدود است و به شماره تلفن نیازی نیست.
دریافت کلید API بازگشت به مرور کلی