البث المباشر

صوت يدخل، وصوت يخرج. كلاهما مباشر.

مقبس واحد يستقبل الكلام العربي بثًا ويعيد النص وهو يُقال. وطلب واحد يبث الكلام من أول مقطع. المفتاح نفسه، والعنوان الأساسي نفسه، وهي بنية مصممة لتبادل الأدوار الذي يعتمد عليه الوكيل الصوتي.

import websockets, json

ws = await websockets.connect(
    "wss://api.munsit.com/api/v1/listen?encoding=linear16&sample_rate=16000",
    additional_headers={"x-api-key": MUNSIT_API_KEY},
)
async for frame in microphone():          # 20–200 ms of PCM each
    await ws.send(frame)
await ws.send(json.dumps({"type": "CloseStream"}))

الأرقام المهمة في نقل البيانات.

ما يصل أولًا، ومتى، وبأي معدل، وكم عددها في آن واحد.

<50 ms
إلى أول نتيجة جزئية, رقم تحويل الكلام إلى نص، دخولًا
أقل من 50 مللي ثانية
حتى أول بايت صوتي, رقم تحويل النص إلى كلام، خروجًا
48 kHz
معدل العينات الأصلي, دون إعادة أخذ عينات لـ WebRTCDocs
5
جلسات لكل مفتاح, افتراضيًا، ويُرفع عند الطلبDocs

تظهر الكلمات وهم ما زالوا يتكلمون.

كل رسالة من الخادم كائن JSON بحقل type. يصل الدور بهذا الترتيب، ويحمل كل حدث معرّف الجلسة، فيستطيع العميل متعدد الجلسات نسبته دون تتبع الاتصالات.

  1. 01

    يبدأ الكلام

    أكّد كاشف النشاط الصوتي وجود كلام على القناة. ts هي الثانية في الصوت.

  2. 02

    نتائج مؤقتة

    تتجدد باستمرار ما دام المتحدث يتكلم، وقد تعدّل كلمات سابقة. اعرضها نصًا مبدئيًا.

  3. 03

    النتيجة النهائية

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

  4. 04

    نهاية الدور

    يُطلق فقط عند نهاية دور حقيقية، لا عند تقسيم قسري. أوضح إشارة مفردة إلى أن المتصل توقف عن الكلام.

  5. 05

    الجنس

    يُصنَّف من صوت الدور، ذكر أو أنثى، مع درجة. دون طلب إضافي.

  6. 06

    المشاعر

    إيجابي أو محايد أو سلبي، من نص الدور. في مكالمة بقناتين، مسار حي لكل طرف.

يعرف متى انتهى المتصل، لا متى توقف فقط.

مدة الصمت التي ينتظرها المحرك قبل أن يعلن انتهاء الدور هي المفاضلة بين زمن الاستجابة والدقة التي تتحكم بها، ويمكنك ضبطها أثناء الجلسة.

  • اضبطها مباشرة برسالة Configure: ‏300 لسؤال بنعم أو لا، وعُد إلى 800 لجواب مفتوح.
  • يشغّل كشف الدور الذكي نموذجًا دلاليًا لنهاية الدور عند كل توقف، فلا يُقطع متصل توقف ليفكر.
  • ينتهي الدور دائمًا بعد ضعف مدة الصمت المحددة، مهما قال النموذج.
  • 800 msأأمن حدود
    تصل النتيجة النهائية
    بعد نحو 1.2 ث من انتهاء الكلام
    الأنسب لـ
    الكلام الحواري
    المقابل
    أطول انتظار
  • 500 msمتوازن
    تصل النتيجة النهائية
    نحو 0.9 ث
    الأنسب لـ
    معظم التردد في منتصف الجملة
    المقابل
    قليل من كلٍّ
  • 300 msالأسرع
    تصل النتيجة النهائية
    نحو 0.8 ث
    الأنسب لـ
    الأوامر القصيرة
    المقابل
    قد يقطع متحدثًا مترددًا في منتصف فكرته
endpointing800 msأأمن حدود500 msمتوازن300 msالأسرع
تصل النتيجة النهائيةبعد نحو 1.2 ث من انتهاء الكلامنحو 0.9 ثنحو 0.8 ث
الأنسب لـالكلام الحواريمعظم التردد في منتصف الجملةالأوامر القصيرة
المقابلأطول انتظارقليل من كلٍّقد يقطع متحدثًا مترددًا في منتصف فكرته

أرسل نصًا، واسمع الكلام قبل تكتمل الجملة.

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

اطلب 48 كيلوهرتز. إنه المعدل الأصلي للمحرك، فيتخطى الصوت تقليل العينات ولا يحتاج إلى إعادة أخذ عينات في العميل لـ WebRTC.

أربع ممارسات للحفاظ على استقرار الجلسة.

تُحسب ثواني الاستماع مضروبة في عدد القنوات، وتُغلق الجلسة برمز يوضح السبب. اتبع هذه الخطوات الأربع لضمان بقاء الجلسة نشطة.

  • أرسل KeepAlive أثناء التوقف

    تُغلق الجلسة تلقائياً إذا مرت 12 ثانية دون إرسال بيانات صوتية أو إشارة KeepAlive.

  • أرسل الملف بوتيرة الزمن الحقيقي

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

    4008
  • أنهِ بـ CloseStream

    يُنهي هذا الأمر تدفق البيانات الحالي ويرسل الـ Metadata الختامية متضمنة الثواني المحتسبة. واصل قراءة الردود حتى يُغلق الخادم الاتصال.

  • اقرأ رمز الإغلاق

    الرمز 1008: يتعلق بـ API Key، أو تجاوز الحد الأقصى للجلسات، أو رصيد المحفظة. رسالة الخطأ (Error) السابقة له ستحدد لك السبب الدقيق.

    1008

افتح الـ Socket. واقرأ الكلام وهو يُقال.

تصل أول نتيجة جزئية في أقل من 50 مللي ثانية. جرّبه مجانًا.