واجهة معايرة الطوابع الزمنية للكلمات

آخر تحديث 2026-09-18 · فريق Suno-API

هذه ليست تعرّفاً صوتياً. النص يعتمد دائماً على كلماتك الأصلية كما أرسلتها؛ ونحن نضع كل حرف في اللحظة الصحيحة فقط — لذا لا تحدث أبداً حالة «أحرف سُمعت خطأً فانحرفت الكلمات».

وصف نقطة النهاية

تُحاذي الكلمات الموجودة مع الصوت وتعيد طوابع زمنية على مستوى السطر وعلى مستوى الحرف، لتسليط الضوء حرفاً بحرف بأسلوب الكاريوكي، والكلمات المتدحرجة، وتوليد الترجمات.

نقطة النهاية: POST /api/music/lyrics-align

المصادقة: راجع المصادقة؛ الترويسة هي Authorization: Bearer YOUR_API_KEY

الفوترة: لكل طلب (حالياً 0.1 يوان افتراضياً لكل طلب)؛ وإذا كانت أغنية من المنصة وقد حُدّد فصل الغناء، فتُحتسب مرة أخرى بسعر «فصل الغناء/الموسيقى المصاحبة» في المنصة. والمبلغ المخصوم فعلاً يتبع إعداد الأسعار في لوحة الإدارة.

الزمن المتوسط: 5–15 ثانية (حسب طول الصوت وما إذا كان فصل الغناء سيتم في اللحظة)

لماذا نحتاج المعايرة: طوابع زمنية من جهة التوليد ليست دقيقة دائماً

تعيد واجهة الكلمات ذات الطوابع الزمنية الطوابع الزمنية كلمةً كلمة من جهة التوليد مباشرةً، وهي غير دقيقة:

تعيد المعايرة بناء محاذاة الوقت على أساس الكلمات التي تقدّمها أنت: يُصحَّح الوقت فقط، ولا يُغيَّر النص أبداً — وهو مناسب للحالات التي يُهم فيها «هل ينطبق تماماً» (تسليط الضوء حرفاً بحرف كما في KTV، وترجمات لكل حرف، وتقييم الغناء معاً).

الطريقة الموصى بها (ثلاث خطوات، أفضل نتيجة)

  1. استخرج الغناء الصافي أولاً (فصل الغناء/الموسيقى المصاحبة) وحاذِ فقط مسار الغناء — فلا تزعجك الموسيقى ولا الهارموني. الأساس القياسي: في مقارنة سطراً بسطر بين «المزيج الكامل ومسار الغناء» للأغنية نفسها، اختلف 5 من 28 سطراً بأكثر من 0.25 ثانية (الأكبر 2.64 ثانية)؛ واختلف محرّكان مستقلان بمتوسط 0.239 ثانية على مسار الغناء و0.508 ثانية على المزيج الكامل — أي تناسق يقلّ للنصف تقريباً. لذا يُنصح بتشغيله لتسليط الضوء حرفاً بحرف (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_object_key بدلاً من audio_url.

الاعتماد للاستخدام مرة واحدة: بعد انتهاء المحاذاة (نجاحاً أو فشلاً) يحذف الخادم هذا الكائن، وإعادة استخدام المفتاح نفسه تُرجع خطأ.

جديد: لم تعد الكلمات إلزامية

سابقاً كانت الأغنية الخارجية تتطلب كلمات. الآن يمكن عدم إرسالها: يجري الخادم تعرّفاً واحداً ويستخدم النص المتعرَّف عليه ككلمات.

ويجب قول الثمن بوضوح: يصبح النص تابعاً لنتيجة التعرّف، وقد تكون بعض الأحرف غير دقيقة. وتُوسم هذه الاستجابات بـ 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)

القيود

البند القيد
مدة الصوت ≤ 6 دقائق (الزيادة تُرجع خطأ واسترداداً كاملاً)
مصدر الصوت يجب أن يكون قابلاً للتنزيل علناً؛ ولا تُقبل العناوين التي تحتاج جلسة دخول
تنسيق الكلمات نص عادي، أسطر بـ \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 (ويكون low دائماً عند lyrics_source=asr)
warnings[] array تنبيهات تدهور الأداء؛ وعند عدم وجود كلمات تحتوي {"code":"no_reference_lyrics"}
coverage number جودة المحاذاة: نسبة الأحرف ذات المرتكز الزمني الواضح (0–1)
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 الاستخدام المقترح
≥ 0.9 يمكن تسليط الضوء حرفاً بحرف (كاريوكي)
0.8 – 0.9 مزج بين الحرف والسطر، أو تسليط الضوء على السطر فقط والحرف للاسترشاد
< 0.8 تسليط الضوء على السطر فقط (التكرارات والهارموني الكثيف واللهجات والراب تنخفض غالباً)

الحالة والأوقات

الحالة الزمن المقيس
أغنية المنصة · دون فصل نحو 4.5 ثانية
أغنية المنصة · فصل (مسار الغناء موجود) نحو 11 ثانية
أغنية المنصة · فصل (يلزم فصله في اللحظة) نحو 25 ثانية، وحتى نحو دقيقة
أغنية خارجية · كلمات + عنوان الصوت نحو 5–15 ثانية (حسب الطول)

حد التنفيذ الواحد على الخادم 8 دقائق؛ اضبط مهلة العميل على 120 ثانية أو أكثر.

استجابات الخطأ

{
  "success": false,
  "message": "音频超过 6 分钟上限(实际 7.2 分钟)"
}
الحالة هل يُخصم؟
لا يوجد صوت (لم يُرسل أي من الثلاثة) لا يُخصم (لم تبدأ المعالجة)
إرسال audio_url وaudio_object_key معاً لا يُخصم (لم تبدأ المعالجة)
كائن الرفع المباشر لم يُحفظ بعد / حُذف لا يُخصم (لم تبدأ المعالجة)
granularity / sections / format غير صالحة لا يُخصم (لم تبدأ المعالجة)
أغنية المنصة غير موجودة / ليست لهذا الحساب لا يُخصم (لم تبدأ المعالجة)
معاملات ناقصة أو غير صالحة لا يُخصم (لم تبدأ المعالجة)
الصوت يتجاوز حد 6 دقائق استرداد كامل
الصوت غير قابل للتنزيل (عنوان غير عام / يحتاج دخولاً) استرداد كامل
لم تُرسل كلمات وفشل التعرّف على الخادم استرداد كامل
حُدّد فصل الغناء لكن لا يوجد مسار غناء قابل للاستخدام استرداد كامل (بما يشمل رسم الفصل)
خلل أو مهلة في خدمة المحاذاة استرداد كامل

المبدأ: لا نتيجة نهائية يعني استرداداً كاملاً. لا يُخصم إلا عند إعادة الطوابع الزمنية لكل حرف فعلاً، والاسترداد تلقائي دون طلب.

الفوترة

البند متى يُحتسب ملاحظات
معايرة الطوابع الزمنية للكلمات (الأساس) كل مرة لكل طلب (حالياً 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 من لوحة التحكم بعد التسجيل. كل عملية توليد تكلف 0.6 يوان وتعيد مقطوعتين، والتنزيلات غير محدودة، ولا حاجة إلى رقم هاتف.

احصل على مفتاح API العودة إلى النظرة العامة