واجهة Socket.IO
اتصل بأمان وأكمل النسخ السريع أو ASR المباشر أو التمييز أو اكتشاف الأصوات أو TTS عبر Socket.IO.
استخدم هذا الدليل لدورة حياة Socket.IO: اختر قدرة، واتصل، وسجل أقل مجموعة أحداث، وتعرف على إشارتها النهائية، وافصل دائمًا. استخدم صفحات AsyncAPI المولدة لمخططات الحمولات الكاملة.
في تطبيقات JavaScript وPython، فضّل SDK 0.18.0؛ فهو ينشئ الإطارات الثنائية،
ويوجه UUID، ويطبع الأخطاء، ويوفر مساعدي الإغلاق. ابنِ عميلًا مباشرًا فقط
عندما تحتاج إلى تحكم على مستوى السلك.
اختر سير العمل
| الدخل المتاح | اختر | إشارة الاكتمال |
|---|---|---|
| وحدة صوت مكتملة وقصيرة وحساسة لزمن الوصول، مثل دور في محادثة وكيل صوتي | النسخ السريع | transcription_result.is_final === true |
| صوت PCM ما زال يصل ويحتاج إلى نص | Realtime ASR | نهاية السلك: is_final === true؛ وحد الكلام: is_speech_final === true |
| صوت PCM ما زال يصل ويحتاج إلى أدوار المتحدثين | التمييز المباشر | إطار دخل نهائي، ثم diarization_result.is_final === true أو مهلة التطبيق |
| نص يحتاج إلى كلام مولد | اكتشاف الأصوات، ثم TTS | بت النهاية في إطار tts_audio |
يستقبل النسخ السريع الحمولة المكتملة مرة واحدة. وهو ليس مسار الاجتماعات أو البودكاست أو المواد الأرشيفية الطويلة؛ استخدم النسخ الدفعي لهذه التسجيلات المكتملة.
متطلبات الاتصال
API_URLوAPI_KEYالصادرتان للبيئة. ويضبط عميل Socket.IO المباشر المسار على/socket.ioأيضًا.- عميل Socket.IO على الخادم. أبقِ
API_KEYخارج حزم المتصفح والجوال. - اضبط
transports: ["websocket"]لعقد النقل المنشور والقابل للنقل بين البيئات. قد توجه بعض البيئات polling، لكن يجب ألا يعتمد العميل عليه. - أرسل
x-api-keyوOriginكترويستي اتصال. يشغّل طرف الإنتاج جدار حماية لتطبيقات الويب يرفض أي مصافحة بلاOrigin؛ اضبطها على مخططAPI_URLومضيفه. - تسجيل معالجات الأحداث قبل الاتصال أو قبل إرسال طلب.
- مهلة تطبيق إجمالية لكل طلب أو تدفق.
أبقِ المسار صريحًا في عملاء Socket.IO المباشرين. يستخدم SDK 0.18.0 المسار
/socket.io افتراضيًا؛ ولا تمرر api_path إلا عندما يستخدم النشر مسارًا
مخصصًا. تتطلب نقطة النهاية القديمة sautech.humain.com المسار
/realtime/socket.io.
اتصل مرة واحدة ثم افصل
يمكن لاتصال واحد مضاعفة عدة طلبات أو تدفقات. أعطِ كلًا منها UUID ووجّه كل
استجابة حسب id قبل معالجتها.
import { io } from "socket.io-client";
const socket = io(process.env.API_URL!, {
path: process.env.API_PATH ?? "/socket.io",
transports: ["websocket"],
extraHeaders: {
"x-api-key": process.env.API_KEY!,
Origin: process.env.API_URL!,
},
});
try {
// Register handlers, wait for connect, and run one or more operations.
} finally {
socket.disconnect();
}النتيجة المتوقعة: يستدعي العميل معالج نجاح الاتصال قبل إرسال أي طلب للتطبيق. تعامل مع فشل الاتصال كنهاية لهذه المحاولة ونظّف قبل إعادة المحاولة.
في python-socketio، يكون transports معاملًا لـconnect()، وليس لمُنشئ
AsyncClient.
النسخ السريع لوحدة صوت مكتملة
يقبل النسخ السريع حمولة AAC أو FLAC أو MP3 أو MP4 أو WAV مكتملة. يجب أن تكون
ذرة moov في مقدمة MP4. أرسل ثنائيًا خامًا، لا JSON أو base64.
أقل تسلسل للأحداث:
- سجل
audio_file_upload_successوtranscription_resultوerror. - أرسل حزمة
audio_fileثنائية واحدة. - طابق
audio_file_upload_success.idمع UUID الطلب؛ فهذا يؤكد الاستلام ولا يعني اكتمال النسخ. - وجّه أحداث النتائج حسب
id، وعاملseqكقيمة مبهمة لأن عقد Fast العام لا يعرّف دلالات ترتيب أو تجميع لها. أنهِ الانتظار فقط عندما تصبحis_finalصحيحة. - احتفظ بالاتصال أو أعد استخدامه فقط ضمن مهلة تطبيق؛ وإلا فافصل.
تملك حزمة audio_file هذا التخطيط المتغير الطول الدقيق:
| الإزاحة | الحجم | الحقل |
|---|---|---|
0..15 | 16 بايت | UUID الطلب |
16 | 1 بايت | اللغة: 0 للعربية، 1 للإنجليزية، 2 لتبديل اللغتين، 255 للتلقائي |
17..18 | 2 بايت | طول asr_model_key بالبايت، عدد صحيح 16 بت little-endian بلا إشارة |
N التالية | N بايت | asr_model_key بترميز UTF-8؛ يختار الطول صفر افتراضي اللغة |
| 2 التالية | 2 بايت | طول dia_model_key بالبايت، عدد صحيح 16 بت little-endian بلا إشارة |
N التالية | N بايت | dia_model_key محجوز؛ أرسل طولًا صفريًا |
2 + N التالية | متغير | itn_model_key محجوز مسبوق بطوله؛ أرسل طولًا صفريًا |
2 + N التالية | متغير | redact_model_key محجوز مسبوق بطوله؛ أرسل طولًا صفريًا |
| الباقي | متغير | بايتات ملف الصوت المشفر المكتمل |
يسلسل SDK 0.18.0 حقول التوافق الثلاثة المحجوزة، لكن خدمة Fast العامة المتحقق
منها لا تطبقها. استخدم Batch عندما تحتاج إلى التمييز أو ITN أو الإخفاء.
لا يملك JavaScript SDK 0.18.0 خيار مهلة للنسخ السريع. يستدعي خطأ الطلب
الموجه onError ثم يرفض بـError عام يحتفظ بالرسالة فقط. لا تعد إرسال رفع
ملتبس بلا تمييز؛ فلا يوجد عقد idempotency-key منشور.
تأطير Realtime ASR ودورة حياته
يحمل audio_stream عينات PCM16 little-endian بتردد 16 kHz وأحادية القناة.
أعد استخدام UUID واحد للتدفق كله.
أقل تسلسل للأحداث:
- سجل
transcription_resultوdiarization_resultالاختياري وerror. - أرسل إطار بداية واحدًا بالضبط وبايت رايات
1. - أرسل إطارات وسطية وبايت رايات
0. - أرسل إطار نهاية واحدًا بالضبط وبايت رايات
2. - وجّه النص حسب
idوترتيب الوصول المرصود. أبقِseqالقادمة من الخادم للتشخيص فقط لأن ترتيبها وتفرّدها ليسا ضمانين عامين. استبدل النص المؤقت ما دامت رايتا النهاية خاطئتين، وثبّت كلمات الحدث مرة واحدة عندما تصبحis_finalأوis_speech_finalصحيحة. - بعد الدخل النهائي، ينتظر العميل المباشر
is_final: trueحتى مهلة التطبيق. وينتظر مساعدclose()في SDK المنشورis_finalنفسها على مستوى البروتوكول أو خطأ موجهًا أو انتهاء مهلته المحدودة. لا تنهيis_speech_finalذلك الانتظار. افحص حالة الاستجابة؛ فقد يعني العود الناجح انتهاء المهلة ولا يثبت النهائية وحده.
ترسل وصفة SDK المختبرة 3,200 بايت صوت، أي 100 ms، في كل إطار. هذا إيقاع
عملي وليس ضمانًا للإنتاجية أو زمن الوصول. اضبط البت 2 في بايت الرايات فقط
عندما تريد أيضًا أحداث diarization_result على الاتصال نفسه.
تأطير التمييز المباشر ودورة حياته
يستخدم diarization_stream تخطيط الإطار ذي 18 بايت وصيغة PCM المطلوبين
نفسيهما في audio_stream. تستخدم راياته البت 0 للبداية والبت 1 للنهاية؛
وأبقِ البتات الأخرى صفرًا.
أقل تسلسل للأحداث:
- سجل
diarization_resultوerror. - أرسل إطار بداية، ثم إطارات وسطية، ثم إطار نهاية تحت UUID نفسه.
- اجمع إضافات
final_segmentsغير المشاهدة واستبدل ذيلactive_segmentsالحالي في كل نتيجة. - تعامل مع
is_final: trueكإشارة الخادم النهائية. إذا انتهت المهلة أولًا، فأعد أفضل خط زمني موفق معروف بوصفه غير مكتمل. - افصل أثناء التنظيف.
يوصي مساعد SDK الصادر بـ15,360 بايت صوت لكل تغذية. استهلك النتائج أثناء
الإرسال؛ فقد يعلق المسار إذا أخّرت الاستهلاك إلى ما بعد انتهاء التغذية. يعيد
SDK close(5) أفضل خط زمني معروف عند انتهاء مهلة انتظاره النهائي.
اكتشاف الأصوات ودورة حياة TTS
اكتشف صوتًا بدل تخمين معرّفه:
- سجل
tts_voice_list_resultوerror. - أرسل
tts_voice_listمع{}. - تعامل مع الاستجابة كمصفوفة
{ id, label }؛ وتعامل مع المصفوفة الفارغة.
ثم ولّد الكلام:
- سجل
tts_audioوerror. - أرسل
ttsمعidونصtextيحتوي بعد إزالة الفراغات على حرف Unicode أو رقم واحد على الأقل، وmodel: "nebula"صريح. - لاختيار صوت متوقع، أرسل إما
voice_idمن الاكتشاف أو عنصرvoice_referencesواحدًا بشكل{ audio, text }. يكونaudioفيه RIFF/WAVE بترميز base64 القياسي وبيانات PCM16 أحادية غير فارغة. المحددان متنافيان. - طابق كل استجابة ثنائية حسب UUID الطلب، وألحق البايتات
17..end، وتوقف عند ضبط البت 0 في البايت16.
بت النهاية هو إشارة اكتمال TTS. حلل كل حدث tts_audio بترويسة التطبيق هذه،
ولا تلحق أول 17 بايت منه. استخدم
وصفة TTS إلى WAV المختبرة لإنشاء ملف
قابل للتشغيل. يؤدي فصل الاتصال إلى إلغاء طلبات التوليف النشطة التي يملكها ذلك
الاتصال ومنع أحداث الصوت والخطأ اللاحقة، من دون إغلاق اتصالات الاستدلال
المشتركة مع طلبات أخرى.
الأخطاء المنظمة والمهل والإنهاء
تعرف عقود الأحداث المولدة كائنات error تحتوي الحقول المطلوبة code و
message وretryable وtimestamp، إضافة إلى id الطلب عندما يمكن توجيه
الحمولة. سجل معالجة الأخطاء الخاصة بالطلب والعامة معًا.
| القدرة | الإشارة النهائية | قاعدة المهلة والتنظيف |
|---|---|---|
| النسخ السريع | is_final: true | لا مهلة في JavaScript SDK؛ ضع حدًا للطلب كله وأغلق العميل |
| Realtime ASR | إشارة النهاية على السلك وفي إغلاق SDK: is_final: true | قد يعني عود إغلاق SDK انتهاء مهلته؛ افحص النهائية المتعقبة وافصل دائمًا داخل finally |
| التمييز المباشر | إطار دخل نهائي، ثم is_final: true | عند انتهاء مهلة الإغلاق، احتفظ بأفضل خط زمني معروف ووسمه غير مكتمل |
| اكتشاف الأصوات | استجابة tts_voice_list_result واحدة يمكن أن تكون فارغة | ضع حدًا للانتظار؛ ولا تخترع معرّف صوت |
| TTS | ضبط البت 0 في ترويسة tts_audio | مهل SDK ضوابط للعميل؛ ويفرض الخادم أيضًا مهلة كلية غير قابلة لإعادة الضبط قدرها 25 ثانية ومراقب خمول قدره 60 ثانية. ويلغي الفصل طلبات ذلك الاتصال النشطة. |
يطبع SDK 0.18.0 الاستدعاءات المنظمة. تصبح الحمولة القديمة غير الكائنية
{ message }. ترفض وعود طلب Fast وTTS بأخطاء عامة تحتفظ بالرسالة فقط بعد
استدعاءاتها المنظمة. لا تثبت المهلة النهائية: أوقف الإرسال، واحتفظ بالنتائج
المؤكدة، وسجل الإنهاء غير المكتمل، وافصل.
استخدم retryable كمدخل في سياسة إعادة محاولة محدودة، لا كإذن لإعادة محاولة
بلا حد. لا تعد رفعًا نتيجته ملتبسة بلا سياسة تطبيق لمنع التكرار.
مرجع الأحداث المولد
يتوقف هذا الدليل عمدًا عند دورة الحياة والتأطير. تحتوي صفحات AsyncAPI المولدة كل حقل وخاصية مطلوبة ومثال وقيد مخطط.