现在人工智能很流行,特别是应用于电话营销的电话机器人。好了废话少说直接上源码: 随着人工智能的普及,AI已经渗透到各行各业,本文就为大家介绍了利用最前沿的AI技术实现电话机器人的原理。智能电话机器人就是充分的利用了人工智能语音识别技术和大数据的精准分析定位,完全是对传统模式是一次颠覆性的变化,是智能化的人海战术还是时代化的“人工+智能语音”的一种方式,智能电话机器人是企业的福音!帮企业降低成本,提高工作效率,提升公司业绩!
电话机器人比人工坐席厉害的是,电话号码直接在后台一键导入,省时又省力,自动拨打。智能轮流对话,根据系统设定可以对客户进行筛选统计,依据客户的回答智能分类意向程度,把意向最高的甲类客户交给人工进行着重跟进,这样就能使整个电销过程的工作效率大大提高。
作为“人工智能”的产物,正在逐渐的给电销行业带来大改变大革命,把繁琐、枯燥、耗时的工作交给智能电话机器人完成,后台分类管理,加以精英销售跟进,不仅大大提高工作效率,而且能更好的把人力资源进行再分配再分组,减少企业运营成本!应该是每位老板都在想的问题。
对于电销公司来讲如何精准地识别真实客户一直是很难攻克的难点所在。对于智能电话机器人来说,可以通过真人语音式专家级的沟通,模拟电销人员和客户进行多轮互动的有效沟通,通过用户画像和大数据模型精准找到用户,实现精准营销,并快速完成ABCD类意向客户的筛选和分类。
智能电话机器人是将网络电话、语音知识、自然语音理解、多轮对话、知识图谱等多个门类的前沿技术集成在一个智能产品中,已经成为行业的领头羊,为外呼行业带来了可喜的变化,短短几个月被很多企业证明,这是真正实现开源节流的AI好项目了。
智能电话机器人作为当今的一款智能化产品,在实际应用中能准确的以人类的声音、思维和语气智能应对客户提出的各种问题。同时,它的筛选能力也极强,可以把应答用户按意向程度自动分类,帮助人工坐席快速剥离意向客户。
员工坐席每天拨打200个-300个电话已经算是极限了,但是智能电话机器人每天可以拨打800-1200通有效电话,让效率提高几倍,提高效率就意味着业绩的提高。
什么是电话机器人
通过ASR(语音识别)和TTS(文本转语音)模拟真人和用户的通话,可用于企业总机,自动催缴,外呼营销,问卷调查等业务,同时支持 百度,科大,阿里云等ASR系统,可以真人预先录音,用户是完全察觉不到是机器人。
AI智能电话机器人源码搭建揭秘!
如何开发一个电话机器人
FreeSWITCH/Asterisk是一个软交换系统,可以利用开源的软交换系统,开发一个VAD录音模块,用户说话后开始录音,停止说话后,把录音提交到语音识别接口转换成文本,利用语义解析接口(NPL)或者简单的关键字匹配,返回系统预先设计的话术,通过TTS转换成声音(也可以真人预先录音)播放给用户听。实现人机语音对话。
技术难点
·机器人说话时,用户开始说话,机器人要及时处理,就是所谓的打断,这个通过VAD算法和关键词打断可以解决。
·机器人怎么理解用户说话含义,这个是目前难点,目前主要的做法,还是通过关键词匹配来设计话术。
支持那些ASR接口
可以支持科大讯飞,百度语音识别,阿里云语音识别,腾讯语音识别,捷通华声灵云等SDK/API/MRCP接口。
怎么使用
可以和现有的呼叫中心,IPPBX,FreeSWITCH,Asterisk 等系统通过SIP分机和SIP中继方式对接。
smart ivr 接口说明
smartivr 是一个基于Freeswitch的电话机器人二次开发接口(restful),支持和Asterisk对接
使用指南
用户自己实现 httpAPI,机器人程序去调用这个接口,不是 机器人提供httpapi给用户调用。
1.
外呼程序呼叫电话接通后,或者客户主动呼入接通后 机器人程序 向 webserver post 发送
2.
smartivr –> web
3.
‘calleeid’: ‘8888abc’, //被叫号码
‘callerid’: ‘abc’, //主叫号码
‘callid’: ‘1fe74812-e376-4319-b335-3de1b494325c’, //每个通话的唯一ID
‘errorcode’: 0, //错误代码
‘flowdata’: null, //流程数据
‘flowid’: ‘abc’, //流程ID
‘notify’: ‘enter’ //通知类型
4.
webserver根据业务逻辑 返回 json数据 比如 下面的命令就是 启动后台ASR,并且播放一个声音
5.
smartivr <– web
6.
‘action’: ‘start_asr’, //第一个动作 start_asr是一个异步函数,只需要执行一次,启动后会一直进行VAD和ASR,直到调用sotp_asr
‘flowdata’: ‘流程选择’, //流程数据,类似浏览器的Cookie,机器人后续httpapi请求会把这个数据发送回来。
‘params’: {
‘min_speak_ms’: 100, //最小说话时间,默认值100,单位毫秒,说话时间小于这个值,会被认为是无效声音。
‘max_speak_ms’: 10000, //最大说话时间,默认值10000,单位毫秒,说话时间超过这个值,就停止录音,直接提交ASR服务器识别。
‘min_pause_ms’: 300, //最小停顿时间,默认值300,单位毫秒,默认值用户停顿时间超过这个值,会提交到ASR识别。识别完成后发送asrprogress事件。 完成后的意思是 ASR服务器可能 300-800ms才返回识别接口。
‘max_pause_ms’: 600, //最大停顿时间,默认值600,单位毫秒,用户停顿时间超过这个值,认为一句话说完,所有识别完成后发送asrmessage事件。所有识别完成后的意思是,所有提交到asr服务器的识别结果都返回了。 注意 min_pause_ms 必须大于min_pause_ms。
‘pause_play_ms’: 200, //触发暂停放音时间,默认值0:就是禁用自动暂停,单位毫秒,建议设置200-1000,用户说话时间超过这个值,就暂停放音。 有时候用户一直持续说话,中间没停顿,所以还没提交到ASR服务器识别,不能使用关键词打断,可以先暂停放音。
‘threshold’: 0, //VAD阈值,默认0,建议不要设置,如果一定要设置,建议 2000以下的值。
‘recordpath’: ‘’, //录音文件路径,如果不设置:就会使用配置文件中的路径,每天生成一个文件夹,如果设置了,就会使用这个参数中的目录,文件格式是 recordpath/被叫号码_Unique-ID_序号.wav
‘volume’: 50 //音量标准化的值。0-100,0不使用音量标准化,其他值 音量把录音音量调整到这个值后,再提交ASR识别。
},
‘after_action’: ‘playback’,
‘after_ignore_error’: false, //如果action动作(start_asr)执行失败是否继续执行after_action(playback)。
‘after_params’: {
‘prompt’: ‘您好,欢迎致***,这里是电话机器人演示系统,请说要进入的测试流程,比如,房产!’, //可以直接播放声音文件。规则就是如果最后4个字是.wav,就直接播放wav文件。
‘wait’: 5000, //单位毫秒,放音结束后等待时间。用于等待用户说话。
‘retry’: 0 //重播次数。就是wait时间内用户不说话,就重新播放声音。
机器人程序执行 “action”:”start_asr” 开始后台ASR识别,然后执行”after_action”: “playback”开始播放声音文件。
7.
·当用户说话后,机器人发送 识别进度,也就是用户暂停说话时间超过 min_pause_ms
smartivr –> web
‘asrelapse’: 391, //asr识别服务器消耗的时间,单位毫秒。
‘asrtextall’: ‘1.识别结果;’, //包含之前停顿的识别结果的组合。 格式是 录音序号.识别结果;这样组合多个识别结果。
‘asrtype’: ‘aiui’, //本次使用那个asr识别
‘calleeid’: ‘8888abc’,
‘callerid’: ‘abc’,
‘callid’: ‘1aec14af-d6a8-49e4-96fc-fb5f7cfdb893’,
‘errorcode’: 0, //asr返回错误,0无错误。
‘flowdata’: ‘流程选择’,
‘flowid’: ‘abc’,
‘message’: ‘识别结果’,
‘notify’: ‘asrprogress_notify’,
‘recordindex’: ‘1’, //录音序号
‘recordfile’: ‘’, //录音文件
‘recordms’: 931, //录音时间,单位毫秒。
‘volumegain’: 5.95330699999 //音量标准化放大或者缩小的倍数。
webserver根据业务逻辑返回是否需要暂停放音
smartivr <– web
‘action’: ‘console_playback’,
‘flowdata’: ‘流程选择’,
‘params’: {
‘command’: ‘pause’
当用户说完一整句话,机器人发送 完整的识别结果,也就是用户暂停说话时间超过 max_pause_ms
smartivr –> web
‘calleeid’: ‘8888abc’,
‘callerid’: ‘abc’,
‘callid’: ‘ea6d1235-aaab-4251-b03b-3b53ca32e00d’,
‘errorcode’: 0,
‘flowdata’: ‘流程选择’,
‘flowid’: ‘abc’,
‘message’: ‘1.你好;2.什么事;’,
‘notify’: ‘asrmessage_notify’,
‘speakms’: ‘1162’ //整句话的说话时间,包含暂停时间
webserver根据业务流程,执行话说逻辑,播放声音。
smartivr <– web
‘action’: ‘playback’,r> ‘flowdata’: ‘回答’,
‘params’: {
‘prompt’: ‘先生你好,请问你最近需要买房吗’,
‘wait’: 3000,
‘retry’: 2
·当用户一直不说话,声音播放完成并且等待时间超过,机器人发送 playback_result
smartivr –> web
‘calleeid’: ‘8888abc’,
‘callerid’: ‘abc’,
‘callid’: ‘35bca774-5b3e-4129-a5e7-1c3c86605071’,
‘errorcode’: 0,
‘flowdata’: ‘’,
‘flowid’: ‘abc’,
‘message’: ‘FILE PLAYED’,
‘notify’: ‘playback_result’
webserver根据业务流程发送 继续放音,提示用户回答问题。
smartivr <– web
‘action’: ‘playback’,
‘flowdata’: ‘提示选择流程’,
‘params’: {
‘prompt’: ‘请问你要进入哪个测试流程,比如,房产’,
‘wait’: 3000,
‘retry’: 2
playback_result 什么时候有这个通知
执行 playback后,播放完成并且等待超时,就会发送playback_result 通知。
·如果识别到用户说话,在 asrmessage_notify 事件中返回命令playback,播放了一个新的声音,那么上个playback会给强制终止(上次的playback_result就不会发送了。),新的播放完成时,才会发送playback_result。
·如果识别到用户说话,在 asrmessage_notify 事件中返回命令noop,或者console_playback(resume),没去播放新的声音,那么还会发送playback_result 通知的。
·。
接口说明
注意:请求和返回都采用JSON格式,编码为utf8,所有参数区分大小写,数字和字符串类型注意区分,参数未说明数字类型就是字符串类型。
自动放音暂停(打断)
start_asr 有一个参数 pause_play_ms,demo是200, 就是检测到声音持续时间时间超过pause_play_ms,就自动暂停放音。如果你不需要这个功能设置为0, 如果你启用了这个功能,asrmessage_notify通知你没播放一个新的声音就必须要恢复放音console_playback(resume)。否则会一直暂停。
怎么实现关键词打断
·asrprogress_notify 的识别结果如果是关键词 返回 console_playback(pause),如果不是关键词 返回 console_playback(resume)
·asrmessage_notify 的整句话识别结果如果匹配,直接播放新的声音文件,执行新的业务流程,如果不匹配,返回console_playback(resume)。
playback_result 收到这个通知,说明声音播放完成,等待用户说话超时,必须播放一个声音,提示用户说话
action 描述
start_asr
start_asr 是一个异步函数,只需要执行一次,启动后会一直进行VAD和ASR,直到调用sotp_asr
·min_speak_ms 最小说话时间,默认值100,单位毫秒,说话时间小于这个值,会被认为是无效声音。
·max_speak_ms 最大说话时间,默认值10000,单位毫秒,说话时间超过这个值,就停止录音,直接提交ASR服务器识别。
·min_pause_ms 最小停顿时间,默认值300,单位毫秒,默认值用户停顿时间超过这个值,会提交到ASR识别。识别完成后发送asrprogress事件。 完成后的意思是 ASR服务器可能 300-800ms才返回识别接口。
·max_pause_ms 最大停顿时间,默认值600,单位毫秒,用户停顿时间超过这个值,认为一句话说完,所有识别完成后发送asrmessage事件。所有识别完成后的意思是,所有提交到asr服务器的识别结果都返回了。 注意 min_pause_ms 必须大于min_pause_ms。
·pause_play_ms 触发暂停放音时间,默认值0,就是禁用自动暂停,单位毫秒,建议设置200-1000,用户说话时间超过这个值,就暂停放音。 有时候用户一直持续说话,中间没停顿,所以还没提交到ASR服务器识别,不能使用关键词打断,可以先暂停放音。
·threshold VAD阈值,默认0,建议不要设置,如果一定要设置,建议 2000以下的值。
·recordpath 录音文件路径,如果不设置(使用配置文件设置录音目录(smartivr.json),),如果设置了会保存录音文件到这个目录,文件格式是 recordpath/被叫号码Unique-ID序号.wav
·volume 音量标准化的值。0-100,0不使用音量标准化,其他值 音量把录音音量调整到这个值后,再提交ASR识别。
start_asr使用的配置文件
linux /etc/smartivr.json,windows freeswitchconsole.exe同一个目录
‘asr’: {
‘aiui’: {
‘key1’: {
‘appid’: ‘5a519267’,
‘appkey’: ‘e212fc8e4c9747a39fa1c56940e705be’
},
‘key2’: {
‘appid’: ‘5a519267’,
‘appkey’: ‘e212fc8e4c9747a39fa1c56940e705be’
·}
aiui 是科大讯飞webapi接口的KEY,可以配置多个。
record.path 是录音路径。
playback
播放一个声音文件
·prompt 声音内容wav文件(只支持8000hz,16位,单声道)或者文本。prompt 提示文本(如果最后4个字是.wav,就是录音文件放音,否则会调用TTS生成声音文件)。同样的文字TTS只转换一次,后续会使用缓存的文件
·wait 单位毫秒,放音结束后等待时间。用于等待用户说话。
·retry 重播次数。就是wait时间内用户不说话,就重新播放声音。
多文件或者TTS和录音文件混合放音
prompt 使用数值方式就可以,比如
‘/var/wav/1.wav’,
‘tts文字转声音’,
‘/var/var/2.wav’
sotp_asr
停止后台ASR。
console_playback
用于播放控制,用户说话开始,先暂停播放,如果说的是无效声音,可以恢复播放。
·command
·pause 暂停播放
·resume 恢复播放
·stop 停止播放
bridge 转接电话
{‘action’:‘bridge’,‘flowdata’:’’,‘params’:{‘number’:‘sofia/external/a8008@sip.ddrj.com:16080’,‘callerid’:’’,‘gateway’:’’,‘prompt’:’\u6b63\u5728\u8f6c\u63a5\u4e2d\uff0c\u8bf7\u7b49\u5f85’,‘background’:‘wating.wav’}}
number 被叫号码,如果gateway没设置,必须是完整呼叫串类似:sofia/external/电话号码@网关Ip
callerid 可选参数 主叫号码(对方看到的来电显示)
gateway 可选参数 网关名字
background 可选参数 背景音乐
prompt 可选参数 提示文本prompt 提示文本(如果最后4个字是.wav,就是录音文件放音,否则会调用TTS生成声音文件)。
hangup 挂机
{‘action’:‘hangup’,‘params’:{‘usermsg’:‘not found notify’}}
cause [数字] 可选参数 挂断原因根据sip信令设置 详细看https://freeswitch.org/confluence/display/FREESWITCH/Hangup+Cause+Code+Table
usermsg 可选参数 里面可以放置调试信息,smartivr会打印到日志文件。
noop 不需要执行任何动作时可以返回这个,比如(leave,asr_progress 通知可以返回noop)
{‘action’:‘noop’,‘params’:{‘usermsg’:’’}}
*usermsg 可选参数 里面可以放置调试信息,smartivr会打印到日志文件。
deflect 执行后会直接离开流程,收到 leave 通知
{‘action’:‘deflect’,‘flowdata’:’’,‘params’:{‘number’:‘1001’}}
number 要转移的目的地(由呼叫方处理) 即: SIP REFER 的 URI。
getdtmf 接收用户按键
{‘action’:‘getdtmf’,‘flowdata’:’’,‘params’:{‘prompt’:’’,‘invalid_prompt’:’’,‘min’:0,‘max’:128,‘tries’:1,‘timeout’:5000,‘digit_timeout’:3000,‘terminators’:’#’}}
min [数字] 最少按键个数(minimum value of 0)
max [数字] 最多按键个数(maximum value of 128)
tries [数字] 提示音播放次数
timeout [数字] 等待按键最大时间,声音播放结束开始算起。
terminators 结束输入按键,默认是#。
prompt 提示音
invalid_prompt 输入错误提示音
regexp 输入按键规则(正则表达式)
digit_timeout [数字] 按键超时时间,如果超时没有新按键,就认为输入完成
欢迎各类朋友一起探讨交流,如需成熟源码二次开发也可联系。