Asterisk Voice Recognition IVR - Rápido, Fácil, Gratis

Creación de IVR basado en Asterisk, con reconocimiento de DTMF y nombres de empleados (basado en Voicer de respetado antirek ) y conexión a una PBX existente.

El próximo año nuevo trajo la (no) buena noticia a la compañía donde trabajo: el antiguo servidor con sistema IVR y placa PCI para 4 puertos analógicos de Dialogic murió. De repente se hizo evidente que los sistemas modernos no tienen ranuras PCI, los antiguos no son compatibles con las nuevas versiones del sistema operativo y no se sabe cuánto tiempo vivirán, y la licencia solo está disponible para una versión anterior específica del programa.
Entonces, la idea nació para aumentar la IVR sin una placa (y gratis) en una máquina virtual con Asterisk.

Total, necesitamos:

  • PBX existente con suscriptores
  • Una máquina virtual (en el ejemplo, ubuntu 18.04 lts).
  • Registro en cualquiera de los servicios de reconocimiento de voz: wit.ai, google o Yandex
  • Mínimo conocimiento de los sistemas Linux.
  • El deseo de lidiar con el asterisco

Si todos los puntos se completan con éxito, puede continuar. Lo primero que debe hacer es colocar un asterisco en sí mismo, indicaciones de voz para la prueba, así como nodejs y npm.

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

A continuación, necesitamos el servicio de reconocimiento de voz y el administrador de procesos para iniciarlo:

 npm install voicer -g npm install pm2 -g 

Crear carpetas y configuración para voicer:

 mkdir -p /etc/voicer/data 

Y escriba la configuración en el archivo /etc/voicer/config.js, agregando su nombre de usuario / contraseña y clave (developer_key) al servicio deseado. En mi caso, se eligió wit.ai: gratis, lo suficientemente preciso para nuestras tareas.

 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 } } }; 

A continuación, necesitamos crear un servicio para ejecutar voicer. Este será el archivo /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 

Bueno, actívalo:

 systemctl daemon-reload systemctl enable voicer systemctl start voicer 

Cabe señalar que voicer almacenará los archivos grabados en la carpeta / tmp y sería bueno limpiarlo periódicamente. Cree un script simple para esto y agréguelo a /etc/cron.daily

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

Bueno, ahora queda la parte más difícil: configurar el asterisco en sí. Como ya tenemos una PBX y todos los clientes la usan, no necesitamos la mayor parte de la configuración. Eliminamos (o guardamos en un lugar oscuro, fresco y seco, si lo desea) todo de la carpeta / etc / asterisk excepto asterisk.conf, modules.conf y sip.conf. Y agregamos la configuración sip.conf con las siguientes líneas, agregando los valores que necesitamos para:

  • fromdomain: dirección del servidor con un asterisco
  • host - dirección PBX
  • fromuser: secret y defaultuser: remotesecret - login: pares de contraseñas intercambiadas por asterisco y 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 

Aquí vale la pena prestar atención al modo en que los comandos dtmf funcionan en su PBX. Tenga en cuenta que pueden procesarse por diferentes métodos para llamadas PBX externas (por ejemplo, desde una ciudad o desde un teléfono móvil) y llamadas internas entre suscriptores de su PBX. En mi caso, en la primera versión eran señales dtmf en banda, en la segunda, rfc2833. Pero auto lo hizo. Además, pueden esperar características interesantes de interacción con su PBX: tendrá que averiguar de primera mano lo que se requiere, por ejemplo, para guardar el suscriptor del identificador de llamadas (externo) al devolver una llamada de IVR a la PBX (línea sendrpid).

Y había un archivo de configuración más. Lo mas importante. Dialplan, también conocido como extensiones.conf. Definitivamente, debe indicar su número externo (a qué personas llamarán), el número de la secretaria (que se usará por defecto) y la ruta a sus indicaciones de voz.

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

Este ejemplo utiliza saludos, nombres de empleados y la frase "conectarlo". Al mismo tiempo, se busca una pista para un empleado por su número, y si no se pronuncia simplemente "con el empleado". Recomiendo ordenar tales sugerencias a los estudios: los sistemas de síntesis de voz, por desgracia, no son perfectos y su pronunciación del nombre de su empresa y los nombres de los empleados es adecuada solo para el entretenimiento. 40XX - números en la empresa, 4001 - secretaria.

La peculiaridad de esta situación es que es la PBX la que se ocupa de nuestras llamadas. Por lo tanto, en lugar del comando de marcación habitual, usamos el comando de transferencia, y luego la llamada entrante después de que IVR deja completamente el asterisco y libera los canales de sorbo de PBX (su número a menudo está codificado por la licencia). En la mayoría de los casos, se recomienda que el comando Transferir utilice el nombre de la dirección (main_link), pero para mi PBX solo era adecuada una indicación directa de la dirección de la estación.

Es hora de agregar usuarios al sistema de reconocimiento. Para hacer esto, vaya a la dirección de nuestro servidor y al puerto 3100, después de lo cual escribimos los nombres, apellidos y números de empleados allí.

Ahora nuestro asterisco puede recibir llamadas entrantes, reconocer señales DTMF, reconocer nombres de empleados y redirigirlos a sus números internos. Solo queda convencer a la estación de que necesita enviar llamadas entrantes a nuestro servidor. Dependiendo del fabricante, estas configuraciones pueden ser completamente diversas, pero la ruta deseada contendrá las palabras ARS y enrutamiento de llamadas. Pero esta es una historia completamente diferente.

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


All Articles