基于MRCP、WEBAPI、SDK等ASR引擎的对话接口统一
2018-07-18 19:52
501 查看
在几个月前,我们发布了《FSGUI"外呼机器人"相关接口-V3》,而现在则是需要把当前主要的ASR产品的对接方式,在FSGUI中统一一下了,否则每个MRCP的对接模式的都要按项目去做了。 首先,和WEBAPI、SDK等需要Nway_Power的支持不一样,MRCP的接口内嵌进了FSGUI中。其配置如下:
Nway.conf:
.
.
.
unimrcp-outbound=127.0.0.1:18083 #fsgui中的mrcp接口监听地址和端口
apiurl=http://127.0.0.1:10089/asr #fsgui在通过ASR引擎识别后获得的文本信息需要送回的回调址
grammar=grammar/test #我们在ASR引擎,采用mrcp方式时所要的grammar
sound_dir=/opt/fsgui/sounds/ #我们的预置录音存放路径
接下来,在FreeSwitch dialplan配置:
<extension name="unimrcp">
<condition field="destination_number" expression="^777777$"> <action application="answer"/> <action application="socket" data="127.0.0.1:18083 async full"/> </condition>
</extension>
然后把我们以往跑的外呼机器人应用跑起来,那么只要配置的apiurl是正确的,那么就可以看到一条条的识别结果等送过来了
这样,我们的预期的完全在内网中的智能客服系统就可以更方便的跑起来了,而不象以前不断的以项目形式做这块应用。
增强一下接口的代码
1 需要实现的三个接口
1.1 cdr接口,event接口,人机处理接口
1.2 cdr接口用于接收通话清单
1.2.1 示例代码
func cdr(w http.ResponseWriter, req *http.Request) {
con, _ := ioutil.ReadAll(req.Body) if req != nil { defer req.Body.Close() } var dat map[string]interface{} err := json.Unmarshal(con, &dat) if err != nil { logs.Error(err) return } var dataCdr map[string]interface{} data, err := json.Marshal(dat["callerCdr"]) if err != nil { logs.Error(err) return } json.Unmarshal(data, &dataCdr) var cdr = ai_db.DBCdr{} var cdrModel = ai_db.AiCdr{} var runTime = ai_db.DBRunTime{} var rtModel = ai_db.RunTimeModel{} rtModel, err = runTime.RunTimeListByCallId(dataCdr["sessionid"].(string)) admin, err := cdr.QueryUserInfoByOwenr(rtModel.Tpl_id) cdrModel.Account_id = admin.Id //"用户id" cdrModel.Callee = dataCdr["dst"].(string) //主叫 cdrModel.Caller = dataCdr["calleridnum"].(string) //被叫 cdrModel.Start_time = dataCdr["calldate"].(string) cdrModel.End_time = dataCdr["endtime"].(string) cdrModel.Route_id = rtModel.Gateway_id //路由id cdrModel.Fee_rate = admin.Org_fee_rate //费率 a, err := strconv.Atoi(dataCdr["billsec"].(string)) cdrModel.Duration = a var duration = a / 60 //计算 计费金额 if a%60 > 0 { duration += 1 //计费金额,如果不是整数 + 1 } cdrModel.Bill_balance = cdrModel.Fee_rate * float32(duration) conf := goini.SetConfig("./config.ini") cdrModel.Record_base = conf.GetValue("path", "basePath") //基本路径 cdrModel.Record_path = dat["recordurl"].(string) cdrModel.Task_id = rtModel.Taskid cdrModel.Intention = rtModel.Intention cdrModel.Call_id = dataCdr["sessionid"].(string) err = cdr.InsertCdr(cdrModel) if err != nil { logs.Error(err) //return } fmt.Println(dataCdr["sessionid"].(string)) err = runTime.DeleteRunTimeByCall(dataCdr["sessionid"].(string)) if err != nil { logs.Error(err) return }
}
1.3 event接口用于推送通话过程中产生的各类事件
1.3.1 event处理示例
func event(w http.ResponseWriter, req *http.Request) {
con, _ := ioutil.ReadAll(req.Body)
if req != nil {
defer req.Body.Close()
}
var data map[string]interface{} err := json.Unmarshal(con, &data) if err != nil { fmt.Println(err) } var runtime = ai_db.DBRunTime{} model, err := runtime.RunTimeListByCallId(data["sessionid"].(string)) if err != nil { logs.Error(err) return } if data["status"] == "caller-start" { model.Call_state = 1 } else if data["status"] == "caller-ringing" { model.Call_state = 1 } else if data["status"] == "caller-answered" { model.Call_state = 2 } else if data["status"] == "caller-hangup" { model.Call_state = 3 } //根据 phone 找到对应的号码组 ,根据任务id找到对应的号码组, 根据对应的号码组和phone互相匹配的进行修改 //修改 Has_called 为已呼出状态 var dbnumber = ai_db.DBNumber{} err = dbnumber.UpdateNumberByGroupId(model.Call_state, model.Number_map_id) if err != nil { logs.Error(err) return } err = runtime.UpdateRunTimeByCall(model) if err != nil { logs.Error(err) }
}
1.4 人机处理接口用于进行ASR、TTS、通信、放音等等
1.4.1.1 notify定义
enter :表明有电话刚进入,则我们需要进行开场白了,呼入的为:您好,有什么能帮您? 呼出的为:您好,我是xx公司,做xx的! asr_result:是由nway_power通过采集数据后送给识别引擎后识别结果送过来了 vad_short_sentence_file:在mode为2时,进行放音时采集, 用于更精准的打断功能
1.4.2 action定义
asr:用于播放tts合成语音或放a.wav等预录制的语音 hangup:用于放音后挂机 bridge:转到某个座席,可为内线也可为外线 stop_asr:用于在播放一个长语音时,由于识别引擎识别到人工部分说语音而中止当前的流程
1.4.3 params定义
prompt:用于将交互时的要合成的tts或预录的语音文件传给系统, 用.wav文件直接则播放和sounddir为主路径下的该预录制文件, 如果是不带.wav则先tts合成再播放,如果是file_string: 则顺序播放以”,”分隔的多个.wav录音文件 cause:用于标明挂机原因 usermsg:用户定义参数 number:用于标明要呼转的号码 callerid:用于标明呼出的号码,即外显号码 gateway:用于标明是通过哪个网关呼出,如果为空,则是呼转给内线号码 max_waiting_ms:最长等待时长 retry:尝试次数 mode:0为只要有响动就打断,1为不打断一直到放音结束, 2为做实时采集用户人工语音,并识别后送给业务层处理,按用户命令来走一下步
相关文章推荐
- WebApi统一输出接口
- ASP.NET WEBAPI实现微信JS-SDK接口注入权限验证配置
- 【再上层楼】CooCox优化了CoX——基于ARM Cortex-M处理器的设备驱动统一接口
- 基于Node.js的微信JS-SDK后端接口实现
- EvaOAuth : 基于php/ZF2支持OAuth1.0与OAuth2.0的第三方Oauth登录统一接口模块
- 详解基于Node.js的微信JS-SDK后端接口实现代码
- 基于统一插件接口的WEB程序设计
- 基于senparc实现的微信AccessToken接口全局统一获取
- 论ASR服务商提供的SDK、HTTP、MRCP服务
- 基于统一插件接口的WEB程序设计
- 最新版本的ppsip v3 SDK(采用全新的架构,并添加了视频支持,音视频引擎使用GIPS(基于WebRTC))发布了(联系dotphoenix@qq.com)。
- 基于统一插件接口的WEB程序设计[中]
- 基于cocos2dx3.1引擎C++编写的android平台串口通信接口
- 基于统一插件接口的WEB程序设计[下]
- [JAVA]基于微信公众平台开放接口编写的sdk
- Cocos2d-x游戏引擎开发[2]----工厂方法,统一接口 (以helloworld类为基础)
- rasa_core:基于机器学习的对话引擎
- rasa_core:基于机器学习的对话引擎
- 基于SDK的支付接口服务端——支付宝,微信
- 基于新浪微博API Oauth2.0 javaSDK开发的WebAPI微博管家