模拟一个简单的智能客服系统
现在我们通过我们的VAD模块来实现一个简单的自动智能客服系统,
假设我们预计可能存在以下若干关键词:
查房
退房
清洁
续住
预订
订房
叫餐
退押金
不能上网
人工服务
我们采用的引擎是科大讯飞的引擎,用于通过FreeSwitch把语音流和科大讯飞的云开放
平台对接起来后,进行TTS、ASR处理后,再进一步由我们来进行更多的处理,但由于是
演示,所以基本是产生一个文本通过
我们的业务处理代码:
/* 名称:智能语音自动处理和应答 开发者:李浩 引擎:科大讯飞 所有权:上海宁卫信息技术有限公司 时间:2017-10-21
*/package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
)
func AsrServer(w http.ResponseWriter, req *http.Request) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
return
}
}()
con, _ := ioutil.ReadAll(req.Body)
if req != nil {
defer req.Body.Close()
}
//fmt.Println(string(con))
var dat map[string]interface{}
fmt.Println("-------------------------------------------------------------------------------------------") fmt.Println(string(con))
err := json.Unmarshal(con, &dat)
if err == nil {
if dat["notify"] != nil && dat["calleeid"] != nil && dat["callerid"] != nil && dat["callid"] != nil {
notify := dat["notify"].(string) //calleeid := dat["calleeid"].(string) //callerid := dat["callerid"].(string) //callid := dat["callid"].(string) errorcode := 0 if dat["errorcode"] != nil { errorcode = int(dat["errorcode"].(float64)) }
message := ""
if dat["message"] != nil {
message = dat["message"].(string) }
prompt := "您好,有什么能帮您的吗?!"
if notify == "enter" {
jsonStr := `{"action":"asr","flowdata":"","params":{"prompt":"欢迎致电上海宁卫,请说测试命令,比如查房,退房,清洁,续住,预订,叫餐,退押金,不能上网,人工服务!","max_waiting_ms":5000,"retry":0,"mode":0}}`
//w.WriteHeader()
w.Write([]byte(jsonStr))
} else if notify == "asr_result" {
if errorcode == 0 {
if message == "" {
prompt = "ASR未识别你说的话,请重新说命令!" } else if strings.Contains(message, "查房") { prompt = "你以为你是警察啊,说查房就查房,要查就从胡聪聪开始!" } else if strings.Contains(message, "退房") { prompt = "能不能不退房,我们可是霸王房!" } else if strings.Contains(message, "清洁") { prompt = "用不着清洁吧,我们的房间很干净,请您自己扫扫!" } else if strings.Contains(message, "续住") { prompt = "我们将免费为您续住365天!" } else if strings.Contains(message, "预订") || strings.Contains(message, "订房") { prompt = "请登录http://www.nway.com.cn进行预计!" } else if strings.Contains(message, "叫餐") { prompt = "您是喜欢吃川菜?鲁菜?淮扬菜?湘菜?粤菜?本帮菜?西餐?" } else if strings.Contains(message, "退押金") { prompt = "押金已退回到您手里,请抽空看看手!" } else if strings.Contains(message, "不能上网") { prompt = "不是有4G吗?上网很容易,流量不用愁!" } else if strings.Contains(message, "人工服务") { prompt = "您是找特殊的还是找酒店服务员?" } else if strings.Contains(message, "挂断") || strings.Contains(message, "挂机") { //prompt = "亲爱的,bye!" jsonStr := `{"action":"hangup","flowdata":"","params":{"cause":0,"usermsg":"caller request"}}` w.Write([]byte(jsonStr)) } } else if errorcode == -1 { prompt = "未检测到声音,请说命令!" } else if errorcode == -2 { prompt = "创建文件失败请联系管理员!" } if prompt != "" { jsonStr := `{"action":"asr","params":{"prompt":"` + prompt + `","max_waiting_ms":5000,"retry":0,"mode":0}}` fmt.Println(jsonStr) w.Write([]byte(jsonStr)) } } } } else { fmt.Println("unmarshal event message error:", err, " &&& message:", string(con)) } }func Start() { http.HandleFunc("/asr", AsrServer) err := http.ListenAndServe(":10086", nil) // http.ListenAndServeTLS(ipport, nway_path.GetCurrentDirectory()+crtfile, nway_path.GetCurrentDirectory()+keyfile, nil) if err != nil { fmt.Println("ListenAndServe: ", err) }
}func main() {
Start()
}