星号语音识别IVR-快速,轻松,免费

创建基于Asterisk的IVR,并识别DTMF和员工姓名(基于受尊敬的antirek的Voicer ),并连接到现有PBX。

即将到来的新年给我工作的公司带来了(不是)好消息-带有IVR系统和用于Dialogic的4个模拟端口的PCI板的古老服务器死了。 突然变得很清楚,现代系统没有PCI插槽,旧系统对新版本的OS不友好,并且不知道它们将使用多长时间,并且该许可证仅适用于该程序的特定旧版本。
因此,这个想法诞生了,在没有板子的情况下(免费)在具有Asterisk的虚拟机中提高IVR。

总计,我们需要:

  • 已有用户的PBX
  • 虚拟机(在示例中为ubuntu 18.04 lts)。
  • 在任何语音识别服务上注册:wit.ai,google或Yandex
  • 对Linux系统的最低了解
  • 渴望与星号打交道

如果所有点都成功完成-您可以继续。 首先要做的是将星号本身,语音提示进行测试以及nodejs和npm。

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

接下来,我们需要语音识别服务和流程管理器本身来启动它:

 npm install voicer -g npm install pm2 -g 

为Voicer创建文件夹和配置:

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

接下来,我们需要创建一个服务来运行Voicer。 这将是文件/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 

好吧,激活它:

 systemctl daemon-reload systemctl enable voicer systemctl start voicer 

应该注意的是,发声器会将录制的文件存储在/ tmp文件夹中,最好定期清理它。 为此创建一个简单的脚本并将其添加到/etc/cron.daily

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

好吧,现在更困难的部分仍然是-配置星号本身。 由于我们已经有了PBX,并且所有客户端都在使用它,因此不需要大多数配置。 我们从/ etc / asterisk文件夹中删除(或保存在黑暗,凉爽,干燥的地方-如果需要的话)除asterisk.conf,modules.conf和sip.conf之外的所有内容。 然后,使用以下几行添加sip.conf配置,并添加所需的值:

  • fromdomain-带星号的服务器地址
  • 主机-PBX地址
  • fromuser:机密和默认用户: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信号,在第二个版本中是rfc2833。 但是汽车做到了。 同样,与您的PBX交互的有趣功能可能正在等待您-您将必须先找到所需内容,例如,当从IVR向PBX返回呼叫时(保存)来保存呼叫者ID(外部)用户。

还有一个配置文件。 最重要的。 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@_) 

本示例使用问候语,员工姓名和短语“与您联系”。 同时,根据员工的号码来寻找一个提示,如果不是简单地用“与员工一起”来发音的话。 我建议向制片厂订购这样的提示-语音合成系统,a,不是很完美,它们对您公司名称和员工姓名的发音仅适合娱乐。 40XX-公司编号,4001-秘书。

这种情况的特殊之处在于,PBX处理我们的呼叫。 因此,我们不使用通常的Dial命令,而是使用Transfer命令-然后IVR完全离开星号并释放PBX sip通道(它们的号码通常由许可证进行硬编码)后的来电。 在大多数情况下,建议使用“转移”命令的方向名称(main_link),但对于我的PBX,仅直接指示站地址是合适的。

是时候将用户添加到识别系统了。 为此,请转到服务器的地址和端口3100,然后在其中写入名称,姓氏和员工人数。

现在,我们的星号可以接听电话,识别DTMF信号,识别员工姓名并将其重定向到其内部号码。 只是要说服工作站它需要将传入呼叫发送到我们的服务器。 根据制造商的不同,这些设置可以完全不同,但是所需的路径将包含单词ARS和呼叫路由。 但这是一个完全不同的故事。

Source: https://habr.com/ru/post/zh-CN436016/


All Articles