IVR de reconhecimento de voz do Asterisk - rápido, fácil e gratuito

Criação de IVR com base no Asterisk, com reconhecimento de DTMF e nomes de funcionários (com base no Voicer de um antirek respeitado) e conexão com um PABX existente.

O próximo ano novo trouxe para a empresa onde trabalho, as (in) alegres notícias - um servidor antigo com sistema IVR e placa PCI para 4 portas analógicas da Dialogic. De repente, ficou claro que os sistemas modernos não possuem slots PCI, os antigos não são compatíveis com as novas versões do sistema operacional e não se sabe quanto tempo eles durarão, e a licença está disponível apenas para uma versão antiga específica do programa.
Assim, nasceu a ideia de aumentar a URA sem uma placa (e grátis) em uma máquina virtual com o Asterisk.

Total, precisamos de:

  • PBX existente com assinantes
  • Máquina virtual (no exemplo, ubuntu 18.04 lts).
  • Registro em qualquer serviço de reconhecimento de voz: wit.ai, google ou Yandex
  • Conhecimento mínimo de sistemas Linux
  • O desejo de lidar com o Asterisk

Se todos os pontos forem concluídos com sucesso - você pode prosseguir. A primeira coisa a fazer é colocar o próprio asterisco, avisos de voz para o teste, além de nodejs e npm.

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

Em seguida, precisamos do serviço de reconhecimento de voz e do próprio gerente de processos para iniciá-lo:

 npm install voicer -g npm install pm2 -g 

Crie pastas e configurações para o voicer:

 mkdir -p /etc/voicer/data 

E escreva a configuração no arquivo /etc/voicer/config.js, adicionando seu nome de usuário / senha e chave (developer_key) ao serviço desejado. No meu caso, o wit.ai foi escolhido - livre, preciso o suficiente para nossas tarefas.

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

Em seguida, precisamos criar um serviço para executar o voicer. Este será o arquivo /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 

Bem, ative-o:

 systemctl daemon-reload systemctl enable voicer systemctl start voicer 

Note-se que o voicer armazenará os arquivos gravados na pasta / tmp e seria bom limpá-lo periodicamente. Crie um script simples para isso e adicione-o ao /etc/cron.daily

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

Bem, agora a parte mais difícil permanece - configurar o próprio asterisco. Como já temos um PBX e todos os clientes o utilizam, não precisamos da maior parte da configuração. Excluímos (ou salvamos em um local escuro, fresco e seco - se desejado) tudo da pasta / etc / asterisk, exceto asterisk.conf, modules.conf e sip.conf. E adicionamos a configuração sip.conf com as seguintes linhas, adicionando os valores que precisamos:

  • fromdomain - endereço do servidor com um asterisco
  • host - endereço do PBX
  • fromuser: secret e defaultuser: remotesecret - login: pares de senhas trocados por asterisco e 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 

Aqui vale a pena prestar atenção no modo em que os comandos dtmf funcionam no seu PBX. Observe que eles podem ser processados ​​por métodos diferentes para chamadas externas de PBX (por exemplo, de uma cidade ou de um telefone celular) e chamadas internas entre os assinantes do seu PBX. No meu caso, na primeira versão, era sinais de banda dtmf, na segunda - rfc2833. Mas o auto fez isso. Além disso, recursos interessantes de interação com o seu PBX podem esperar por você - você terá que descobrir em primeira mão o que é necessário, por exemplo, para salvar o assinante de identificação de chamada (externa) ao retornar uma chamada do IVR para o PBX (linha sendrpid).

E havia mais um arquivo de configuração. O mais importante. Dialplan, também conhecido como extensions.conf. Nele, você definitivamente precisa indicar seu número externo (para o qual as pessoas ligarão), o número da secretária (que será usado por padrão) e o caminho para suas solicitações 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 exemplo usa saudações, nomes de funcionários e a frase "conectar você". Ao mesmo tempo, uma dica para um funcionário é procurada pelo seu número e, se não for pronunciada simplesmente "com o funcionário". Eu recomendo encomendar essas dicas para os estúdios - os sistemas de síntese de fala, infelizmente, não são perfeitos e a pronúncia do nome da sua empresa e do nome dos funcionários é adequada apenas para entretenimento. 40XX - números na empresa, 4001 - secretário.

A peculiaridade dessa situação é que é o PBX que lida com nossas chamadas. Portanto, em vez do comando de discagem usual, usamos o comando Transferir - e, em seguida, a chamada recebida após o IVR sai completamente do asterisco e libera os canais sip do PBX (o número deles geralmente é codificado pela licença). Na maioria dos casos, o comando Transfer é aconselhado a usar o nome da direção (main_link), mas para o meu PBX apenas uma indicação direta do endereço da estação era adequada.

É hora de adicionar usuários ao sistema de reconhecimento. Para fazer isso, vá para o endereço do servidor e porta 3100, após o qual escrevemos os nomes, sobrenomes e números de funcionários.

Agora, nosso asterisco é capaz de receber chamadas, reconhecer sinais DTMF, reconhecer nomes de funcionários e redirecioná-los para seus números internos. Resta apenas convencer a estação de que precisa enviar chamadas recebidas para o nosso servidor. Dependendo do fabricante, essas configurações podem ser completamente diversas, mas o caminho desejado conterá as palavras ARS e roteamento de chamadas. Mas esta é uma história completamente diferente.

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


All Articles