Asterisk Voice Recognition IVR - Cepat, Mudah, Gratis

Pembuatan IVR berdasarkan Asterisk, dengan pengakuan DTMF dan nama karyawan (berdasarkan Voicer dari antirek yang disegani) dan menghubungkan ke PBX yang ada.

Tahun baru mendatang membawa (bukan) kabar baik ke perusahaan tempat saya bekerja - server kuno dengan sistem IVR dan PCI-board untuk 4 port analog dari Dialogic meninggal. Tiba-tiba menjadi jelas bahwa sistem modern tidak memiliki slot PCI, yang lama tidak ramah dengan versi baru OS dan tidak diketahui berapa lama mereka akan hidup, dan lisensi hanya untuk versi lama tertentu dari program.
Jadi ide itu lahir untuk meningkatkan IVR tanpa papan (dan gratis) di mesin virtual dengan Asterisk.

Total, kita perlu:

  • PBX yang ada dengan pelanggan
  • Mesin virtual (dalam contoh, ubuntu 18,04 lts).
  • Registrasi pada salah satu layanan pengenalan suara: wit.ai, google atau Yandex
  • Pengetahuan minimum tentang sistem Linux
  • Keinginan untuk berurusan dengan Asterisk

Jika semua poin berhasil diselesaikan - Anda dapat melanjutkan. Hal pertama yang harus dilakukan adalah meletakkan asterisk itu sendiri, suara meminta tes, serta nodejs dan npm.

apt install nodejs asterisk npm asterisk-core-sounds-ru-gsm 

Selanjutnya, kita membutuhkan layanan pengenalan voicer dan manajer proses itu sendiri untuk memulainya:

 npm install voicer -g npm install pm2 -g 

Buat folder dan konfigurasi untuk voicer:

 mkdir -p /etc/voicer/data 

Dan tulis konfigurasi ke file /etc/voicer/config.js, tambahkan nama pengguna / kata sandi dan kunci Anda (developer_key) ke layanan yang diinginkan. Dalam kasus saya, wit.ai terpilih - gratis, cukup akurat untuk tugas kami.

 module.exports = { agi: { port: 3000 }, web: { port: 3100, auth: true, username: '_', password: '_', realm: '_' }, processing: { totalAttempts: 2, playGreeting: true, playBeepBeforeRecording: false //use system beep }, asterisk: { sounds: { onErrorBeforeFinish: 'invalid', onErrorBeforeRepeat: 'invalid', greeting: 'beep' }, recognitionDialplanVars: { status: 'RECOGNITION_RESULT', target: 'RECOGNITION_TARGET' } }, record: { directory: '/tmp', type: 'wav', duration: 3, }, recognize: { directory: '/tmp', type: 'witai', // ['yandex', 'google', 'witai'] options: { developer_key: 'XXXXXXXXXXXXXXXXXXX' } }, lookup: { type: 'file', options: { dataFile: '/etc/voicer/data/peernames.json' } }, logger: { console: { colorize: true }, file: { filename: '/var/log/voicer.log', json: false } } }; 

Selanjutnya, kita perlu membuat layanan untuk menjalankan voicer. Ini akan menjadi file /etc/init.d/voicer:

 #!/bin/sh ### BEGIN INIT INFO # Provides: voicer # Required-Start: $network $syslog $named # Required-Stop: $network $syslog $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/stop voicer ### END INIT INFO set -e if [ -z "$1" ] ; then echo "Usage: $0 [start|stop|restart]" exit 0 fi if [ "$1" = "start" ] ; then VOICER_CONFIGFILE=/etc/voicer/config pm2 start voicer elif [ "$1" = "stop" ] ; then pm2 stop voicer elif [ "$1" = "restart" ] ; then $0 stop sleep 5 $0 start fi 

Baiklah, aktifkan:

 systemctl daemon-reload systemctl enable voicer systemctl start voicer 

Perlu dicatat bahwa voicer akan menyimpan file yang direkam di folder / tmp dan akan lebih baik jika dibersihkan secara berkala. Buat skrip sederhana untuk ini dan tambahkan ke /etc/cron.daily

 #!/bin/sh rm /tmp/*.wav 

Nah, sekarang bagian yang lebih sulit tetap - untuk mengkonfigurasi asterisk itu sendiri. Karena kami sudah memiliki PBX dan semua klien menggunakannya, kami tidak memerlukan sebagian besar konfigurasi. Kami menghapus (atau menyimpan di tempat yang gelap, dingin, kering - jika diinginkan) semuanya dari folder / etc / asterisk kecuali asterisk.conf, modules.conf dan sip.conf. Dan kami menambahkan konfigurasi sip.conf dengan baris berikut, menambahkan nilai yang kami butuhkan untuk:

  • fromdomain - alamat server dengan tanda bintang
  • host - alamat PBX
  • fromuser: secret dan defaultuser: remotesecret - login: pasangan kata sandi dipertukarkan oleh asterisk dan 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 

Ini ada baiknya memperhatikan mode di mana perintah dtmf bekerja di PBX Anda. Harap dicatat bahwa mereka dapat diproses dengan metode berbeda untuk panggilan PBX eksternal (misalnya, dari kota atau dari ponsel) dan panggilan internal antar pelanggan PBX Anda. Dalam kasus saya, dalam versi pertama itu adalah sinyal dtmf inband, di kedua - rfc2833. Tapi secara otomatis melakukannya. Selain itu, Anda mungkin mengharapkan fitur interaksi yang menarik dengan PBX Anda - Anda harus mengetahui secara langsung apa yang diperlukan, misalnya, untuk menyimpan pelanggan ID pemanggil (eksternal) ketika mengembalikan panggilan dari IVR ke PBX (saluran sendrpid).

Dan ada satu file konfigurasi lagi. Yang paling penting. Dialplan, alias extensions.conf. Di dalamnya, Anda pasti perlu menunjukkan nomor eksternal Anda (yang akan dihubungi orang), nomor sekretaris (yang akan digunakan secara default) dan jalur ke suara Anda meminta.

 [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@_) 

Contoh ini menggunakan salam, nama karyawan, dan frasa "sambungkan Anda." Pada saat yang sama, sebuah petunjuk untuk seorang karyawan dicari oleh nomornya, dan jika itu tidak diucapkan hanya "dengan karyawan". Saya sarankan memesan petunjuk seperti itu ke studio - sistem sintesis pidato, sayangnya, tidak sempurna dan pengucapan mereka atas nama perusahaan Anda dan nama-nama karyawan hanya cocok untuk hiburan. 40XX - angka di perusahaan, 4001 - sekretaris.

Keunikan dari situasi ini adalah PBX yang menangani panggilan kami. Dengan demikian, alih-alih perintah Dial yang biasa, kami menggunakan perintah Transfer - dan kemudian panggilan masuk setelah IVR sepenuhnya meninggalkan tanda bintang dan membebaskan saluran sip PBX (nomor mereka sering kali dikodekan dengan keras oleh lisensi). Dalam kebanyakan kasus, perintah Transfer disarankan untuk menggunakan nama arah (main_link), tetapi untuk PBX saya hanya indikasi langsung dari alamat stasiun yang cocok.

Saatnya menambahkan pengguna ke sistem pengenalan. Untuk melakukan ini, pergi ke alamat server dan port 3100 kami, setelah itu kami menulis nama, nama keluarga dan jumlah karyawan di sana.

Sekarang tanda bintang kami dapat menerima panggilan masuk, mengenali sinyal DTMF, mengenali nama karyawan dan mengarahkannya ke nomor internal mereka. Tetap hanya untuk meyakinkan stasiun bahwa ia perlu mengirim panggilan masuk ke server kami. Tergantung pada pabrikannya, pengaturan ini bisa sangat beragam, tetapi jalur yang diinginkan akan berisi kata ARS dan perutean panggilan. Tetapi ini adalah kisah yang sangat berbeda.

Source: https://habr.com/ru/post/id436016/


All Articles