البث المباشر
مقبس واحد يستقبل الكلام العربي بثًا ويعيد النص وهو يُقال. وطلب واحد يبث الكلام من أول مقطع. المفتاح نفسه، والعنوان الأساسي نفسه، وهي بنية مصممة لتبادل الأدوار الذي يعتمد عليه الوكيل الصوتي.
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"}))ما يصل أولًا، ومتى، وبأي معدل، وكم عددها في آن واحد.
كل رسالة من الخادم كائن JSON بحقل type. يصل الدور بهذا الترتيب، ويحمل كل حدث معرّف الجلسة، فيستطيع العميل متعدد الجلسات نسبته دون تتبع الاتصالات.
أكّد كاشف النشاط الصوتي وجود كلام على القناة. ts هي الثانية في الصوت.
تتجدد باستمرار ما دام المتحدث يتكلم، وقد تعدّل كلمات سابقة. اعرضها نصًا مبدئيًا.
نص لن يتغير، مع طابع زمني ودرجة ثقة لكل كلمة. speech_final: true تعني أن المتحدث انتهى فعلًا؛ وهذه إشارتك للرد.
يُطلق فقط عند نهاية دور حقيقية، لا عند تقسيم قسري. أوضح إشارة مفردة إلى أن المتصل توقف عن الكلام.
يُصنَّف من صوت الدور، ذكر أو أنثى، مع درجة. دون طلب إضافي.
إيجابي أو محايد أو سلبي، من نص الدور. في مكالمة بقناتين، مسار حي لكل طرف.
مدة الصمت التي ينتظرها المحرك قبل أن يعلن انتهاء الدور هي المفاضلة بين زمن الاستجابة والدقة التي تتحكم بها، ويمكنك ضبطها أثناء الجلسة.
| endpointing | 800 msأأمن حدود | 500 msمتوازن | 300 msالأسرع |
|---|---|---|---|
| تصل النتيجة النهائية | بعد نحو 1.2 ث من انتهاء الكلام | نحو 0.9 ث | نحو 0.8 ث |
| الأنسب لـ | الكلام الحواري | معظم التردد في منتصف الجملة | الأوامر القصيرة |
| المقابل | أطول انتظار | قليل من كلٍّ | قد يقطع متحدثًا مترددًا في منتصف فكرته |
ثلاث طرق لاستلام الكلام وهو يُولَّد. اختر بحسب مكان نصك: معروف كله مسبقًا، أو ما زال يصل من نموذج، أو يحتاج توقيتات للترجمة المصاحبة.
اطلب 48 كيلوهرتز. إنه المعدل الأصلي للمحرك، فيتخطى الصوت تقليل العينات ولا يحتاج إلى إعادة أخذ عينات في العميل لـ WebRTC.
طلب POST واحد مع streaming: true. تصل مقاطع PCM16 خامًا وهي تُولَّد؛ ابدأ التشغيل من الأول.
POST /text-to-speech/{model_id}افتح مقبس النص، وأرسل المقاطع كما يصدرها نموذجك، واستلم PCM بترميز base64. أرسل flush مع الأخير.
WSS /websocket/text-to-speechالصوت نفسه في أسطر NDJSON مع محاذاة على مستوى الحرف في النهاية، للتظليل والترجمة المصاحبة.
POST /text-to-speech/{model_id}/with-timestampsكل ما في واجهة API يعود قبل أن ينتهي، وصفحة كلٍّ منها على docs.munsit.com.
صوت يدخل عبر WebSocket، ونصوص تعود والناس يتكلمون.
WSS /listenنص يدخل، ومقاطع PCM تخرج من أول بايت.
POST /text-to-speech/{model_id}من أي لغة إلى أخرى عبر Server-Sent Events، مقطعًا مقطعًا.
POST /translation/streamتقدّم مهمة عزل الصوت عبر SSE، ينتهي برابط الصوت النظيف.
GET /denoise/{denoiseId}/progressتُحسب ثواني الاستماع مضروبة في عدد القنوات، وتُغلق الجلسة برمز يوضح السبب. اتبع هذه الخطوات الأربع لضمان بقاء الجلسة نشطة.
تُغلق الجلسة تلقائياً إذا مرت 12 ثانية دون إرسال بيانات صوتية أو إشارة KeepAlive.
KeepAlive1011يمكن للصوت أن يسبق الزمن الفعلي بـ 60 ثانية كحد أقصى. البث المباشر لن يتجاوز هذا الحد، لكن إرسال ملف صوتي مسجل سيتجاوزه ما لم تقم بضبط سرعة الإرسال.
يُنهي هذا الأمر تدفق البيانات الحالي ويرسل الـ Metadata الختامية متضمنة الثواني المحتسبة. واصل قراءة الردود حتى يُغلق الخادم الاتصال.
CloseStream1000الرمز 1008: يتعلق بـ API Key، أو تجاوز الحد الأقصى للجلسات، أو رصيد المحفظة. رسالة الخطأ (Error) السابقة له ستحدد لك السبب الدقيق.
إن كنت تبني وكيلًا، فقد لا تفتح المقبس بنفسك أبدًا. هذه الأربعة تفعل ذلك عنك، بـ Munsit STT مفرِّغًا وMunsit TTS صوتًا.
استخدم مُنصِت كعقدة لتحويل الكلام إلى نص في مسار LiveKit Agents.
livekit-plugins-munsitأدرِج مُنصِت كصنف خدمة في مسار Pipecat الفوري.
pipecat-plugins-munsitاختر مُنصِت كمفرِّغ للنص في أي مساعد على VAPI.
transcriber: munsitاربط مُنصِت كمدخل صوتي لمكالمات Ultravox.
stt.provider = munsitتصل أول نتيجة جزئية في أقل من 50 مللي ثانية. جرّبه مجانًا.