博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于MRCP、WEBAPI、SDK等ASR引擎的对话接口统一
阅读量:6338 次
发布时间:2019-06-22

本文共 4171 字,大约阅读时间需要 13 分钟。

  hot3.png

在几个月前,我们发布了《FSGUI"外呼机器人"相关接口-V3》,而现在则是需要把当前主要的ASR产品的对接方式,在FSGUI中统一一下了,否则每个MRCP的对接模式的都要按项目去做了。   首先,和WEBAPI、SDK等需要Nway_Power的支持不一样,MRCP的接口内嵌进了FSGUI中。其配置如下:

Nway.conf:

.

.

.

unimrcp-outbound=127.0.0.1:18083 #fsgui中的mrcp接口监听地址和端口

apiurl= #fsgui在通过ASR引擎识别后获得的文本信息需要送回的回调址

grammar=grammar/test #我们在ASR引擎,采用mrcp方式时所要的grammar

sound_dir=/opt/fsgui/sounds/ #我们的预置录音存放路径

接下来,在FreeSwitch dialplan配置:

<extension name="unimrcp">

</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 //路由idcdrModel.Fee_rate = admin.Org_fee_rate //费率a, err := strconv.Atoi(dataCdr["billsec"].(string))cdrModel.Duration = avar 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.TaskidcdrModel.Intention = rtModel.IntentioncdrModel.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为做实时采集用户人工语音,并识别后送给业务层处理,按用户命令来走一下步

转载于:https://my.oschina.net/nway/blog/1859031

你可能感兴趣的文章
创建符合标准的、有语意的HTML页面——ASP.NET 2.0 CSS Friendly Control Adapters 1.0发布...
查看>>
Adobe驳斥Flash过度耗电论 称HTML5更耗电
查看>>
No!No!No! It's not fashion!
查看>>
艰困之道中学到的经验教训
查看>>
互联网生态建设落地五大挑战——保险科技生态建设 ...
查看>>
进行短视频app开发工作时,可以加入它来保护青少年 ...
查看>>
25G DAC无源高速线缆和25G光模块之间的区别
查看>>
乐乐茶完成近2亿元Pre-A轮融资,祥峰投资领投
查看>>
clickhouse修改时区
查看>>
CSS_定位
查看>>
第二十四章:页面导航(六)
查看>>
百度、长沙加码自动驾驶,湖南阿波罗智行科技公司成立 ...
查看>>
10 个 Linux 中方便的 Bash 别名
查看>>
全新 DOCKER PALS 计划上线,带给您不一样的参会体验! ...
查看>>
Android开发之自定义View(二)
查看>>
python爬虫之微打赏(scrapy版)
查看>>
自制操作系统Antz day08——实现内核 (中) 扩展内核
查看>>
poj-1056-IMMEDIATE DECODABILITY(字典)
查看>>
区块链应用 | 不知道什么时候起,满世界都在谈区块链的事情
查看>>
小程序爆红 专家:对简单APP是巨大打击
查看>>