أرسل POST /api/v1/voice/calls/{id}/control أثناء جريان المكالمة. يلتقط الـworker الذي يشغّل المكالمة الأمر خلال نحو ثانيتين؛ وتردّ الواجهة بـ202. إذا تعذّر الوصول إلى الـworker الذي يشغّل المكالمة، تردّ الواجهة بـ503 (code call_unreachable) ولا يُنفَّذ الأمر.
type | ما يحدث |
|---|---|
say | يقول الوكيل text بعد جملته الحالية، أو فورًا مع "interrupt": true |
note | يُخبَر الوكيل بـtext (دون نطقه) ويأخذه في الحسبان ابتداءً من ردّه التالي؛ ويدوّنه النص المفرَّغ |
end | يقول الوكيل text إن وُجد، ثم يُغلق الخط؛ والمكالمة الهاتفية بدون text تُغلق فورًا |
وتكون قيمة ended_reason للمكالمة حينها api_ended. وفي صفحة المكالمة في لوحة التحكم عناصر التحكم نفسها.
يُرجع POST /api/v1/voice/calls/{id}/listen (ويمكن إضافة { "channels": 2 }) العنوانَ listen_url الذي يمكنك فتحه خلال دقيقتين. وهو WebSocket: أولًا رسالة JSON هي {"type":"start","sampleRate":8000,"channels":1,"encoding":"pcm_s16le"}، ثم إطارات ثنائية من PCM بدقة 16 بت little-endian بما يسمعه المتصل (الصوتان ممزوجان؛ ومع channels: 2 يكون المتصل على اليسار والوكيل على اليمين). ويُغلق عند انتهاء المكالمة. يأتي الصوت مباشرة من الـworker الذي يشغّل المكالمة، لا عبر مستوى التحكم في EvaSay؛ وزر الاستماع في صفحة المكالمة بلوحة التحكم يستخدم العنوان نفسه.