أدلة APIمرجع أحداث Socket.IO

مرجع حدث النسخ السريع

حدث Socket.IO لرفع ملف كامل واستقبال تحديثات نسخ متدفقة.

يرفع حدث audio_file ملفًا كاملًا عبر Socket.IO كحمولة ثنائية واحدة. يرد الخادم بإقرار رفع ثم أحداث transcription_result جزئية ونهائية. أسماء الحقول والنماذج تبقى كما هي في البروتوكول.

الاتصال

  • المسار: /socket.io
  • النقل: websocket فقط
  • المصادقة: ترويسة x-api-key
  • ترويسة Origin: مطلوبة على الإنتاج؛ اضبطها على https://api.voice.humain.com

الحدود

ينطبق حدّان مستقلان على كل رفع لحدث audio_file، وهما يقيسان أمرين مختلفين. وكلاهما شامل: النجاح عند الحد بالضبط، والفشل عند تجاوزه فقط.

الحدالقيمةرمز التجاوزdata.boundالاتصال
بايتات الوسائط المُرمَّزة64 MiB (67108864)PAYLOAD_TOO_LARGEfast_audio_bytesيُغلق
مدة الصوت بعد فك الترميز1800 ثانية (30 دقيقة)AUDIO_DURATION_EXCEEDEDfast_audio_durationيبقى مفتوحًا

يُقاس سقف البايتات على بايتات الوسائط وحدها، بعد ترويسة التأطير وسلاسل مفاتيح النماذج الأربعة. أما مسار HTTP المكافئ فيحدّ جسم طلب multipart كاملًا بالرقم نفسه، لذلك يمر ملف بحجم 64 MiB بالضبط هنا لكنه لا يتسع داخل جسم HTTP بحجم 64 MiB.

ويُغلق تجاوز سقف البايتات الاتصال، لأن النقل خزّن حمولة مفرطة الحجم فعلًا فلا يبقى المقبس متاحًا لتكرارها. أما تجاوز حد المدة فلا يغلق الاتصال: فلم يُخزَّن شيء مفرط الحجم، ويحتفظ العميل الذي يجري عمليات نسخ أخرى على المقبس نفسه بها.

ويُرفض الصوت المفرط في الطول قبل أي استدلال ولا يستهلك أي رصيد من سعة الصوت. وللتسجيلات الأطول من 30 دقيقة أو الأكبر من 64 MiB، قسّم الصوت إلى وحدات أقصر أو استخدم واجهة النسخ الدفعي التي يبلغ سقفها 4 ساعات لكل ملف.

لا يعني audio_file_upload_success أن الصوت قد قُبِل. فهو يقر باستلام الحدث ونجاحه في الفحوص التي يمكن إجراؤها من البايتات وحدها: التأطير، وسقف البايتات، والمدة التي تعلنها ترويسة WAV عن نفسها. أما الفحوص الباقية — قائمة الحاويات المسموح بها، ومدة البيانات الوصفية للحاوية، وفك الترميز المحدود المرجعي — فتجري بعده، لذلك يستقبل رفعٌ مضغوط يُفك إلى أكثر من 1800 ثانية، أو حاوية خارج المجموعة المقبولة، الحدث audio_file_upload_success ثم حدث error. عامل هذا الحدث كإيصال على مستوى البايتات، لا كقبول. ووحده transcription_result مع is_final: true يعني أن الصوت قد نُسخ.

تنسيق الصوت

يجب أن تكون الحمولة الكاملة AAC (ADTS) أو FLAC أو MP3 أو WAV أو ملف ISO base media. ويتعرف الخادم على الحاوية من الحمولة نفسها، لا من اسم ملف ولا من نوع وسيط، ويُرفض أي شيء آخر بالرمز ASR_UNSUPPORTED_CODEC حتى عندما يكون قابلًا لفك الترميز.

ومدخل ISO base media عائلة: فصيغة MP4 هي الشكل المقصود والمدعوم، أما MOV وM4A و3GP و3G2 وMJ2 فتشترك معها في مفكك حاويات واحد ولذلك يقبلها الفحص نفسه. وMP4 وحدها مدعومة بمعنى أنها مختبرة ومقصودة؛ فلا تبنِ على غيرها.

وضع الذرة moov في مقدمة ملف ISO base media. وهذه ليست سياسة يفحصها الخادم ويرفض على أساسها — بل مطلب عملي: فالرفع يُقرأ إلى الأمام فقط، ولا يمكن الوصول إلى moov في نهايته فيفشل فك ترميز الملف.

اللغات والنماذج

القيمةالمفتاحالمعنى
0arالعربية
1enالإنجليزية
2codeswitchتبديل عربي-إنجليزي
النموذجاللغةالاستخدام
nida_arالعربيةASR عربي
nida_8k_arالعربيةASR عربي لاتصالات 8 kHz
bayan_arالعربيةASR عربي موصى به
fast_enالإنجليزيةASR إنجليزي
bayan_cs_ar_enعربي-إنجليزياسم مستعار لأحدث نموذج تبديل مستقر
bayan_cs_ar_en_v1عربي-إنجليزيإصدار v1 مثبت
bayan_cs_ar_en_v2عربي-إنجليزيإصدار v2 مثبت

المفاتيح التي لا تنتهي بـ _vN أسماء مستعارة قد تتحرك إلى إصدار مستقر أحدث. استخدم مفاتيح _vN عندما تحتاج إلى سلوك قابل للتكرار.

الأحداث

الحدثالاتجاهالمعنى
audio_fileالعميل إلى الخادمرفع ملف صوتي كامل للنسخ.
audio_file_upload_successالخادم إلى العميلإيصال باستلام البايتات ومعرّف الطلب؛ وليس قبولًا للصوت.
transcription_resultالخادم إلى العميلنتيجة نسخ جزئية أو نهائية.
errorالخادم إلى العميلخطأ منظم.

تخطيط audio_file

audio_file
UUID الطلب
bytes 0..15
معرّف الطلب الذي يظهر لاحقًا في الاستجابات.
اللغة
byte 16
0=Arabic، 1=English، 2=Codeswitch.
مفاتيح النماذج
variable
أطوال uint16 little-endian ثم قيم UTF-8 للنماذج الاختيارية.
الملف
remaining bytes
بايتات الملف الصوتي الأصلي.

حقول الطول تستخدم uint16 بترتيب little-endian. اضبط طول أي مفتاح نموذج إلى 0 لتجاوزه.

مثال إرسال

socket.emit("audio_file", packet);

socket.on("audio_file_upload_success", ({ id }) => {
  // إيصال بايتات فقط؛ انتظر transcription_result مع is_final للتأكد من النسخ.
  console.log("received", id);
});

socket.on("transcription_result", (response) => {
  console.log(response.transcription, response.is_final);
});

نتيجة النسخ

{
  "id": "7f51f2c2-e7bc-41c8-a850-f848df2ddfc8",
  "seq": 0,
  "transcription": "مرحبا بكم",
  "words": [
    { "start_time": 0.0, "end_time": 1.1, "word": "مرحبا" },
    { "start_time": 1.1, "end_time": 2.4, "word": "بكم" }
  ],
  "is_final": true
}

الحقول id وseq وtranscription وwords وis_final كلها مطلوبة. توجد أزمنة start_time وend_time داخل كل عنصر في words فقط، لا على المستوى الأعلى. عامل seq بوصفه بيانات تشخيصية؛ فترتيبها وتجميعها ليسا جزءًا من عقد Fast العام.

الأخطاء

استخدم حدث error لالتقاط فشل المصادقة، أو payload غير صالح، أو تجاوز أحد الحدود. وحقل code معدود؛ فرّع عليه لا على نص الرسالة:

codeالمعنى
AUTH_FORBIDDENمفتاح API لا يمنح الصلاحية
VALIDATION_INVALID_FORMATتأطير أو نوع بيانات غير صالح
VALIDATION_INVALID_LANGUAGEقيمة لغة غير معروفة
VALIDATION_FILE_CORRUPTصوت تالف أو غير قابل لفك الترميز
PAYLOAD_TOO_LARGEتجاوز سقف بايتات الوسائط
AUDIO_DURATION_EXCEEDEDتجاوز حد المدة بعد فك الترميز
ASR_UNSUPPORTED_CODECحاوية خارج المجموعة المنشورة
ASR_MODEL_NOT_FOUNDمفتاح نموذج ASR غير مضبوط
SESSION_BYTES_EXCEEDEDتجاوز بايتات الجلسة المتراكمة
SESSION_DURATION_EXCEEDEDتجاوز مدة الجلسة بالزمن الحقيقي
SESSION_IDLE_TIMEOUTانقضت مهلة سكون الجلسة
ASR_TRANSCRIPTION_FAILEDفشل النسخ في الخلفية

ويحمل رفض الحدود كائن data يسمّي الحد وقيمته المضبوطة والقيمة المرصودة، حتى تعرف أي حد بلغته دون تحليل نص. ولحد fast_audio_duration تكون unit هي seconds، وحيث توقفت الخدمة عن فك الترميز عند السقف تكون observed حدًا أدنى. ولحد fast_audio_bytes تكون unit هي bytes وobserved هي حجم الوسائط الدقيق.

{
  "id": "7f51f2c2-e7bc-41c8-a850-f848df2ddfc8",
  "code": "AUDIO_DURATION_EXCEEDED",
  "message": "decoded audio duration exceeds the maximum for this endpoint; split the recording or use the batch transcription API",
  "retryable": false,
  "timestamp": "2025-05-07T10:00:00.000Z",
  "data": {
    "limit": 1800,
    "observed": 3601,
    "unit": "seconds",
    "bound": "fast_audio_duration"
  }
}

في هذه الصفحة