استكشاف الأخطاء وإصلاحها

شخّص إخفاقات الاتصال والوضع والصوت والنهائية والنتائج وTTS وحدود المعدل والتنظيف في SDK 0.18.0.

تستهدف هذه الصفحة @humain-voice/sdk@0.18.0 و humain-voice==0.18.0. شخّص بالاعتماد على الأدلة: التقط الحالة والحدث والمعرّف والإشارة النهائية قبل تغيير الإعدادات أو إعادة المحاولة.

شخّص بهذا الترتيب

  1. تأكد من أن الحزمة المثبتة هي 0.18.0 بالضبط.
  2. تأكد من وجود API_URL وAPI_KEY في عملية الخادم.
  3. اختر وضع المعالجة وفق الدخل الموجود فعلًا.
  4. أعد إنتاج المشكلة بدخل واحد صغير ومعروف وطلب واحد. عطّل إعادات المحاولة المتزامنة أثناء عزل الإخفاق.
  5. سجل حقول الخطأ المنظمة وما إذا اكتمل التنظيف.

شغّل أمر إصدار الحزمة المناسب لتطبيقك فقط. تعرض حلقة الصدفة وجود المتغير من دون طباعة السر؛ لا تستبدلها بـenv أو أمر آخر يكشف API_KEY.

npm ls @humain-voice/sdk --depth=0
python -c 'from importlib.metadata import version; print(version("humain-voice"))'

for name in API_URL API_KEY; do
  if [ -n "$(printenv "$name")" ]; then
    printf "%s=set\n" "$name"
  else
    printf "%s=missing\n" "$name"
  fi
done

اختر وضع المعالجة الصحيح

العَرَضالسبب المرجحالدليل أو الفحصالإصلاح
يتعطل اجتماع طويل أو بودكاست أو ملف أرشيفي في النسخ السريعاستُخدم النسخ السريع لمادة طويلةكان التسجيل كله موجودًا قبل الطلب وهو طويلاستخدم BatchTranscribeClient واستعلم ضمن مهلة نهائية محدودة
يضيف دور محادثة محدود تعقيد بث لا حاجة إليهاستُخدم Realtime رغم وجود الدور كاملًالا يصل صوت بعد بدء الطلباستخدم FastTranscriptionClient للوحدة المكتملة مسبقًا والحساسة لزمن الوصول
يُرفع صوت ميكروفون أو مكالمة مرارًا كملفات مكتملةاستُخدم Batch أو الوضع السريع بينما لا يزال الصوت يصليجب أن تبدأ المعالجة قبل انتهاء التسجيلاستخدم RealtimeClient أو RealtimeDiarizationClient وأرسل PCM مؤطرًا عند وصوله
يُرسل ملف مكتمل كـPCM مباشر أو يُرفع PCM كملفحدث خلط بين دخل الحاوية ودخل التدفققارن بايتات الدخل بعقد العملية المختارةأرسل ملفًا مشفرًا إلى Batch أو Fast، وأرسل PCM16 LE بلا ترويسة إلى Realtime

لا يَعِد اختيار الوضع بزمن وصول معين. بل يختار دورة الحياة وعقد الدخل المطابقين للمهمة.

أعراض الاتصال والمصادقة

العَرَضالسبب المرجحالدليل أو الفحصالإصلاح
يعيد REST ‏401 أو 403المفتاح مفقود أو غير صالح أو لا يملك وصولًا للعمليةسجل حالة HTTP وcode المنظم، وتأكد فقط من ضبط API_KEYأرسل القيمة المخصصة كـx-api-key أو api_key؛ وعالج بيانات الاعتماد غير الصالحة أو المرفوضة عبر مسار الوصول المعتمد في مؤسستك
يقول مُنشئ Socket.IO إن الرابط أو المفتاح مطلوبإحدى قيمتي api_url أو api_key فارغةسجل أسماء الخيارات ووجودها، ولا تسجل قيمة المفتاحمرر API_URL وAPI_KEY المخصصين؛ ويكون api_path افتراضيًا /socket.io
يرفع Socket.IO ‏connect_error أو لا يستدعي معالج الاتصالالمضيف أو المسار خاطئ، أو ترقية WebSocket محجوبة، أو المصافحة مرفوضةقارن API_URL والمسار الفعلي /socket.io بالقيم الصادرة؛ وفي Python أعد الإنتاج مرة مع verbose=True واحتفظ بخطأ المصافحةاستخدم المسار الافتراضي ما لم يوثق نشرك تجاوزًا، وأبقِ نقل WebSocket مفعّلًا، واضبط proxy ليحافظ على الترقية
يعمل REST لكن تفشل كل قدرات Socket.IOمسار Socket.IO أو ترقية WebSocket محجوبانينجح طلب REST محمي بينما تفشل مصافحة Socket.IO قبل أي حدث تطبيقاختبر /socket.io من شبكة الخادم نفسها؛ واضبط API_PATH فقط لتجاوز موثق
تُرفض مصافحة Socket.IO قبل أي حدث تطبيقترويسة Origin المطلوبة مفقودة أو لا تطابق أصل الخدمةقارن ترويسات المصافحة المنقحة؛ فقد يكون الجسم صفحة بوابة لا خطأ منصة منظمًااضبط Origin على مخطط API_URL ومضيفه. على عميل Socket.IO المباشر ضبطها؛ ويشتقها SDK 0.18.0 من api_url.
يتصل عميل Socket.IO المبني يدويًا بشكل مختلف عن SDKيختلف المسار أو ترويسة مفتاح API أو النقلافحص المصافحة المنقحة: المسار والنقل ووجود x-api-keyأرسل x-api-key، واختر transports: ["websocket"]، وسجل المعالجات قبل الاتصال

يستخدم الإصدار 0.18.0 المسار /socket.io افتراضيًا؛ ولا تضبط API_PATH إلا لتجاوز موثق. وتتطلب نقطة النهاية القديمة sautech.humain.com المسار /realtime/socket.io. أبقِ الاعتمادات في عملية على الخادم؛ نقل المفتاح إلى حزمة متصفح أو جوال ليس إصلاحًا للاتصال.

أعراض الصوت والتأطير

افحص المصدر المشفر، ثم أنشئ دخل Realtime الخام الدقيق عند الحاجة:

ffprobe -v error -select_streams a:0 \
  -show_entries stream=codec_name,sample_rate,channels,sample_fmt \
  -of default=noprint_wrappers=1 input.wav

ffmpeg -i input.wav -ar 16000 -ac 1 -c:a pcm_s16le \
  -f s16le realtime.pcm
العَرَضالسبب المرجحالدليل أو الفحصالإصلاح
يعيد Batch ‏422 مع VALIDATION_FILE_CORRUPTالملف المرفوع تالف أو غير مدعومشغّل ffprobe واحتفظ بالحالة وcode وبيانات الملف الوصفية الآمنةفك الترميز أو حوّله إلى ملف صوت مشفر صالح، ثم أعد المحاولة مرة كرفع جديد
يقبل النسخ السريع الرفع من دون نتيجة نهائية مفيدةتستخدم الحمولة المكتملة حاوية غير مدعومة أو MP4 مشوهًاتأكد من أنها AAC أو FLAC أو MP3 أو MP4 أو WAV وافحص تخطيط MP4أرسل ملفًا مكتملًا مدعومًا واحدًا، وضع ذرة moov في مقدمة MP4
نص Realtime فارغ أو مشوه أو سريع جدًا أو بطيء جدًاأُرسلت حاوية WAV/MP3 أو عينات big-endian أو تردد أو عدد قنوات خاطئ كـPCMافحص المصدر بـffprobe وأمر التحويل؛ يجب أن يكون طول حمولة PCM زوجيًاأرسل بايتات PCM16 little-endian بلا ترويسة، بتردد 16 kHz وأحادية القناة
لا يستقبل عميل Realtime مباشر شيئًاترويسة التطبيق ذات 18 بايت أو UUID أو الرايات أو بايت اللغة خاطئافحص البايتات 0..17، وتأكد من إعادة استخدام UUID واحد وأن الصوت يبدأ في البايت 18في audio_stream أرسل الرايات 1 مرة و0 وسطًا و2 مرة في النهاية، واستخدم بايت اللغة الموثق
لا يصل التمييز المباشر إلى النهائيةتأطير diarization_stream أو راية النهاية مفقودتحقق من الترويسة نفسها ذات 18 بايت ومن UUID واحد وبت البداية وبت النهايةأرسل PCM16 LE بتردد 16 kHz وأحاديًا وإطار نهاية واحدًا بالضبط، وأبقِ بتات الرايات الأخرى صفرًا
تصل التحديثات بإيقاع غير منتظمتختلف أحجام الحمولات كثيرًا عن المساعدات المختبرةاحسب بايتات الصوت بعد الترويسة ذات 18 بايتابدأ بـ3,200 بايت صوت لكل إطار Realtime ASR؛ ويوصي SDK بـ15,360 بايت لكل تغذية تمييز مباشر

أحجام الإطارات إيقاعات مختبرة، وليست ضمانات إنتاجية أو زمن وصول. ينشئ SDK الترويسات؛ افحصها فقط عند بناء تطبيق سلكي مباشر.

أعراض اللغة والنموذج

العَرَضالسبب المرجحالدليل أو الفحصالإصلاح
يُتعرف على كلام عربي-إنجليزي كلغة واحدةلا تصف اللغة والنموذج تبديل اللغتينسجل قيم التعداد الدقيقة لا تسمياتها فقطاستخدم Language.ArEn مع BatchTranscriptionModel.BayanArEn أو FastTranscriptionModel.BayanArEn
يكون النسخ السريع فارغًا مع نموذج اتصالات 8 kHzفُرض نموذج خاص بـBatch على مسار Fastلا يوجد NidaArTelephony في FastTranscriptionModel في 0.18.0استخدم BatchTranscriptionModel.NidaArTelephony مع Batch، ولا تمرر سلسلته السلكية إلى Fast
تتصرف لغة غير متوقعة كالعربيةوصلت سلسلة غير معروفة إلى محول البروتوكولسجل القيمة الدقيقة الممررة إلى SDK؛ تُحوّل السلاسل المجهولة إلى معرّف البروتوكول 0 في 0.18.0مرر Language.Ar أو Language.En أو Language.ArEn بدل تسمية حرة
يتضمن إعداد Realtime نموذج ASR خاصًا بـBatch أو Fastعومل Realtime كمسار ملفاتافحص نوع الاستدعاء؛ يختار RealtimeClient.startStream() / start_stream() اللغة لا نموذج ASRاحذف خيار النموذج ومرر قيمة Language الصحيحة
يفشل TTS عبر HTTP المباشر عند عدم تحديد نموذجيترك المسار المباشر وحده اختيار النموذج للنشر، وقد يختلف الافتراضي المضبوط أو لا يكون متاحًا. أما SDK فيرسل دائمًا nebula عند حذف model، لذا لا يقع هذا عبر TTSClientسجل حدث error المنظم وحمولة الطلب من دون النص إذا كان حساسًاأرسل مفتاح النموذج الصريح nebula على المسار المباشر بدل الاعتماد على إعداد النشر

استخدم الاسم المستعار غير المرقّم BayanArEn لافتراضي تبديل اللغتين في الإصدار المنشور. اختر BayanArEnV1 أو BayanArEnV2 فقط عندما تحتاج عمدًا إلى ذلك النموذج المحدد. راجع النماذج واللغات.

أعراض غياب الإشارات النهائية والمهل

العَرَضالسبب المرجحالدليل أو الفحصالإصلاح
لا يعود عمل Batch من المساعدظل غير نهائي أو أصبح cleared أو تجاوز مهلة المساعدسجل كل حالة: queued أو processing أو done أو failed أو clearedاستخدم مهلة استعلام محدودة، وتوقف عند done أو failed أو cleared، واستدعِ getResult() / get_result() مباشرة عند الحاجة إلى معالجة cleared فورًا
يصل إقرار رفع Fast لكن لا يكتمل الطلباعتُبر audio_file_upload_success اكتمالًا للنسخطابق id ثم تحقق من transcription_result.is_final === trueانتظر ضمن مهلة تطبيق فقط؛ القيمة الافتراضية لـtimeout_seconds في Python هي 60، بينما لا يملك JavaScript ‏0.18.0 خيار مهلة لطلب Fast
يعود RealtimeStream.close() / close() من دون رصد is_final على مستوى البروتوكولانتهت مهلة انتظار النهاية المحدودةتتبع is_final الطرفية على السلك؛ انتظار الإغلاق الافتراضي ثانية واحدةتمثل is_speech_final حد كلام فقط ولا تحقق شرط مساعد SDK. احتفظ بالنص المؤكد ووسم النتيجة غير مكتملة.
يعيد close() للتمييز خطًا زمنيًا بلا تحديث نهائيانتهت مهلة إغلاقه ذات خمس ثوانٍتتبع isFinal / is_final في آخر تحديث؛ الخط الزمني المعاد أفضل لقطة معروفةوسمه غير مكتمل ما لم تُرَ النهائية، واحتفظ باللقطة الموفقة وافصل
تنتهي مهلة TTS بين المقاطع أو لا يرسل المقطع النهائيانتهى انتظار خمول كل مقطع أو لم يصل البت 0 في البايت 16سجل وقت كل إطار tts_audio وقيمة is_lastافصل بين حد خمول المقطع وحد التوليف كله؛ افتراضي JavaScript لكل مقطع 30 ثانية، بينما لا يضع Python افتراضيًا

تختلف مهلة SDK عن المهلة النهائية للتطبيق. قد تحد مهلة SDK استعلامًا أو انتظار إغلاق أو المقطع التالي. يجب أن تحد مهلة التطبيق العملية كلها، بما فيها الاتصال والعمل والنهائية وإعادات المحاولة. لا تثبت المهلة مطلقًا إخفاق رفع أو وصول تدفق إلى النهائية.

أعراض نتائج التسميات والتمييز

العَرَضالسبب المرجحالدليل أو الفحصالإصلاح
تكرر التسميات المباشرة النص المؤقتأُلحقت كل transcription_resultسجل id وترتيب الوصول وseq وis_final وis_speech_finalأبقِ سطرًا مؤقتًا واحدًا قابلًا للاستبدال لكل id، وثبّت كلمات الأحداث النهائية أو نهاية الكلام فقط
يحتفظ RealtimeSubtitles بحدث واحد فقط من عدة أحداث نهائيةيزيل المساعد التكرار حسب id:seq، لكن العقد السلكي الحالي لا يضمن قيم seq متميزةقارن عدد الأحداث النهائية وقيم seq مع RealtimeSubtitles.wordsاجمع كلمات الأحداث النهائية بترتيب الوصول المرصود واعرضها باستخدام Subtitles بعد الإنهاء
تتكرر أدوار المتحدثين أو تختفي أو تقفزجُمعت final_segments وactive_segments الخام بلا توفيققارن المصفوفات الخام المتتابعة مع update.segmentsاجمع المقاطع النهائية غير المشاهدة، واستبدل الذيل النشط، ورتب حسب البدء، أو استهلك update.segments الموفقة في SDK
لا تحمل كلمات Batch متحدثًا رغم وجود التمييزالخط الزمني للكلمات منفصل عن خط التمييز في شكل الاستجابةافحص final_word_segments / إزاحات الكلمات وdiarization_segmentsوفّق بالتداخل الزمني وحدد قاعدة تطبيق للفجوات أو التداخل الملتبس، ولا تخترع متحدثًا بصمت

يتجاهل RealtimeSubtitles عمدًا الاستجابات المؤقتة ويلغي تكرار الاستجابات النهائية حسب id وseq؛ وهذا السلوك نفسه قد يدمج أحداثًا نهائية متميزة بموجب العقد السلكي الحالي. تظل active_segments في التمييز المباشر قابلة للمراجعة حتى تنتقل إلى الحالة النهائية.

أعراض أصوات TTS والتشغيل

العَرَضالسبب المرجحالدليل أو الفحصالإصلاح
تعيد listVoices() / list_voices() القيمة []لا تتوفر نسخة فعلية أو أكثر تحتاجها الهويات المهيأةسجل طول المصفوفة وأي error منظم، ولا تفهرس العنصر 0تعامل مع الحالة الفارغة ولا تخمّن voice_id، وأعد المحاولة ضمن سياسة محدودة فقط
ينتظر اكتشاف الأصوات بلا نهاية في Python أو تنتهي مهلته في JavaScriptتختلف قيم المهلة الافتراضيةيفترض JavaScript خمس ثوانٍ، ولا يضع Python افتراضيًامرر listVoices({ timeoutSeconds: 5 }) أو list_voices(timeout_seconds=5) صراحة
لا يشغل مشغل الوسائط بايتات التوليفيعيد Socket.IO TTS ‏PCM خامًا لا ملف WAVتأكد من وصول الاستجابة إلى is_last وافحص عدد البايتاتعامل البايتات كـPCM16 LE بتردد 24 kHz وأحادي، وأضف ترويسة WAV صحيحة باستخدام وصفة TTS إلى WAV المختبرة
خرج WAV في JavaScript مبتور أو يحتوي بايتات غير مرتبطةحُوّل عرض Uint8Array بلا إزاحته وطولهقارن byteLength مع Buffer.length الناتجأنشئ Buffer باستخدام byteOffset وbyteLength للعرض
توقفت الشيفرة التي تطابق label رأيته سابقًا عن إيجاد الصوتتعرض القائمة تسميات هويات مثل mul_<name> لا تسميات النسخ الفعليةافحص بيانات profile المعادةطابق معرّف الهوية id وخزّنه، ولا تطابق label؛ تُرفض معرّفات النسخ الفعلية
اختارت هوية متعددة اللغات النسخة الفعلية غير المتوقعةيتطلب التوجيه العربي حرفًا من محارف الكتابة العربية في textافحص النص بحثًا عن حرف من محارف الكتابة العربيةيختار أي حرف عربي النسخة العربية؛ وإلا تُختار الإنجليزية

عند التحليل المباشر لـSocket.IO، تبدأ كل حمولة tts_audio بمعرّف UUID من 16 بايت وبايت ترويسة واحد. ألحق البايتات 17..end فقط؛ البت 0 في البايت 16 هو الإشارة النهائية.

أعراض حدود المعدل وإعادة المحاولة

العَرَضالسبب المرجحالدليل أو الفحصالإصلاح
يرفع Batch ‏BatchTranscribeRateLimitError أو يعيد 429سعة الصوت غير متاحة مؤقتًا للطلبافحص retryAfter / retry_after وcapacity وretryable وcode عند وجودهااحترم التأخير المرسل، وأضف تراجعًا أسيًا مع jitter، وضع حدًا للمحاولات والمدة الكلية
يبدو أن maxRetries / max_retries لا يفعل شيئًاهو مهمل ومتجاهل في 0.18.0يصدر SDK تحذير إهمال عند استخدام قيمة غير صفريةنفّذ سياسة إعادة المحاولة المحدودة في كود التطبيق
يفشل الاتصال بعد إرسال رفعالنتيجة ملتبسةسجل ما إذا وصل معرّف عمل أو إقرار رفعلا ترفع مجددًا بلا تمييز؛ لا ينشر API عقد idempotency-key، فطبّق سياسة تطبيق لمنع التكرار أو صعّد بالأدلة
يقول error في Socket.IO إن retryable: trueصنّف الخادم الحدث قابلًا لإعادة المحاولة، لا مضمون النجاحالتقط id وcode وmessage وretryable وtimestamp من onError / on_errorاستخدم الحقل كمدخل واحد في السياسة المحدودة نفسها، ولا تكرر بلا نهاية

capacity حقل استجابة تشغيلي، لا حصة حساب منشورة أو ضمان توفر. لا تتكرر قراءة حالة Batch بأمان إلا عندما يحفظ save_result=true الناتج النهائي قبل جلبه؛ وقد تمسحه القراءة الافتراضية. يظل تكرار رفع لا تُعرف نتيجته غير آمن. راجع الأخطاء وحدود المعدل.

أعراض التنظيف وتسرب الاتصالات

العَرَضالسبب المرجحالدليل أو الفحصالإصلاح
تظل العملية حية بعد اكتمال العملظل عميل Socket.IO أو جلسة HTTP في Python مفتوحًاسجل إنشاء العميل والإشارة النهائية والتنظيف مرة لكل عملية؛ قد يبلغ Python عن جلسة غير مغلقةضع التنظيف في finally، واستدعِ FastTranscriptionClient.close() أو TTSClient.close() أو RealtimeClient.disconnect() أو RealtimeDiarizationClient.disconnect() حسب الحالة
يزداد عدد الاتصالات بعد الأخطاء أو المهليُنشأ عميل جديد قبل إغلاق العميل المخفققارن أعداد استدعاءات الاتصال والانفصالأعد استخدام عميل سليم واحد حيث يلزم، وأغلق العميل المخفق قبل إعادة المحاولة
ينتهي تدفق بلا تنظيفخرجت حلقة النتائج قبل stream.close()سجل ما إذا نُفذ الدخل النهائي ومسار الإغلاقأغلق التدفق داخل finally، ثم افصل العميل إذا وقع الإخفاق خارج تنظيف التدفق المعتاد
يحذر Python Batch من جلسة aiohttp غير مغلقةتم تخطي BatchTranscribeClient.close() / close_sync()أعد إنتاج طلب واحد وراقب إغلاق العمليةاستخدم مدير السياق المتزامن أو غير المتزامن، أو استدعِ طريقة الإغلاق المطابقة داخل finally

تُعد BatchTranscribeClient.close() في JavaScript عملية توافق لا تفعل شيئًا في 0.18.0؛ إذ تستخدم طلباته fetch. تملك عملاء JavaScript الأخرى اتصالات Socket.IO وتتطلب مسارات التنظيف الموثقة.

صعّد بأدلة قابلة لإعادة الإنتاج

أعد محاولة دخل واحد معروف فقط عندما تكون النتيجة غير ملتبسة وتسمح السياسة. إذا استمرت المشكلة، فأرسل إلى جهة الاتصال في HUMAIN مثالًا مصغرًا وهذا السجل المنقح:

sdk: "@humain-voice/sdk@0.18.0 | humain-voice==0.18.0"
operation: "batch | fast | realtime | diarization | tts | voice-list"
api_url_host: "host only"
api_path: "Socket.IO path or not-applicable"
started_at_utc: "ISO-8601 timestamp"
request_or_job_id: "UUID if available"
input: "codec, sample_rate, channels, duration, byte_count"
observed: "http_status, event, final_signal"
error: "code, message, retryable, timestamp"
retries: "count and delays"
cleanup: "final frame, stream close, client disconnect"

أرفق أصغر مثال كود يعيد إنتاج المشكلة واذكر الإشارة النهائية المتوقعة. لا ترسل مفتاح API، أو رابط Socket.IO كاملًا يحتوي سلسلة الاستعلام، أو صوتًا أو نصًا حساسًا بلا تصريح. عند التباس نتيجة رفع، أرسل نافذته الزمنية بتوقيت UTC وبصمة دخل آمنة وأي معرّف عمل أو طلب بدل إعادة إرساله.

لا تنشر هذه الوثائق رابط حالة انقطاع أو مدة احتفاظ أو حصة أو هدف توفر أو ضمانًا لزمن استجابة الدعم. صعّد إخفاقات الاعتماد ونطاق الوصول إلى مصدر المفتاح، وصعّد إخفاقات البروتوكول أو النهائية القابلة للتكرار بالأدلة أعلاه.

في هذه الصفحة