smartivr 为福州晋安区顶顶通软件有限公司开发的软件产品,受中华人民共和国著作权法保护,侵权必究
用户自己实现 httpAPI,机器人程序去调用这个接口,不是 机器人提供httpapi给用户调用。
外呼程序呼叫电话接通后,或者客户主动呼入接通后 机器人程序 向 webserver post 发送
smartivr --> web
```
{
"calleeid": "8888", //被叫号码 对于自动外呼是是流程ID
"callerid": "1500000", //主叫号码 对于自动外呼是被叫号码
"origcallerid": "", //原始主叫 对于自动外呼是主叫号码
"callid": "1fe74812-e376-4319-b335-3de1b494325c", //每个通话的唯一ID
"errorcode": 0, //错误代码
"flowdata": null, //流程数据
"flowid": "abc", //流程ID
"notify": "enter" //通知类型
}
```
webserver根据业务逻辑 返回 json数据 比如 下面的命令就是 启动后台ASR,并且播放一个声音
smartivr <-- web
```
{
"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"开始播放声音文件。
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 //音量标准化放大或者缩小的倍数。
}
```
smartivr <-- web
```
{
"action": "console_playback",
"flowdata": "流程选择",
"params": {
"command": "pause"
}
}
```
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" //整句话的说话时间,包含暂停时间
}
```
smartivr <-- web
```
{
"action": "playback",
"flowdata": "回答",
"params": {
"prompt": "先生你好,请问你最近需要买房吗",
"wait": 3000,
"retry": 2
}
}
```
smartivr --> web
```
{
"calleeid": "8888abc",
"callerid": "abc",
"callid": "35bca774-5b3e-4129-a5e7-1c3c86605071",
"errorcode": 0,
"flowdata": "",
"flowid": "abc",
"message": "FILE PLAYED",
"notify": "playback_result"
}
```
smartivr <-- web
```
{
"action": "playback",
"flowdata": "提示选择流程",
"params": {
"prompt": "请问你要进入哪个测试流程,比如,房产",
"wait": 3000,
"retry": 2
}
}
```
webserver 结束流程,播放一个提示声音,结束通话。
smartivr <-- web
```
{
"action": "playback",
"suspend_asr": true, //播放提示音时候暂停ASR识别
"flowdata": "",
"params": {
"prompt": "谢谢你的使用,再见"
},
"after_action": "hangup",
"after_ignore_error": true,
"after_params": {
"cause": 0,
"usermsg": ""
}
}
```
简单点说asrprogress_notify就是用来控制是否需要打断,asrmessage_notify用来控制是否需要播放一个新的声音。
用户说话超过 pause_play_ms ,就会自动暂停放音,asrprogress_notify通知,ASR识别返回的是空,就是没识别到有效文本的时候,就可以返回 console_playback(resume) 来恢复放音了。
可能不怎么好理解, 就是 start_asr 的 pause_play_ms 参数,可以设置,检测到用户说话时间超过这个参数,就自动停止放音, 如果是噪音的话,asrprogress_notify返回的是无效文本,就可以利用asrprogress_notify来恢复这个给自动暂停的放音。
执行 playback后,播放完成并且等待超时,就会发送playback_result 通知。
start_asr 有一个参数 pause_play_ms,demo是200, 就是检测到说话声音持续时间时间超过pause_play_ms,就自动暂停放音。如果你不需要这个功能设置为0, 如果你启用了这个功能,asrmessage_notify通知每播放一个新的声音就必须要恢复放音console_playback(resume)。否则机器人放音一直暂停着(收不到playback_result通知)。
asrprogress_notify返回 console_playback(pause),或者asrmessage_notify返回播放新的声音,就会停止播放当前的声音。
机器人放音的时候可以识别用户说话,但是不打断机器人放音:playback的allow_interrupt设置-1,关闭自动打断。asrprogress_notify返回 noop。 asrmessage_notif
如果playstate等于false(当前没放音),执行业务逻辑播放新的声音。asrmessage_notif如果playstate等于true(当前在放音,不处理),返回noop,并且把识别结果记录到flowdata,等paly_result的时候再处理识别结果。如果paly_result的时候检测放音过程是否有识别结果,如果有执行业务逻辑处理流程,如果没有返回wait.
放音的时候直接暂停asr, 自然也就不会打断了。playback的block_asr设置为-1.本次放音,禁用了asr,就可以了。
如果要完全避免噪音打断可以把自动打断关闭,使用关键词打断。如果要求不高可以把pause_play_ms设置大些,比如1000。playback新加了一个自动打断控制参数,可以设置本次机器人放音多久才启用自动打断。
2.3版本playback添加了一个参数block_asr,playback的时候把block_asr设置为-1,就可以了。
asrprogress_notify和asrmessage_notify 新加了一个参数 playms,playms意思是用户开始说话时机器人放音时间(如果大于0就是放音时间),0就是机器人没在放音。
asrmessage_notify 的参数 playstate 表示用户说话结束的时候(发送asrmessage的时候)机器人是否在放音。
由此可以推断出 asrmessage_notify 的时候 如果 playms>0并且<2000(自己定义一个合适的),说明机器人刚开始放音用户就开始说话了。
如果 playms等于0,playstate等于true,说明用户刚开始说话,机器人也开始放音了。
wait_result 和 playback_result 新加了1个参数 asrstate为true是表示用户当前已经在说话, 可以返回noop。否则必须返回wait,或者playback.
asrprogress_notify 加了一个参数 gender 0未识别 1女 2男 3可能女 4可能男 其他系统错误
如果有噪音识别授权 start_asr的filter_level 设置为 0.6:一句话结束判断声音是否是噪音。 0.7: 噪音的时候不掉用ASR。 0.8:VAD算法集成噪音和人声识别。 在0.6和0.7时设置asrprogress_notify 参数 noise 0:人声 1:噪音 -1:未启用。
因为用户说话停顿时间超过 min_pause_ms ,就提交ASR识别(如果配置了保存录音会生成一个录音文件),识别结果通过 asrprogress_notify 通知业务程序。
停顿时间超过 max_pause_ms 认为说完一整句话,就发送asrmessage_notify通知给业务程序。
如果说一句话的过程,用户多次停顿,并且时间在 min_pause_ms和max_pause_ms之间,就会产生多个录音文件。
对接暂时界面上,好比我们微信聊天,对方说2句你回复1句是完全正常的情况,网页上展示2个或者多个录音文件就可以。
如果你想尽量的不要出现多次asrprogress_notify,可以把 min_pause_ms 设置大些,比如 min_pause_ms和max_pause_ms都设置800。这时候用户停顿800,才提交ASR,ASR识别的时候如果用户不说话,识别完成马上就发送asrmessage_notify通知,如果识别过程,用户又说话了,还是需要等新的ASR识别结果返回后,在发送asrmessage_notify,就出现多个asrprogress_notify了。
leave新加了一个参数 hangup_disposition recv_bye:对方先挂机, send_bye:机器人先挂机。
bridge就是实现这个功能的,可以把用户电话转接给分机或者客服手机,具体看bridge和bridge_result说明。
流程出现这个问题一般是 playback_result通知asrstate等于false时没播放新的声音,或者asrmessage_notify没匹配关键词,并且playstate等于false的时候没播放新的声音。 playback_result通知asrstate等于false时和asrmessage_notify通知playstate等于false,这2个情况必须播放一个声音或者执行wait, 千万不要返回noop或者console_playback。
3.0版本 asrprogress_notify 的 asrmessage_notify 通知加了一个lag参数,lag为true,就是上一个动作的识别结果。
场景说明,用户先说,哪里,过了1秒再说,哦不需要了。 smartivr先通知 "哪里"的识别结果,流程返回playback,这个声音文件还没开始播放, smartivr又通知 "哦不需要了"的识别结果。 "哦不需要了"的识别结果的lag会为true,流程判断lag就可以处理这样的情况了。
注意:请求和返回都采用JSON格式,编码为utf8,所有参数区分大小写,数字和字符串类型注意区分,参数未说明数字类型就是字符串类型。
{"calleeid":"996","callerid":"linphone","callid":"e56aff85-f8e9-4385-a67b-b7881329860d","notify":"enter"}
{"calleeid":"996","callerid":"linphone","callid":"ceff27c7-fcd9-407c-9f9f-9ddea1a8aa5b","flowdata":"","notify":"leave"}
说话停顿min_pause_ms时间后返回的识别结果。
说话停顿max_pause_ms时间后返回的真句话的识别结果。
message 整句话的识别结果。 格式是 录音序号.识别结果;这样组合多个识别结果。
speakms 整句话的说话时间,包含暂停时间
playms 检测到说话声音起点时播放声音时间,0没放音 ,其他放音时间
playstate 说话结束的时候(发送asrmessage的时候)是否还在放音。
quiescems 如果playstate 为false时会设置这个值(smartivr 5.13开始支持)放音停止时到当前的时间。
playpause 如果playstate为true的时候会这则这个值(smartivr 5.13开始支持)是否暂停了放音(比较自动打断)。
lag 布尔类型 true:本次识别结果是上一个动作的时候产生的具体 看faq lag说明。
获取DTMF返回
{"calleeid":"996","callerid":"linphone","callid":"4e11935d-127f-45d0-b395-9d6aa4d3430d","errorcode":0,"flowdata":""message":"FILE PLAYED","notify":"playback_result"}
转接结束,转接失败,或者转接成功通话结束才收到这个通知。收到这个通知后请挂断通话(返回 hangup),也可以继续执行asr流程。
{"calleeid":"996","callerid":"linphone","callid":"d0a3e9a8-2ce2-42e3-8fa7-55c5eb15326d","errorcode":480,"flowdata":"","hangupcause":"Temporarily Unavailable","message":"NO_USER_RESPONSE","notify":"bridge_result"}
{"calleeid":"8888","callerid":"linphone","callid":"1811135d-fae2-4550-978c-f5dd972a1483","errorcode":0,"flowdata":"","flowid":"","message":"_none_","notify":"transfer_result"}
转移到其他流程完成,注意电话挂断后才会发送 leave
停止后台asr完成
calleeid":"8888","callerid":"linphone","callid":"e757f1c1-c890-4b03-bced-dfdf84fd2419","errorcode":0,"flowdata":"","flowid":"","message":"SUCCEED","notify":"stop_asr_result"}
等待超时
start_asr 是一个异步函数,只需要执行一次,启动后会一直进行VAD和ASR,直到调用sotp_asr
linux /etc/smartivr.json,windows freeswitchconsole.exe同一个目录 ,具体看配置说明
播放一个声音文件
prompt 使用数组方式就可以,比如
```
[
"/var/wav/1.wav",
"tts文字转声音",
"/var/var/2.wav"
]
```
:{"action":"stop_asr","flowdata":"\u8bed\u97f3\u8bc6\u522b"}
停止后台ASR。
用于播放控制,用户说话开始,先暂停播放,如果说的是无效声音,可以恢复播放。
{"action":"bridge","flowdata":"","params":{"number":"sofia\/external\/[email protected]:16080","callerid":"","gateway":"","prompt":"\u6b63\u5728\u8f6c\u63a5\u4e2d\uff0c\u8bf7\u7b49\u5f85","background":"wating.wav"}}
注意 请先执行 stop_asr,不然转接后还会继续进行语音识别
{"action":"hangup","params":{"usermsg":"not found notify"}}
{"action":"noop","params":{"usermsg":""}}
{"action":"deflect","flowdata":"","params":{"number":"1001"}}
{"action":"getdtmf","flowdata":"","params":{"prompt":"","invalid_prompt":"","min":0,"max":128,"tries":1,"timeout":5000,"digit_timeout":3000,"terminators":"#"}}
action":"stop_asr","flowdata":"\u8bed\u97f3\u8bc6\u522b","after_action":"transfer","after_ignore_error":false,"after_params":{"destnumber":"test","dialplan":"XML","context":"default"}}
注意 请先执行 stop_asr,不然还是继续进行语音识别
{"action":"wait","flowdata":"","params":{"timeout":1000}}
(4.3.2以上版本支持,只能enter通知时回复,会对新的接口地址重新发送enter,flowdata如果不为空,会使用返回的flowdata,如果空,使用默认的)
{"action":"redirect","flowdata":"","url":"新接口地址"}
流接口是VAD检测到开始说话就把语音流直接提交到 ASR 进行实时识别,这样识别速度比HTTP接口更实时。流接和http接口asrprogressnotify 、asrmessagenotify 通知参数有些差异,本文档将描述这些差异。
start_asr的asrconfigurefilename参数设置为 stream:127.0.0.1:9988,就可以了,格式是 stream:流识别代理服务器IP:端口。
流接口不支持男女识别,start_asr的volume 参数不会使用。
{“asrtype”:“stream”,“calleeid”:“8888”,“callerid”:“1000”,“callid”:“2df6b327-a8ef-416d-9504-721c5d71ce35”,“duration”:15,“errorcode”:0,“flowdata”:null,“flowid”:“”,“hangup”:false,“message”:“你”,notify":“asrprogress_notify”,“origcallerid”:“1000”,“playms”:0}
{“asrtype”:“stream”,“calleeid”:“8888”,“callerid”:“1000”,“callid”:“2df6b327-a8ef-416d-9504-721c5d71ce35”,“duration”:15,“errorcode”:0,“flowdata”:null,“flowid”:“”,“hangup”:false,“message”:“你好”,notify":“asrprogress_notify”,“origcallerid”:“1000”,“playms”:0}
比http接口 少了以下参数。
asrtextall
asrelapse
errorcode
volumegain
recordms
recordindex
recordfile
gender
noise
{“calleeid”:“8888”,“callerid”:“1000”,“callid”:“2df6b327-a8ef-416d-9504-721c5d71ce35”,“duration”:17,“errorcode”:0,“flowdata”:null,“flowid”:“”,“hangup”:false,“message”:“你好?,“notify”:“asrmessage_notify”,“origcallerid”:“1000”,“playms”:0,“playstate”:false,“recordfile”:”./asr/20190531/1000_2df6b327-a8ef-416d-9504-721c5d71ce35_1.wav",“speakms”:1285}
就是坐席可以监听机器人和客户对话,通过按DTMF*,可以直接接管机器人直接和客户对话。
{“action”:“eavesdrop”,“flowdata”:{“flowtype”:“default”},“params”:{“dialstring”:“user/1001”,“callerid”:“8888”},“after_action”:“playback”,“after_ignore_error”:true,“after_params”:{“prompt”:“开始呼叫分机实施监听,机器人流程可以继续执行”}}
action:eavesdrop,params.dialstring:这个是一个拨号串,分机例子:user/1000,外线例子:sofia/external/电话号码@vosip
系统会呼叫这个电话,电话接通后,就处于监听模式,听到机器人和用户对话。
是否已经开始监听成功,没有事件通知,如果需要知道是否监听成功,请使用sip.js,sipml5,或者sip客户端,接到电话去反馈结果。
如果需要分机接通后自动接管eavesdrop动作添加一个参数 “skip_eavesdrop”:true (smartivr 4.8.5 开始支持)
如果需要分机接通后,等待机器人当前放音完成时自动接管eavesdrop动作添加一个参数 “auto_bridge”:1或者2,模式1:放音暂停时就自动接管,模式2:放音完成时才自动接管。(smartivr 5.1.2 开始支持),如果设置了skip_eavesdrop,这个参数会给忽略。
人工接通后对人工端也开启实时质检 (smartivr 5.13版本开始支持) 添加了一个参数 asrparam:{“notify_url”:“http://ip/asrnotify”,其他参看start_asr动作文档},可以把坐席端ASR识别结果通知到URL。用户端ASR继续通过samrtivr接口通知,返回noop就可以。
在监听模式,按DTMF *,就进入接管模式。
{“calleeid”:“8888”,“callerid”:“1000”,“callid”:“f01c16f1-0096-490e-80fa-7d32812580b6”,“duration”:56,“errorcode”:0,“flowdata”:{“flowtype”:“default”},“flowid”:“”,“hangup”:false,“lag”:false,“notify”:“bridge_notify”,“origcallerid”:“1000”}
进入接管模式 ,会发送"notify":"bridge_notify"通知,直接返回 action:noop就可以了。这时停止了ASR识别和机器人放音,直到电话挂断,发送 action:levea, 注意进入接管模式不能返回机器人对话的。
文章浏览阅读1.1k次。一、选择题1. 串行接口是指( )。A. 接口与系统总线之间串行传送,接口与I/0设备之间串行传送B. 接口与系统总线之间串行传送,接口与1/0设备之间并行传送C. 接口与系统总线之间并行传送,接口与I/0设备之间串行传送D. 接口与系统总线之间并行传送,接口与I/0设备之间并行传送【答案】C2. 最容易造成很多小碎片的可变分区分配算法是( )。A. 首次适应算法B. 最佳适应算法..._874 计算机科学专业基础综合题型
文章浏览阅读9.7k次,点赞5次,收藏15次。连接xshell失败,报错如下图,怎么解决呢。1、通过ps -e|grep ssh命令判断是否安装ssh服务2、如果只有客户端安装了,服务器没有安装,则需要安装ssh服务器,命令:apt-get install openssh-server3、安装成功之后,启动ssh服务,命令:/etc/init.d/ssh start4、通过ps -e|grep ssh命令再次判断是否正确启动..._could not connect to '192.168.17.128' (port 22): connection failed.
文章浏览阅读209次。00000000_杰理 空白芯片 烧入key文件
文章浏览阅读475次。2023年初,“ChatGPT”一词在社交媒体上引起了热议,人们纷纷探讨它的本质和对社会的影响。就连央视新闻也对此进行了报道。作为新传专业的前沿人士,我们当然不能忽视这一热点。本文将全面解析ChatGPT,打开“技术黑箱”,探讨它对新闻与传播领域的影响。_引发对chatgpt兴趣的表述
文章浏览阅读259次。用Python数据分析方法进行汉字声调频率统计分析木合塔尔·沙地克;布合力齐姑丽·瓦斯力【期刊名称】《电脑知识与技术》【年(卷),期】2017(013)035【摘要】该文首先用Python程序,自动获取基本汉字字符集中的所有汉字,然后用汉字拼音转换工具pypinyin把所有汉字转换成拼音,最后根据所有汉字的拼音声调,统计并可视化拼音声调的占比.【总页数】2页(13-14)【关键词】数据分析;数据可..._汉字声调频率统计
文章浏览阅读64次。最近在做一个android系统移植的项目,所使用的开发板com1是调试串口,就是说会有uboot和kernel的调试信息打印在com1上(ttySAC0)。因为后期要使用ttySAC0作为上层应用通信串口,所以要把所有的调试信息都给去掉。参考网上的几篇文章,自己做了如下修改,终于把调试信息重定向到ttySAC1上了,在这做下记录。参考文章有:http://blog.csdn.net/longt..._嵌入式rootfs 输出重定向到/dev/console
文章浏览阅读1.2k次,点赞4次,收藏12次。1,先去iconfont登录,然后选择图标加入购物车 2,点击又上角车车添加进入项目我的项目中就会出现选择的图标 3,点击下载至本地,然后解压文件夹,然后切换到uniapp打开终端运行注:要保证自己电脑有安装node(没有安装node可以去官网下载Node.js 中文网)npm i -g iconfont-tools(mac用户失败的话在前面加个sudo,password就是自己的开机密码吧)4,终端切换到上面解压的文件夹里面,运行iconfont-tools 这些可以默认也可以自己命名(我是自己命名的_uniapp symbol图标
文章浏览阅读1.2w次,点赞25次,收藏192次。char*和char[]都是指针,指向第一个字符所在的地址,但char*是常量的指针,char[]是指针的常量_c++ char*
文章浏览阅读930次。代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大、灵活的编辑器,相信你和我一样,都不会例外。我用过的编辑器不少,真不少~ 但却没有哪款让我特别心仪的,直到我遇到了 Sublime Text 2 !如果说“神器”是我能给予一款软件最高的评价,那么我很乐意为它封上这么一个称号。它小巧绿色且速度非
文章浏览阅读4.1k次。一、选择法这是每一个数出来跟后面所有的进行比较。2.冒泡排序法,是两个相邻的进行对比。_对十个数进行大小排序java
文章浏览阅读2.9k次。物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)其实作者本意是使用4G模块来实现与阿里云物联网平台的连接过程,但是由于自己用的4G模块自身的限制,使得阿里云连接总是无法建立,已经联系客服返厂检修了,于是我在此使用网络调试助手来演示如何与阿里云物联网平台建立连接。一.准备工作1.MQTT协议说明文档(3.1.1版本)2.网络调试助手(可使用域名与服务器建立连接)PS:与阿里云建立连解释,最好使用域名来完成连接过程,而不是使用IP号。这里我跟阿里云的售后工程师咨询过,表示对应_网络调试助手连接阿里云连不上
文章浏览阅读544次,点赞5次,收藏6次。运算符与表达式任何高级程序设计语言中,表达式都是最基本的组成部分,可以说C++中的大部分语句都是由表达式构成的。_无c语言基础c++期末速成