【موصى به】 واجهة الملف الصوتي الشخصي
✅ نوصي بهذا المسار للتكاملات الجديدة. بحسب تقييمات فعلية من مستخدمين كثيرين، الأغاني المولَّدة عبر هذا المسار تحافظ على الصوت الأصلي بدرجة عالية: تصبح الأصوات في الملف النهائي أقرب إلى الشخص في النموذج الذي رفعته، لذلك هو المسار الذي نوصي به للعملاء حالياً.
للمقارنة: واجهة استنساخ الصوت والتوليد بصوت محدد السابقة ما زالت تعمل، لكن القائمة تضع عليها وسم «غير موصى به» ولم تعد موصى بها للتكاملات الجديدة.
- تاريخ المستند: 2026-09-26
- النطاق: إنشاء صوتك الخاص → استخدامه لعمل كوفر لأغنية محددة / غناء أغنية جديدة → متابعة التقدّم → تنزيل الناتج
- جميع نقاط النهاية والحقول والاستجابات تحقّقت بنداءات حقيقية (ما وُسم بـ«مقيس» تم التحقق منه بالتفصيل)
ملاحظة: هذا المستند يشرح فقط نقاط النهاية التي تستدعيها. معالجة المواد وجدولة المهام وفحص المحتوى يقوم بها الخادم تلقائياً؛ العميل لا ينفذها.
0. البدء في خمس دقائق
أربع خطوات تكفي لتحويل نموذج صوتي واحد إلى أغنيتين جاهزتين.
① إنشاء الصوت POST /api/music/voice-profile/create → احصل على voice_id (status=ready)
② عمل كوفر POST /api/music/voice-profile/cover → احصل فوراً على song_id اثنين
③ المتابعة POST /api/music/query → استعلم حتى status=completed
④ التنزيل GET /api/music/download?song_id=…&kind=mp3
أصغر مثال عامل (curl):
API_KEY="sk-مفتاحك"
BASE="https://www.suno-api.io"
# ① إنشاء الصوت (ارفع نموذجاً صوتياً؛ يُفضَّل 10 ثوانٍ أو أكثر، أقل من 10 ميجابايت)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3" \
-F "title=صوتي" \
-F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}
# ② اعمل كوفر لأغنية بهذا الصوت (song_clip_id = معرّف clip للأغنية المطلوب كوفرها)
curl -sS -X POST "$BASE/api/music/voice-profile/cover" \
-H "Authorization: Bearer $API_KEY" \
-H "X-Create-Ui-Client-Request-Id: cover-$(date +%s)" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"voice_id": "vp_2026…",
"song_clip_id": "5b773e9a-…",
"lyrics": "[Verse 1]\nنص الكلمات…",
"style_requirements": "فولك بطيء، جيتار أكوستيك",
"audio_weight": 0.85,
"max_mode": false
}'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}
# ③ الاستعلام (أرسل عدة معرّفات مرة واحدة، مفصولة بفواصل)
curl -sS -X POST "$BASE/api/music/query" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"suno-v6","song_ids":"id1,id2"}'
# ④ نزّل mp3 بعد الانتهاء (الملف متاح فقط عند status=completed)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song1.mp3
1. الأعراف المشتركة
1.1 النطاق والبيئة
| البيئة | Base URL | الاستخدام |
|---|---|---|
| الإنتاج | https://www.suno-api.io |
حركة العملاء الفعلية |
كل المسارات أدناه نسبية بالنسبة إلى Base URL؛ مثلاً العنوان الكامل لـ POST /api/music/voice-profile/create هو
https://www.suno-api.io/api/music/voice-profile/create.
1.2 المصادقة
كل نقاط النهاية تستخدم الترويسة نفسها، وقيمتها مفتاح API الذي أنشأته في لوحة التحكم:
Authorization: Bearer sk-xxxxxxxx
- بادئة
Bearerاختيارية، وبادئةsk-كذلك (Authorization: sk-xxxيعمل أيضاً). - المفتاح مفقود أو غير صالح → HTTP 401، والجسم بالشكل
{"success":false,"message":"…"}(النص يتغيّر حسب لغة الطلب). - كل مفتاح يرى ويعالج فقط أغاني وصوت حسابه هو.
1.3 صيغ جسم الطلب
- إنشاء صوت: يُفضَّل
multipart/form-data(رفع ملف)؛ ويدعمapplication/json(رابط أو base64). - بقية نقاط النهاية:
application/json.
1.4 غلافا الاستجابة (على العميل معرفة هذين فقط)
نقاط نهاية «إدارة الأصوات» (create / create-from-clip / list / detail / delete) تستخدم غلاف الأعمال:
{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }
«الكوفر بالصوت» يمر عبر قناة التوليد ويستخدم غلاف التوليد: النجاح code/message/data، والفشل كائن error:
{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }
كيف تقرر: انظر أولاً إلى رمز حالة HTTP، ثم success === false، وأخيراً code !== 200 أو وجود error.
فشل العمل لا يضمن أن يكون HTTP غير 200 (نقاط إدارة الأصوات ترد HTTP 200 حتى عند الخطأ)، لذلك لا تعتمد على رمز الحالة وحده.
1.5 منع التكرار (idempotency)
إنشاء الصوت (بما في ذلك «الإنشاء من صوت موجود») تكراره آمن فعلاً: تحت المفتاح نفسه، إعادة إرسال client_request_id نفسه تنشئ صوتاً واحداً فقط، والمحاولة الثانية تعيد نتيجة الأولى مباشرة (success=true، وvoice_id نفسه). الطريقة المقصودة أن يولّد العميل معرّفاً بنفسه (مثل UUID) ويعيد استخدام القيمة نفسها عند إعادة المحاولة بعد انتهاء المهلة.
إرسال الكوفر لا يزيل التكرار على مستوى الطلب (فهو توليد مدفوع)، لذا انتبه لأمرين:
- معرّف الإرسال يوضع في الترويسة
X-Create-Ui-Client-Request-Id: <معرّف إرسالك>. يُكتب في سجل المهمة على الخادم لتسهيل الفحص لاحقاً؛ لكنه لا يمنع خصماً مكرراً. - انتهاء المهلة ≠ فشل: قد يكون الطلب قُبل فعلاً ويجري التوليد. قبل إعادة المحاولة افحص بـ
GET /api/music/songs?p=1&page_size=20(معاملات الترقيمp/page_size، والصيغة المتوافقةpsتعمل أيضاً) هل ظهرت أغنية جديدة بـgeneration_type=voice_profile_cover، وأعد الإرسال فقط إن لم تظهر.
جسم create وcreate-from-clip يقبل أيضاً الحقل client_request_id (انظر §3 و§4).
1.6 نظرة عامة على الفوترة
| الإجراء | نقطة النهاية | السعر | ملاحظات |
|---|---|---|---|
| إنشاء صوت (عادي) | POST /api/music/voice-profile/create |
مجاني | رفع النموذج لا يستهلك رصيد Suno |
| إنشاء صوت (من صوت موجود) | POST /api/music/voice-profile/create-from-clip |
مجاني | الخادم يسجّل مرجعاً للمادة فقط، دون رفع جديد |
| الاستنساخ المعزّز | نفسه، enhanced=true |
بسعر «الرفع المعزّز» (افتراضياً 10 يوان لكل طلب) | غير متزامن؛ يُرد المبلغ تلقائياً عند الفشل |
| الكوفر بالصوت | POST /api/music/voice-profile/cover |
1.2 يوان لكل طلب؛ و2.4 يوان عند max_mode=true |
الطلب الواحد يُنتج أغنيتين |
| الاستعلام / القائمة / التفاصيل / الحذف | — | مجاني | |
| التنزيل (تأخذ الرابط المباشر بنفسك) | audio_url في الاستجابة |
مجاني | تشغيل العنوان الصادر |
| التنزيل (تحويل إلى wav / كلمات إلخ) | POST /api/music/free2 |
0.2 يوان لكل أغنية ناجحة | انظر §8 |
يمكن قراءة الأسعار في أي وقت من نقطة نهاية عامة، فلا تكتبها ثابتة (انظر §9):
curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
# "generation_price": "0.6",
# "voice_generation_price": "1.2", ← السعر الأساسي للكوفر بالصوت
# "max_mode_factor": "2",
# "enhanced_upload_price": "10", ← سعر الاستنساخ المعزّز
# "voice_auto_verify_price": "5",
# "voice_long_term_clone_price": "5"
# }
الكوفر يعمل بنمط خصم مسبق + إعادة المبلغ عند الفشل:
- الطلب المرفوض (معاملات خاطئة، أو 4xx/5xx من المنصة، أو الرصيد غير الكافي في ذاته) لا يُخصم منه — وعند الإرسال بصوت غير موجود لم يتغيّر الرصيد إطلاقاً في قياساتنا (delta = 0)؛
- المهمة المقبولة التي تفشل في النهاية (بما في ذلك خلل خدمة المنصة) تمر عبر مسار الإرجاع على الخادم وتعيد المبلغ المخصوم مسبقاً.
1.7 قاموس الحالات
status الخاصة بالصوت:
| القيمة | المعنى | صالح للكوفر |
|---|---|---|
ready |
جاهز | ✅ |
processing |
يظهر مع الاستنساخ المعزّز فقط (enhanced=true)؛ قيد المعالجة |
❌ (انتظر ready) |
failed |
فشل الإنشاء؛ راجع error_message؛ والاستنساخ المعزّز قد أُعيد مبلغه |
❌ |
status الخاصة بالأغنية (القيمة التي تعيدها نقاط الاستعلام):
| القيمة | المعنى | قابل للتنزيل |
|---|---|---|
submitted / queued / processing |
قيد التوليد (قد يكون هناك بث معاينة) | ❌ |
completed |
انتهى | ✅ |
failed |
فشل؛ أُعيد المبلغ | ❌ |
2. نظرة عامة على نقاط النهاية
| # | الطريقة | المسار | الوظيفة | الفوترة |
|---|---|---|---|---|
| 1 | POST | /api/music/voice-profile/create |
إنشاء صوت (رفع / رابط / base64) | مجاني (عدا enhanced=true) |
| 2 | POST | /api/music/voice-profile/create-from-clip |
إنشاء صوت من صوت موجود لديك | مجاني |
| 3 | GET | /api/music/voice-profile/list |
قائمة الأصوات | مجاني |
| 4 | GET | /api/music/voice-profile/{voice_id} |
تفاصيل الصوت (مع تقدّم الاستنساخ المعزّز) | مجاني |
| 5 | POST | /api/music/voice-profile/delete |
حذف صوت | مجاني |
| 6 | POST | /api/music/voice-profile/cover |
كوفر بالصوت / غناء أغنية جديدة | 1.2 يوان (MAX 2.4) |
| 7 | POST | /api/music/query |
استعلام حالة الأغاني دفعة واحدة | مجاني |
| 8 | GET | /api/music/songs/{song_id} |
تفاصيل أغنية واحدة | مجاني |
| 9 | GET | /api/music/download |
تنزيل الملف النهائي | مجاني (mp3/رابط تشغيل) |
| 10 | POST | /api/music/free2 |
تحويل إلى wav / كلمات إلخ | 0.2 يوان لكل أغنية ناجحة |
| 11 | POST | /api/music/free2/cached |
جلب عنوان تنزيل مؤرشف مسبقاً | مجاني |
| 12 | GET | /api/music/songs |
قائمة أعمالي، مع ترقيم | مجاني |
3. إنشاء صوت
POST /api/music/voice-profile/create
سجّل مقطعاً صوتياً غنائياً كـ«صوت» واحصل على voice_id. بالنسبة للمنصة، الصوت ليس إلا «ملف صوتي + معرّف clip له في المكتبة»، لذلك بعد نجاح الإنشاء يبقى ملف الصوت المصدر محفوظاً بشكل دائم (لاستخدامه في الكوفرات اللاحقة).
3.1 ثلاث صيغ للإدخال (اختر واحدة)
الصيغة أ: رفع ملف multipart (موصى بها)
Content-Type: multipart/form-data
file=<بيانات الصوت الثنائية> # إلزامي
title=<اسم الصوت> # اختياري؛ إن كان فارغاً يُستخدم اسم الملف دون الامتداد
file_name=<اسم الملف الأصلي>
source_file_name=<اسم الملف الأصلي>
source_kind=upload|record # اختياري، علامة المصدر (رفع / تسجيل)؛ الافتراضي upload
enhanced=false|true # اختياري، true = الاستنساخ المعزّز (انظر §3.5)
client_request_id=<مفتاح منع التكرار> # اختياري
voice_id=<معرّف خاص> # اختياري، نادر الاستخدام
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3;type=audio/mpeg" \
-F "file_name=my-voice.mp3" \
-F "source_file_name=my-voice.mp3" \
-F "title=صوتي" \
-F "source_kind=upload"
الصيغة ب: JSON + رابط صوت عام
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"file_url": "https://your-cdn.example.com/voice/my-voice.mp3",
"file_name": "my-voice.mp3",
"title": "صوتي"
}'
- يجب أن يكون الرابط مباشراً عبر HTTPS ومتاحاً للعامة؛ ينزّله الخادم مرة واحدة وينقله إلى تخزين الكائنات لدينا.
- يمكن أيضاً وضع العنوان في الحقل
audio_urlوالنتيجة نفسها (عند إرسال الاثنين يُعتمدfile_url). - إذا كان العنوان موجوداً أصلاً في تخزين كائنات هذه المنصة (
*.myqcloud.com/create-ui/voice-source/...) فلا يُنزَّل مرة أخرى: يُسجَّل مباشرة.
الصيغة ج: JSON + base64
{
"file_base64": "data:audio/mpeg;base64,//uQxAAA…",
"file_name": "my-voice.mp3",
"title": "صوتي"
}
- يدعم البادئة
data:audio/xxx;base64,و base64 الخالص. - الحجم محدود (base64 يضخّم 1.33 مرة)، للملفات الكبيرة استخدم الصيغة أ.
3.2 متطلبات الصوت
| البند | المتطلب | ملاحظات |
|---|---|---|
| الحجم | ≤ 10 ميجابايت | عند التجاوز تقطع البوابة الجسم وتظهر النتيجة كأنها «مرفوضة من Suno»؛ اضغط أو اقتطع أولاً |
| المدة | 6 ثوانٍ على الأقل؛ يُفضَّل 10–60 ثانية | أقل من 6 ثوانٍ ترفضه المنصة: Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
| الصيغة | mp3 / wav / m4a / aac / flac / ogg | يُحدَّد من امتداد الملف |
| المحتوى | صوت غنائي نظيف؛ تجنّب الكوفرات النهائية أو الأغاني الأصلية بموسيقى مصاحبة | الصوت الشبيه جداً بتسجيل موجود في المكتبة يُرفض: This audio matches an existing recording in our catalog. (مقيس) |
3.3 الاستجابة
{
"success": true,
"message": "",
"data": {
"voice_id": "vp_20260926080618509168500DXXrxe",
"clip_id": "91cc5935-389f-4193-b56b-cc796c15562d",
"song_id": "91cc5935-389f-4193-b56b-cc796c15562d",
"account_id": "acc_1790085275308",
"title": "صوتي",
"source_file_name": "my-voice.mp3",
"audio_url": "https://suno-api-p-1437223057.cos.ap-guangzhou.myqcloud.com/create-ui/voice-source/2026/09/26/xxx.mp3",
"image_url": "https://cdn2.suno.ai/image_91cc5935-389f-4193-b56b-cc796c15562d.jpeg",
"duration_s": 29.18,
"enhanced": false,
"source_kind": "upload",
"status": "ready",
"client_request_id": "",
"created_at": 1790409978,
"updated_at": 1790409998
}
}
شرح الحقول (create / list / detail تشترك في المجموعة نفسها):
| الحقل | النوع | ملاحظات |
|---|---|---|
voice_id |
string | معرّف الصوت؛ تستخدمه الكوفرات لاحقاً |
clip_id / song_id |
string | معرّف clip لهذا الصوت على جانب Suno (القيمتان متطابقتان)؛ للفحص |
account_id |
string | معرّف الحساب المستضيف (للفحص؛ لا يهم العميل) |
title |
string | اسم الصوت |
source_file_name |
string | اسم الملف الأصلي |
audio_url |
string | رابط مباشر طويل الأمد لملف الصوت المصدر، يصلح للمعاينة؛ محفوظ بشكل دائم |
image_url |
string | غلاف الصوت (الذي تولّده Suno للصوت الغنائي)؛ وعند عدم وجود غلاف لا يظهر هذا المفتاح إطلاقاً |
duration_s |
number | طول نموذج الصوت بالثواني |
enhanced |
bool | هل أُنشئ بالاستنساخ المعزّز |
source_kind |
string | upload / record / clip (من صوت موجود) |
status |
string | ready / processing / failed |
error_message |
string | سبب الفشل؛ يظهر فقط عند failed |
task_id |
number | رقم المهمة الأساسية للاستنساخ المعزّز؛ قيمة فقط عند enhanced=true |
pre_consumed_quota |
number | المبلغ المخصوم مسبقاً (فقط عند الاستنساخ المعزّز) |
created_at / updated_at |
number | ثوانٍ Unix |
created_at/updated_atطوابع زمنية بمستوى الثانية (10 أرقام)، لا بالميلي ثانية.
3.4 أخطاء شائعة
| HTTP | message | السبب والمعالجة |
|---|---|---|
| 200 | one of file_path, file_base64, or file_url is required |
لم يُرفَق محتوى صوتي |
| 200 | Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
النموذج قصير جداً؛ استخدم ≥6 ثوانٍ (يُفضَّل ≥10) |
| 200 | This audio matches an existing recording in our catalog. |
النموذج شبيه جداً بتسجيل موجود في المكتبة؛ استخدم صوتاً جافاً نظيفاً آخر |
| 200 | upload succeeded without clip or account identity |
ردّ المنصة غير طبيعي؛ أعد المحاولة |
| 200 | audio file exceeds 30 MB limit |
تجاوز حدّ الخادم (للعملاء التزم بـ10 ميجابايت) |
| 401 | invalid token |
مفتاح API خاطئ |
3.5 الاستنساخ المعزّز (enhanced=true)
لحالات «النموذج الصوتي نفسه يحمل كلمات محمية بحقوق النشر / يلزم رفع معزّز». السعر سعر الرفع المعزّز (افتراضياً 10 يوان لكل طلب، ويُرد تلقائياً عند الفشل):
- الاستجابة تكون فوراً
status=processing+task_id(بلاclip_idبعد) وتعمل بشكل غير متزامن؛ - أثناء المعالجة تابع بـ
GET /api/music/voice-profile/{voice_id}الذي يعيدprogress_percent/progress_stage/progress_message؛ - عند الانتهاء يصبح
statusهوreadyوتُكملclip_idوaudio_urlوimage_url؛ - عند الفشل يصبح
status=failedويكونerror_messageنحو «فشل الرفع المعزّز؛ أُعيد المبلغ تلقائياً، أعد المحاولة لاحقاً»؛ - الاستنساخ المعزّز أطول بوضوح من الإنشاء العادي (دقائق)، فلا تنتظره بمنطق مهلة متزامن.
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3" -F "title=صوتي" -F "enhanced=true"
4. إنشاء صوت من ملف صوتي موجود
إن لم ترغب في الرفع مرة أخرى: انسخ مباشرة ملفاً صوتياً رفعته سابقاً أو ولّدته سابقاً إلى صوت. مجاني ومنع تكراره آمن.
POST /api/music/voice-profile/create-from-clip
Content-Type: application/json
{
"source_song_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
"title": "Xu Qing Qiang",
"client_request_id": "vp-clip-1789…"
}
source_song_id: معرّف clip لملف صوتي منتهٍ في حسابك (مثلsong_idللأغنية).- إعادة إرسال clip نفسه لا تنشئ سجلاً جديداً: يُعاد الصوت الموجود مباشرة مع
reused: true(مقيس).
الاستجابة كل حقول §3.3 مع حقلي قراءة فقط:
| الحقل | ملاحظات |
|---|---|
reused |
true = هذا الملف كان صوتك سابقاً ويُستخدم من جديد |
source_type |
مصدر الصوت: generate / custom_generate / voice_generate / upload_source / enhanced_upload |
{
"success": true,
"data": {
"voice_id": "vp_20260926081712557959800Z5gvlt",
"clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
"title": "Xu Qing Qiang",
"status": "ready",
"enhanced": true,
"reused": true,
"source_type": "enhanced_upload"
}
}
الأخطاء (message كما تُعاد؛ يُفضَّل عرضها أو ترجمتها):
| message | المعنى |
|---|---|
source audio not found |
المقطع غير موجود أو ليس ملكك |
source audio is invalid |
ذلك الصوت ما زال قيد التوليد / ناتج وسيط ولا يصلح بعد |
source_song_id is required |
لم يُرسل source_song_id |
5. القائمة / التفاصيل / الحذف
5.1 القائمة
GET /api/music/voice-profile/list
GET /api/music/voice-profile/list?include_deleted=true
{
"success": true,
"message": "",
"data": {
"items": [ { "voice_id": "vp_…", "title": "صوتي", "status": "ready", "audio_url": "…", "image_url": "…" } ],
"total": 1
}
}
الحقول مطابقة تماماً §3.3. لا تُعاد الأصوات المحذوفة افتراضياً.
5.2 التفاصيل
GET /api/music/voice-profile/{voice_id}
تعيد كائن صوت واحداً (data هو الكائن نفسه لا مصفوفة). وأثناء عمل الاستنساخ المعزّز تُضاف:
| الحقل | ملاحظات |
|---|---|
progress_percent |
عدد صحيح من 0 إلى 100 |
progress_stage |
معرّف المرحلة، مثل media_preparing |
progress_message |
نص التقدّم المعروض للمستخدم |
5.3 الحذف
POST /api/music/voice-profile/delete
Content-Type: application/json
{ "voice_id": "vp_2026…" }
{ "success": true, "message": "", "data": { "voice_id": "vp_2026…", "status": "deleted" } }
- بعد الحذف يختفي الصوت من القائمة ولا يمكن استخدامه في كوفرات جديدة: الإرسال بـ
voice_idنفسه يعيد 400 (انظر §6.4). - الأغاني التي أُنتجت به سابقاً لا تتأثر إطلاقاً؛ التشغيل والتنزيل والاستكمال والاستبدال وفصل المسارات تعمل كما هي.
- حذف صوت غير موجود، أو لا يخص هذا الحساب، يعيد
{"success":false,"message":"voice not found"}.
6. الكوفر بالصوت (نقطة النهاية المحورية)
POST /api/music/voice-profile/cover
Content-Type: application/json
إرسال واحد يولّد أغنيتين (مثل التوليد العادي).
6.1 سيناريوهان
| السيناريو | الشرط | الشرح |
|---|---|---|
| أ. كوفر أغنية محددة | أُرسل song_clip_id |
يغني تلك الأغنية بصوتك (اللحن / الإيقاع / المقاطع كما الأصل؛ والصوت يصبح صوتك) |
| ب. غناء أغنية جديدة بالصوت | لم يُرسل song_clip_id |
يُعطى الصوت + كلمات (اختياري) + متطلبات الأسلوب؛ فيؤلّف النموذج لحناً جديداً بالأسلوب ذاته ويغنيه |
يعكس resolved_scene في الاستجابة قيمة cover أو sing، فتعرف أي مسار سُلك.
6.2 حقول الطلب
| الحقل | النوع | إلزامي | الافتراضي | ملاحظات |
|---|---|---|---|---|
model |
string | نعم | — | اسم النموذج للعميل، انظر §6.5. دونه يعيد model is required (HTTP 500) |
voice_id |
string | أحدهما | — | معرّف الصوت (vp_…)؛ يجب أن يكون status=ready |
voice_clip_id |
string | أحدهما | — | يمكن استخدام معرّف clip للصوت؛ وعند إرسال الاثنين يُعتمد voice_id |
song_clip_id |
string | لا | فارغ | معرّف clip (song_id) للأغنية المطلوب كوفرها. عدم الإرسال = السيناريو ب |
lyrics |
string | لا | فارغ | الكلمات كاملة، تُرسل حرفاً بحرف دون إعادة كتابة أو قطع؛ ≤ 3000 حرف |
cover_requirements |
string | لا | فارغ | متطلبات الكوفر بلغة طبيعية، مثل «نطق أوضح». تُدمج في prompt ثابت |
style_requirements |
string | لا | فارغ | متطلبات الأسلوب، مثل «فولك بطيء، جيتار أكوستيك» |
title |
string | لا | فارغ | عنوان الأغنيتين في مساحة العمل (يؤثر على song_title في الاستعلامات اللاحقة) |
negative_tags |
string | لا | فارغ | أساليب مستبعدة، مثل إلكتروني, راب؛ ≤ 1000 حرف |
vocal_gender |
string | لا | فارغ | m / f (ويقبل male / female)؛ فارغ = غير محدد |
duration |
number | لا | فارغ | المدة المرغوبة بالثواني، عدد صحيح من 1 إلى 480؛ فارغ = المنصة تقرر. الحد العملي الأدنى للمنصة نحو 30 ثانية: القيم الأصغر أنتجت في القياسات أغنيات بنحو 30 ثانية |
audio_weight |
number | لا | 0.85 | Audio Influence، كسر عشري من 0 إلى 1. الأعلى يقرب من نموذج الصوت |
style_weight |
number | لا | فارغ | تأثير الأسلوب، كسر عشري من 0 إلى 1 |
weirdness_constraint |
number | لا | فارغ | الإبداعية، كسر عشري من 0 إلى 1 (إن كانت الواجهة بالنسبة المئوية فاقسم على 100) |
variety |
number | لا | فارغ | التنوّع، عدد صحيح من 0 إلى 4 (ليس نسبة مئوية)، مدعوم في سلسلة v6 فقط |
max_mode |
boolean | لا | false |
Max Mode، السعر ×2 |
client_request_id |
string | لا | فارغ | معرّف الإرسال، يُكتب في سجل المهمة على الخادم للفحص (لا يمنع التكرار) |
يُفضَّل إرسال الترويسة X-Create-Ui-Client-Request-Id: <المعرّف نفسه> أيضاً: فهي وحدها تُكتب في سجل المهمة على الخادم وتكون مفتاحاً أساسياً للفحص لاحقاً (انظر §1.5).
تنبيه على الوحدات: audio_weight / style_weight / weirdness_constraint كسور من 0 إلى 1، وvariety عدد صحيح من 0 إلى 4، وduration بالـثواني. الخلط بينها يؤدي إلى الرفض أو نتائج غريبة.
الكلمات اختيارية في السيناريو ب (النموذج يتولى الأمر)، لكن أرسل lyrics دائماً عندما تريد غناء محتوى معين.
6.3 الاستجابة
{
"code": 200,
"message": "success",
"data": {
"voice_id": "vp_20260926081712557959800Z5gvlt",
"voice_clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
"song_clip_id": "5b773e9a-a035-4134-a4a4-29c9961d3ccb",
"resolved_scene": "cover",
"model": "suno-v6",
"audio_weight": 0.85,
"clips": [
{
"song_id": "0f2a…",
"status": "processing",
"song_title": "",
"model_version": "suno-v6",
"audio_url": "",
"play_url": "https://media.suno-api.io/play/0f2a…?expires=…&signature=…",
"lyrics": "",
"description": "[مهمة] هذا كوفر. … (الجزء البنيوي الثابت من الخادم + متطلبات الكوفر / الأسلوب التي أدخلتها)"
},
{
"song_id": "7c91…",
"status": "processing",
"model_version": "suno-v6",
"audio_url": ""
}
],
"source_updates": []
}
}
النقاط المهمة:
- حدّد النواتج النهائية عبر
clips[].song_id(هذه النقطة لا تعيد الحقلid). - تحصل فوراً على قيمتَي
song_id، وstatusما زالprocessing(يعني القبول فقط) وaudio_urlفارغاً؛ ولا بد من الاستعلام حتىcompletedقبل التنزيل. أماplay_urlفهو بث المعاينة من المنصة، وقد يظهر من مرحلة الإرسال وسينتهي. descriptionهو الـ prompt الذي يرسله الخادم في النهاية (الجزء البنيوي الثابت + ما أدخلته فيcover_requirements/style_requirements)؛ ومفيد جداً عند تحليل النواتج.source_updatesنتيجة معالجة المواد على الخادم، ويمكن للعميل تجاهلها.titleالذي ترسله يُكتب في سجل المهمة على الخادم ويظهر كـsong_titleفي الاستعلامات اللاحقة؛ وكونclips[].song_titleفارغاً في ردّ الإرسال أمر طبيعي.
6.4 الأخطاء
{ "error": { "message": "هذا الصوت غير موجود أو تم حذفه (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
| HTTP | message | السبب |
|---|---|---|
| 500 | model is required |
الجسم بلا model (حقل إلزامي لاختيار القناة) |
| 400 | voice_id is required and must be a ready voice |
لم يُرسل voice_id، أو أُرسلت قيمة حجز مؤقت / صوت غير جاهز |
| 400 | هذا الصوت غير موجود أو تم حذفه (voice_id=vp_xxx)… |
الصوت محذوف أو غير موجود أو لا يخص الحساب الحالي. استخدم صوتاً آخر متاحاً أو أنشئ صوتاً جديداً |
| 400 | هذا الصوت تم حذفه (voice_id=vp_xxx)… |
عند تمرير المادة مباشرة بـ voice_clip_id، يكون صوت تلك المادة قد حُذف؛ والمعالجة كما سبق |
| 400 | voice is not ready yet (status=processing) |
الصوت ما زال قيد الإنشاء؛ انتظر ready وأعد المحاولة |
| 400 | song_clip_id must be a real completed clip |
song_clip_id حجز مؤقت / غير منتهٍ |
| 400 | song_clip_id must differ from the voice clip |
لا يمكن أن يكون هدف الكوفر هو نموذج الصوت نفسه |
| 400 | audio_weight must be a number between 0 and 1 |
وحدة المنزلق خاطئة (أُرسلت نسبة مئوية) |
| 400 | duration must be an integer between 1 and 480 seconds |
المدة ليست عدداً صحيحاً من 1 إلى 480 |
| 400 | vocal_gender must be one of m, f, male, female |
قيمة جنس غير صالحة |
| 400 | variety must be an integer between 0 and 4 / variety is only supported on v6 models |
قيمة التنوّع غير صالحة أو النموذج غير مدعوم |
قلة الرصيد تُعيد خطأ فوترة مباشرة عند الإرسال ولا تترك مهمة نصف منتهية.
6.5 النماذج المتاحة (أسماء العملاء)
| اسم النموذج | ملاحظات |
|---|---|
suno-v6 |
الافتراضي، موصى به |
suno-v6-wild |
أكثر انطلاقاً |
suno-v6-mini |
خفيف |
استخدم أسماء النماذج المخصّصة للعملاء (الواردة أعلاه). أما chirp-* فهي أسماء داخلية للمنصة ولا تُستخدم مباشرة.
7. متابعة التقدّم
7.1 استعلام دفعة واحدة (موصى به)
POST /api/music/query
Content-Type: application/json
{ "model": "suno-v6", "song_ids": "id1,id2" }
song_idsسلسلة مفصولة بفواصل (ليست مصفوفة).- الاستجابة مصفوفة مجرّدة (تبدأ بـ
[...]مباشرة، بلا غلافsuccess/data):
[
{
"song_id": "0f2a…",
"song_title": "نمران",
"status": "completed",
"audio_url": "https://suno-api-hk-1437223057.cos.ap-hongkong.myqcloud.com/assets/0f2a…-mp3.mp3",
"cover_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
"duration": 115.15,
"model_version": "suno-v6",
"generation_type": "voice_profile_cover",
"play_url": "https://media.suno-api.io/play/…?expires=…&signature=…",
"lyrics": "[Verse 1]…",
"prompt": "[Verse 1]…",
"description": "[مهمة] هذا كوفر. … (prompt الخادم النهائي)",
"style_tags": "…",
"created_at": "2026-09-25T18:19:09.918Z",
"video_url": ""
}
]
| الحقل | ملاحظات |
|---|---|
status |
انظر §1.7؛ ولا يُعدّ المنتهي إلا completed |
audio_url |
رابط مباشر mp3؛ يُملأ بعد completed فقط |
cover_url |
عنوان الغلاف |
duration |
المدة الفعلية بالثواني |
generation_type |
الأغاني من كوفر بالصوت تكون دائماً voice_profile_cover |
play_url |
عنوان معاينة موقّع (ينتهي) |
song_title |
عنوان المهمة (أي title الذي أرسلته؛ وإن لم ترسل يضع الخادم قيمة افتراضية) |
lyrics / prompt |
الكلمات النهائية / النص الأصلي |
description |
الـ prompt النهائي الذي يرسله الخادم (مع الجزء البنيوي الثابت) |
style_tags |
وصف الأسلوب النهائي |
created_at |
سلسلة ISO 8601 (لاحظ اختلافها عن ثواني Unix في نقطة التفاصيل) |
توصية الاستعلام: كل 5–10 ثوانٍ، بمهلة إجمالية 10–15 دقيقة (أبطأ حساب «بارد» في القياسات استغرق نحو 4.5 دقيقة؛ وقليل جداً أكثر). لا تحكم على الانتهاء من فراغ audio_url، بل من status.
ملاحظة توافق: هذه النقطة تعرّف الأغاني بـ
song_id؛ وقد ظهر الحقلidفي بعض الاستجابات المبكرة، لذاrow.song_id || row.idهي القراءة الآمنة.
7.2 تفاصيل أغنية واحدة
GET /api/music/songs/{song_id}
{
"success": true,
"data": {
"song_id": "0f2a…",
"title": "نمران",
"status": "completed",
"generation_type": "voice_profile_cover",
"model": "suno-v6",
"duration": 115.15,
"audio_url": "https://…/assets/0f2a…-mp3.mp3",
"image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
"wav_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=wav",
"video_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=video",
"created_at": 1790411012,
"completed_at": 1790411500,
"parameters": {
"prompt": "[Verse 1]…",
"style_tags": "…",
"title": "نمران",
"model": "suno-v6",
"generation_type": "voice_profile_cover",
"source_song_id": "5b773e9a-…"
},
"parameter_retention": {
"core_parameters_available": true,
"extended_parameters_available": false,
"sources": ["suno_tasks"],
"unavailable_fields": ["negative_tags", "vocal_gender", "style_weight", "weirdness_constraint"]
}
}
}
- هنا
created_at/completed_atبـثواني Unix (بخلاف سلاسل ISO في الاستعلام الجماعي، فعلى العميل التفريق). wav_url/video_urlهما مدخلا التنزيل في هذه المنصة (نسبيان للنطاق الحالي)، وGETيجلب الملف؛ وهما سلسلتان فارغتان إن لم تُنتج المنصة ذلك الناتج.parameter_retentionيوضح أي معاملات إرسال يمكن تتبّعها لهذه الأغنية:core_parameters_available=trueيعني أن المعاملات الأساسية (الكلمات / الأسلوب / المصدر) قابلة للاستعلام، وعندextended_parameters_available=falseتكون المعاملات الموسّعة المذكورة أعلاه غير محفوظة (والكوفرات بالصوت تقع حالياً في هذه الفئة).
7.3 أعمالي
GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=كلمة مفتاحية
معاملات الترقيم: p (رقم الصفحة من 1) / page_size (عدد العناصر في الصفحة؛ والصيغة المتوافقة ps). واختياري status وq (كلمة مفتاحية في العنوان). الترتيب الافتراضي بحسب زمن الإنشاء تنازلياً.
{
"success": true,
"data": {
"page": 1,
"page_size": 20,
"total": 42,
"items": [
{
"song_id": "0f2a…",
"title": "نمران",
"status": "completed",
"generation_type": "voice_profile_cover",
"model": "suno-v6",
"duration": 115.15,
"audio_url": "https://…/assets/0f2a…-mp3.mp3",
"image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
"created_at": 1790411012,
"completed_at": 1790411500
}
]
}
}
بواسطة generation_type=voice_profile_cover تميّز «الأغاني الناتجة من كوفر بالصوت» عن بقية نتائج التوليد.
8. تنزيل النواتج
8.1 أخذ mp3 مباشرة (موصى به، مجاني)
كل الطرق الثلاث تعمل؛ اختر واحدة:
- استخدم
audio_urlمن نتيجة الاستعلام (رابط مباشر إلى تخزين الكائنات، الأسهل). GET /api/music/download?song_id=<id>&kind=mp3→ يعيد بث بايتات الصوت مباشرة (واسم الملف موجود فيContent-Disposition).POST /api/music/download-url(للحصول على عنوان مؤقت موقّع).
curl -sS -L "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song.mp3
قيم kind: mp3 (مكافئ لـ song) / playback (تشغيل بثّي) / wav / video / lyrics / timestamped_lyrics.
وtimestamped_lyrics (.lrc) متاح حالياً لبعض الأغاني فقط؛ وعند فشله أنشئ الملف بنفسك عبر واجهة الكلمات بمُهر زمني.
الاستجابة هي بث بايتات الملف كما هو، وContent-Type وContent-Disposition (اسم الملف) مضبوطان؛ أما wav_url / video_url التي يعيدها GET /api/music/songs/{song_id} فهي المدخل نفسه مع kind=wav|video.
8.2 تحويل إلى wav / كلمات / بيانات وصفية (مدفوع)
POST /api/music/free2
Content-Type: application/json
{ "song_ids": ["0f2a…"], "files": ["mp3", "wav", "lyrics"] }
{
"success": true,
"data": {
"songs": [
{ "song_id": "0f2a…", "files": [ { "type": "mp3", "url": "https://…" }, { "type": "wav", "url": "https://…" } ] }
],
"requested_songs": 1,
"succeeded_songs": 1,
"price": 0.2
}
}
filesيقبل:mp3/wav/lyrics/metadata، وبحد أقصى 10 أغانٍ في المرة.- الفوترة بحسب عدد الأغاني الناجحة (0.2 يوان للأغنية)؛ والأغنية الفاشلة كلياً لا تُحاسَب، والصيغة الفاشلة تظهر فقط في
songs[].errors. - لإعادة الحصول على ملفات سبق تنزيلها، استخدم أولاً المجاني
POST /api/music/free2/cached(بالمعاملين نفسيهماsong_ids+files) لجلب العناوين المؤرشفة؛ وsongs[].missing_filesفي ردّه يوضح الصيغ غير المخزّنة والتي تحتاج إعداداً جديداً.
9. استعلام الأسعار
GET /api/pricing/catalog
نقطة نهاية عامة لا تحتاج مصادقة. كل الأسعار التي يحتاج العميل عرضها في data.catalog.meta (سلاسل نصية):
| المفتاح | المعنى | القيمة الحالية |
|---|---|---|
generation_price |
التوليد العادي | 0.6 |
voice_generation_price |
السعر الأساسي للكوفر بالصوت | 1.2 |
max_mode_factor |
مضاعف Max Mode | 2 |
enhanced_upload_price |
الاستنساخ المعزّز / الرفع المعزّز | 10 |
voice_auto_verify_price |
التحقق التلقائي من الصوت | 5 |
voice_long_term_clone_price |
استنساخ الصوت طويل الأمد | 5 |
تُعدَّل الأسعار في لوحة الإدارة، لذا اقرأها مباشرة ولا تكتبها ثابتة في العميل. والخصم الفعلي للكوفر = voice_generation_price × (وإذا كان max_mode صحيحاً يُضاف × max_mode_factor).
10. الحدود والتنبيهات
- حجم الرفع: ≤ 10 ميجابايت (الخادم يقبل أكثر، لكن بوابة الدخول تقطع الأجسام الكبيرة عند 10 ميجابايت ثنائية وتظهر كأنها «مرفوضة من Suno»؛ فامنعها من جهتك أولاً).
- مدة النموذج: 6 ثوانٍ على الأقل، ويُفضَّل 10–60 ثانية؛ وأقل من ذلك ترفضه المنصة.
- محتوى النموذج: صوت غنائي نظيف؛ وتجنّب أي شيء يشبه تسجيلاً موجوداً (مقارنة المكتبة ترفضه).
- حدود النصوص:
lyrics≤ 3000 حرف؛ ويُستحسن أن تبقىstyle_requirements/negative_tags/titleضمن 1000 / 1000 / 100 حرف (متطلبات الأسلوب والكوفر تُدمج في الـ prompt، فأبقِ الإجمالي ضمن 3000 حرف). - لا تُعاد كتابة الكلمات: ما ترسله هو ما يُغنّى (حرفاً بحرف) دون قطع محلي.
- كل أغنية تُنتج نسختين؛ لا تفترض نتيجة واحدة.
- الملف الصوتي المصدر محفوظ بشكل دائم: حذف الصوت لا يمسح ملف الصوت المصدر؛ وهذا يبقي الكوفرات اللاحقة ممكنة ويجعل الامتثال قابلاً للتتبّع.
- يجب أن يكون الصوت ready: الصوت بحالة
processingلا يصلح للكوفر. - مهلة الطلب: في حساب «بارد» استغرق أول إرسال في القياسات حتى نحو 4.5 دقيقة، فاضبط مهلة العميل على ≥ 6 دقائق. والكوفر لا يزيل التكرار على مستوى الطلب، لذا بعد انتهاء المهلة تحقق أولاً من عدم ظهور أغنية جديدة (§1.5) ثم قرر الإعادة.
- ملكية الصوت: الأصوات تخص منشئها؛ والكوفر يقبل فقط الأصوات الجاهزة وغير المحذوفة. والصوت غير الموجود أو المحذوف أو التابع لحساب آخر يعيد 400:
هذا الصوت غير موجود أو تم حذفه (voice_id=…).
11. الأسئلة الشائعة (FAQ)
س1. هل إنشاء الصوت مكلف؟ الإنشاء العادي و«الإنشاء من صوت موجود» مجانيان؛ ولا تُحاسَب إلا الكوفرات (1.2 يوان / MAX 2.4 يوان) والاستنساخ المعزّز (افتراضياً 10 يوان).
س2. هل يمكن استخدام أغنية نهائية بموسيقى مصاحبة كنموذج صوتي؟
غير موصى به. أي شيء يحتوي موسيقى أو يشبه جداً تسجيلاً موجوداً في المكتبة ترفضه المنصة (This audio matches an existing recording in our catalog.). استخدم تسجيلاً غنائياً خالصاً وجافاً.
س3. لماذا يكون audio_url فارغاً بعد إرسال الكوفر؟
الإرسال يعني القبول فقط وstatus ما زال processing. ويظهر عنوان قابل للتشغيل/التنزيل فقط بعد الاستعلام بـ /api/music/query حتى status=completed.
س4. هل أرسل الكلمات في السيناريو ب (بلا song_clip_id)؟
اختياري. أرسل lyrics لغناء محتوى محدد؛ وبدونه يتولى النموذج الأمر لكن بتحكّم أقل.
س5. هل يمكن استخدام ملف رفعه العميل كصوت مباشرة؟
نعم: عبر صيغة file_url في create، أو برفعه كأغنية أولاً ثم استدعاء create-from-clip.
س6. هل يُعاد المال عند الفشل؟
الطلب المرفوض مباشرة (معاملات خاطئة / خطأ من المنصة) لا يُخصم منه بحسب القياسات؛ والمهمة المقبولة التي تفشل في النهاية تعيد المبلغ المخصوم مسبقاً. وعند الفشل النهائي تُعيد المهمة status=failed مع error_message.
س7. بعد حذف الصوت، هل يمكن سماع الأغاني التي أُنتجت به؟ نعم. الحذف يؤثر فقط على إمكانية استخدام ذلك الصوت في كوفرات جديدة.
س8. ما أقصى طول أغنية يمكن كوفرها دفعة واحدة؟
duration يقبل من 1 إلى 480 ثانية؛ وإن لم ترسله تحدده المنصة بحسب الأغنية الأصلية / المادة. وانتبه: أقصر ناتج نهائي للمنصة نحو 30 ثانية؛ فالقيم الأصغر أعطت في القياسات 29.96 / 29.76 ثانية.
الملحق أ: مثال كامل (Node.js، مع الاستعلام والتنزيل)
const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };
// ① إنشاء الصوت (multipart)
async function createVoice(filePath, title) {
const fd = new FormData();
fd.set("file", new Blob([await (await import("node:fs/promises")).readFile(filePath)], { type: "audio/mpeg" }), "my-voice.mp3");
fd.set("file_name", "my-voice.mp3");
fd.set("source_file_name", "my-voice.mp3");
fd.set("title", title);
fd.set("client_request_id", `vp-create-${Date.now()}`);
const res = await fetch(`${BASE}/api/music/voice-profile/create`, { method: "POST", headers: H, body: fd });
const body = await res.json();
if (!body.success) throw new Error(body.message);
return body.data; // { voice_id, status, audio_url, ... }
}
// ② الكوفر
async function cover(voiceId, songClipId, lyrics) {
const submissionId = `vp-cover-${Date.now()}`;
const res = await fetch(`${BASE}/api/music/voice-profile/cover`, {
method: "POST",
headers: { ...H, "Content-Type": "application/json", "X-Create-Ui-Client-Request-Id": submissionId },
body: JSON.stringify({
model: "suno-v6",
voice_id: voiceId,
song_clip_id: songClipId || "",
lyrics: lyrics || "",
style_requirements: "فولك بطيء، جيتار أكوستيك",
audio_weight: 0.85,
max_mode: false,
client_request_id: submissionId,
}),
});
const body = await res.json();
if (body.error) throw new Error(body.error.message);
return body.data; // { resolved_scene, clips: [{ song_id, status }] }
}
// ③ الاستعلام حتى الانتهاء (كل 5 ثوانٍ، وبحد أقصى 15 دقيقة)
async function waitUntilCompleted(songIds) {
const deadline = Date.now() + 15 * 60 * 1000;
while (Date.now() < deadline) {
const res = await fetch(`${BASE}/api/music/query`, {
method: "POST",
headers: { ...H, "Content-Type": "application/json" },
body: JSON.stringify({ model: "suno-v6", song_ids: songIds.join(",") }),
});
const songs = await res.json(); // مصفوفة مجرّدة
if (songs.every((s) => s.status === "completed" || s.status === "failed")) return songs;
await new Promise((r) => setTimeout(r, 5000));
}
throw new Error("timeout waiting for cover");
}
// ④ التنزيل
async function download(songId, outPath) {
const res = await fetch(`${BASE}/api/music/download?song_id=${encodeURIComponent(songId)}&kind=mp3`, { headers: H });
if (!res.ok) throw new Error(`download failed: ${res.status}`);
(await import("node:fs/promises")).writeFile(outPath, Buffer.from(await res.arrayBuffer()));
}
const voice = await createVoice("./my-voice.mp3", "صوتي");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\nكلمات…");
const ids = result.clips.map((c) => c.song_id);
const songs = await waitUntilCompleted(ids);
for (const [i, s] of songs.entries()) {
if (s.status === "completed") await download(s.song_id, `./out-${i}.mp3`);
}
الملحق ب: سجل التغييرات
| التاريخ | التغيير |
|---|---|
| 2026-10-15 | توضيح معنى الحذف صريحاً (§5.3)؛ والكوفر بـ voice_id «محذوف / غير مخوَّل» يعيد الآن 400 قبل أي خصم مسبق، مع تحديث جدول الأخطاء والأسئلة الشائعة (بالتزامن مع بوابة حذف الأصوات التي صدرت ذلك اليوم) |
| 2026-10-13 | إضافة ملاحظة «لماذا نوصي بهذا المسار» في المقدمة: بحسب تقييمات فعلية من مستخدمين كثيرين، الأغاني من هذا المسار تحافظ على الصوت الأصلي أفضل بوضوح |
| 2026-09-26 | الإصدار الأول: إنشاء صوت (ثلاث صيغ إدخال) / الإنشاء من ملف صوتي موجود / القائمة والتفاصيل والحذف / الكوفر بالصوت (السيناريوهان أ وب) / استعلام التقدّم / التنزيل / قراءة الأسعار، مع أدلة مقيسة |
احصل على مفتاح API
أنشئ مفتاح API من لوحة التحكم بعد التسجيل. كل عملية توليد تكلف 0.6 يوان وتعيد مقطوعتين، والتنزيلات غير محدودة، ولا حاجة إلى رقم هاتف.
احصل على مفتاح API العودة إلى النظرة العامة