基于MRCP、WEBAPI、SDK等ASR引擎的對話接口統一
在幾個月前,我們發布了《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配置:
然后把我們以往跑的外呼機器人應用跑起來,那么只要配置的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為做實時采集用戶人工語音,并識別后送給業務層處理,按用戶命令來走一下步