إنشاء IVR استنادًا إلى Asterisk ، مع التعرف على DTMF وأسماء الموظفين (استنادًا إلى
Voicer من
antirek المحترم) والاتصال بـ PBX الحالي.
جلبت السنة الجديدة القادمة إلى الشركة التي أعمل فيها الأخبار السارة (غير الرسمية) - توفي خادم قديم مزود بنظام IVR ولوحة PCI لأربعة منافذ تمثيلية من Dialogic. أصبح من الواضح فجأة أن الأنظمة الحديثة لا تحتوي على فتحات PCI ، والأنظمة القديمة ليست صديقة للإصدارات الجديدة من نظام التشغيل ، ومن غير المعروف كم من الوقت ستعيش ، والترخيص متاح فقط لإصدار قديم محدد من البرنامج.
لذلك ولدت الفكرة لرفع IVR بدون لوحة (ومجانية) في جهاز افتراضي مع علامة النجمة.
المجموع ، نحتاج:
- PBX الحالية مع المشتركين
- جهاز افتراضي (في المثال ، أوبونتو 18.04 لتر).
- التسجيل في أي من خدمات التعرف على الصوت: wit.ai أو google أو Yandex
- الحد الأدنى من المعرفة بأنظمة لينكس
- الرغبة في التعامل مع النجمة
إذا تم الانتهاء من جميع النقاط بنجاح - يمكنك المتابعة. أول شيء فعله هو وضع العلامة النجمية نفسها ، والمطالبات الصوتية للاختبار ، وكذلك العقيدات و npm.
apt install nodejs asterisk npm asterisk-core-sounds-ru-gsm
بعد ذلك ، نحتاج إلى خدمة التعرف على الصوت ومدير العملية نفسه لبدء تشغيله:
npm install voicer -g npm install pm2 -g
إنشاء مجلدات وتكوين للصوت:
mkdir -p /etc/voicer/data
واكتب التكوين إلى الملف /etc/voicer/config.js ، بإضافة اسم المستخدم / كلمة المرور والمفتاح (developer_key) إلى الخدمة المطلوبة. في حالتي ، تم اختيار wit.ai - مجاني ودقيق بما يكفي لمهامنا.
module.exports = { agi: { port: 3000 }, web: { port: 3100, auth: true, username: '_', password: '_', realm: '_' }, processing: { totalAttempts: 2, playGreeting: true, playBeepBeforeRecording: false
بعد ذلك ، نحتاج إلى إنشاء خدمة لتشغيل الصوت. سيكون هذا الملف / etc / init.d/voicer:
حسنًا ، قم بتنشيطه:
systemctl daemon-reload systemctl enable voicer systemctl start voicer
تجدر الإشارة إلى أن voicer سوف تخزن الملفات المسجلة في المجلد / tmp وسيكون من الجيد تنظيفها بشكل دوري. قم بإنشاء برنامج نصي بسيط لهذا وإضافته إلى /etc/cron.daily
حسنًا ، يبقى الجزء الأكثر صعوبة الآن - لتكوين العلامة النجمية نفسها. نظرًا لأن لدينا بالفعل PBX ويستخدمه جميع العملاء ، فنحن لا نحتاج إلى معظم التكوين. نقوم بحذف (أو حفظ في مكان مظلم بارد وجاف - إذا رغبت في ذلك) كل شيء من مجلد / etc / asterisk باستثناء asterisk.conf و modules.conf و sip.conf. ونضيف تكوين sip.conf مع الأسطر التالية ، مضيفًا القيم التي نحتاجها:
- fromdomain - عنوان الخادم مع علامة النجمة
- المضيف - عنوان PBX
- fromuser: سر و defaultuser: remotesecret - تسجيل الدخول: أزواج كلمة المرور المتبادلة بين العلامة النجمية و PBX
[main_link] fromdomain=xxx.xxx.xxx.xxx host=xxx.xxx.xxx.yyy insecure=port port=5060 realm=asterisk sendrpid=pai fromuser=111 secret=111 defaultuser=222 remotesecret=222 qualify=yes type=friend disallow=all allow=alaw context=main_link promiscredir=yes dtmfmode=auto
هنا يجدر الانتباه إلى الوضع الذي تعمل به أوامر dtmf في PBX. يرجى ملاحظة أنه يمكن معالجتها بطرق مختلفة لمكالمات PBX الخارجية (على سبيل المثال ، من مدينة أو من هاتف محمول) والمكالمات الداخلية بين المشتركين في PBX الخاص بك. في حالتي ، في الإصدار الأول كان إشارات dtmf inband ، في الثانية - rfc2833. لكن السيارات فعلت ذلك. أيضًا ، قد تنتظرك ميزات شيقة للتفاعل مع PBX - سيتعين عليك معرفة ما هو مطلوب ، على سبيل المثال ، لحفظ المشترك معرف المتصل (الخارجي) عند إرجاع مكالمة من IVR إلى PBX (خط sendrpid).
وكان هناك ملف تكوين واحد آخر. الأكثر أهمية. Dialplan ، ويعرف أيضا باسم extensions.conf. من المؤكد أنك تحتاج إلى الإشارة إلى رقمك الخارجي (من سيتصل به الأشخاص) ، ورقم السكرتير (الذي سيتم استخدامه افتراضيًا) والمسار إلى مطالباتك الصوتية.
[general] static=yes writeprotect=no [globals] [main_link] exten => __,1,Goto(ivr_tree,s,1) [ivr_tree] ;allow direct dialing to internal users exten => _40XX,1,Background(custom/common/SoedinyauVas) ;check user voice existance same => n,Set(exists=${STAT(e,${ASTDATADIR}/sounds/custom/${EXTEN}.vox)}) same => n,Playback(custom/${IF($[ ${exists} = 1 ] ? ${EXTEN} : Sotrudnik)}) same => n,Transfer(SIP/${EXTEN}@_) ;start intro exten => s,1,Answer() same => n,Set(CHANNEL(language)=ru) same => n,Background(custom/common/Welcome) ;start recognition same => n,AGI(agi://localhost:3000) same => n,GotoIf($[${RECOGNITION_RESULT}=SUCCESS]?:default) same => n,Background(custom/common/SoedinyauVas) ;check user voice existance same => n,Set(exists=${STAT(e,${ASTDATADIR}/sounds/custom/${RECOGNITION_TARGET}.vox)}) ;play user name or default name same => n,Playback(custom/${IF($[ ${exists} = 1 ] ? ${RECOGNITION_TARGET} : Sotrudnik)}) same => n,Transfer(SIP/${RECOGNITION_TARGET}@_) same => n,Hangup() ;default route same => n(default),Transfer(SIP/4001@_)
يستخدم هذا المثال التحيات وأسماء الموظفين وعبارة "توصيلك". في الوقت نفسه ، يتم طلب تلميح للموظف عن طريق رقمه ، وإذا لم يتم الإعلان عن ذلك ببساطة "مع الموظف". أوصي بطلب مثل هذه التلميحات إلى الاستوديوهات - أنظمة توليف الكلام ، للأسف ، ليست مثالية ونطقها باسم شركتك وأسماء الموظفين مناسبة للترفيه فقط. 40XX - الأرقام في الشركة ، 4001 - سكرتير.
خصوصية هذا الموقف هو أن PBX هو الذي يتعامل مع مكالماتنا. وبالتالي ، بدلاً من الأمر Dial المعتاد ، نستخدم الأمر Transfer - ثم تترك المكالمة الواردة بعد IVR تمامًا النجمة وتحرر قنوات SIP PBX (غالباً ما يكون رقمها مشفرًا بواسطة الترخيص). في معظم الحالات ، يُنصح الأمر Transfer (نقل) باستخدام اسم الاتجاه (main_link) ، لكن بالنسبة إلى PBX الخاص بي ، كانت الإشارة المباشرة فقط إلى عنوان المحطة مناسبة.
حان الوقت لإضافة مستخدمين إلى نظام التعرف. للقيام بذلك ، انتقل إلى عنوان الخادم الخاص بنا والمنفذ 3100 ، وبعد ذلك نكتب أسماء وألقاب وأرقام الموظفين هناك.
أصبح بإمكان العلامة النجمية لدينا استقبال المكالمات الواردة والتعرف على إشارات DTMF والتعرف على أسماء الموظفين وإعادة توجيهها إلى أرقامها الداخلية. يبقى فقط لإقناع المحطة أنه يحتاج إلى إرسال المكالمات الواردة إلى خادمنا. اعتمادًا على الشركة المصنعة ، يمكن أن تكون هذه الإعدادات متنوعة تمامًا ، ولكن المسار المطلوب سيحتوي على الكلمات ARS وتوجيه الاتصال. لكن هذه قصة مختلفة تماما.