API کالیبراسیون مهر زمانی متن ترانه

به‌روزرسانی 2026-09-18 · تیم Suno-API

این تشخیص گفتار نیست. متن همیشه همان متن ترانه اصلی خودتان است؛ ما فقط هر نویسه را در لحظه درست می‌گذاریم — بنابراین «جابه‌جایی متن به‌خاطر نویسه‌های اشتباه شنیده‌شده» رخ نمی‌دهد.

توضیح نقطه پایانی

متن ترانه موجود را با صدا هم‌تراز می‌کند و مهر زمانی سطح خط و سطح نویسه برمی‌گرداند؛ برای برجسته‌سازی نویسه‌به‌نویسه سبک کاراوکه، متن ترانه چرخان و ساخت زیرنویس.

نقطه پایانی: POST /api/music/lyrics-align

احراز هویت: احراز هویت را ببینید؛ سرآیند Authorization: Bearer YOUR_API_KEY

صورت‌حساب: برای هر فراخوانی (فعلاً پیش‌فرض 0.1 یوان برای هر فراخوانی)؛ اگر آهنگ از پلتفرم باشد و جداسازی آواز را تیک بزنید، یک‌بار دیگر با قیمت «جداسازی آواز/موسیقی همراهی» پلتفرم حساب می‌شود. مبلغی که واقعاً کسر می‌شود تابع پیکربندی قیمت در پنل مدیریت است.

زمان میانگین: ۵ تا ۱۵ ثانیه (بسته به طول صدا و اینکه جداسازی آواز همان لحظه لازم باشد یا نه)

چرا کالیبراسیون لازم است: مهرهای زمانی سمت تولید همیشه دقیق نیستند

API متن ترانه با مهر زمانی مهرهای زمانی واژه‌به‌واژه سمت تولید را مستقیم برمی‌گرداند و آن‌ها دقیق نیستند:

کالیبراسیون هم‌ترازی زمانی را بر پایه متن ترانه‌ای که خودتان می‌دهید از نو انجام می‌دهد: فقط زمان اصلاح می‌شود، متن هرگز — مناسب جاهایی که «درست می‌نشیند یا نه» مهم است (برجسته‌سازی نویسه‌به‌نویسه مثل KTV، زیرنویس نویسه‌ای، نمره‌دهی همخوانی).

روش پیشنهادی (سه گام، بهترین نتیجه)

  1. ابتدا آواز خالص را جدا کنید (جداسازی آواز/موسیقی همراهی) و فقط مسیر آواز را هم‌تراز کنید — موسیقی همراهی و هارمونی دیگر مزاحم نیستند. مبنای اندازه‌گیری: در مقایسه خط‌به‌خط «میکس کامل در برابر مسیر آواز» از همان آهنگ، ۵ خط از ۲۸ خط بیش از ۰.۲۵ ثانیه اختلاف داشتند (بیشترین ۲.۶۴ ثانیه)؛ دو موتور مستقل روی مسیر آواز به‌طور میانگین ۰.۲۳۹ ثانیه و روی میکس کامل ۰.۵۰۸ ثانیه اختلاف داشتند — یعنی هم‌خوانی تقریباً نصف. بنابراین برای برجسته‌سازی نویسه‌ای (KTV/زیرنویس) توصیه می‌شود روشن باشد. (میزان دقیق بهبود با موتور جدید در حال اندازه‌گیری مجدد است.)
  2. متن ترانه کامل بدهید: کل آهنگ، خط‌به‌خط، یک‌به‌یک با صدا. یک جمله یا بند جاافتاده همه خطوط بعدی را جابه‌جا می‌کند؛ مهر زمانی‌هایی مثل [00:23.82] را در متن نگذارید (خودکار نادیده گرفته می‌شوند).
  3. برای آهنگ پلتفرم کافی است vocal_separate: true را تیک بزنید تا «جداسازی + هم‌ترازی» را یک‌مرحله‌ای انجام دهیم.

سه روش استفاده

روش چه می‌فرستید متن از کجا جداسازی آواز
آهنگ بیرونی · نشانی عمومی audio_url + متن خودتان می‌دهید ❌ پشتیبانی نمی‌شود
آهنگ بیرونی · بارگذاری مستقیم فایل محلی (افزوده‌شده 2026-10) audio_object_key + متن خودتان می‌دهید ❌ پشتیبانی نمی‌شود
آهنگ پلتفرم (آهنگی که در همین سایت ساخته شده) song_id از سابقه آهنگ برمی‌داریم ✅ اختیاری

رابطه پارامترها (بیشترین محل اشتباه — با دقت بخوانید)

جدید: بارگذاری مستقیم فایل محلی (صدا از سرورهای ما نمی‌گذرد)

این را وقتی استفاده کنید که صدا روی رایانه خودتان است و نمی‌خواهید اول آن را به فضای ذخیره‌سازی عمومی خود بفرستید. دو گام:

  1. POST /api/music/lyrics-align/upload-ticket با file_name / file_size / content_type و یک put_url (نشانی امضاشده، بدون اعتبارنامه بلندمدت) و object_key می‌گیرید؛
  2. فایل را با PUT به put_url بفرستید، و content_type موجود در پاسخ را عیناً همراه ببرید (در امضا نقش دارد؛ تغییر یک نویسه یعنی 403)؛
  3. هنگام ارسال درخواست هم‌ترازی، به‌جای 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 بسازید. هر تولید ۰٫۶ یوان هزینه دارد و ۲ قطعه برمی‌گرداند، دانلودها نامحدود است و به شماره تلفن نیازی نیست.

دریافت کلید API بازگشت به مرور کلی