FreeSWITCH及VOIP,Openser,电话机器人等产品中文技术资讯、交流、沟通、培训、咨询、服务一体化网络。QQ群:293697898
现在我们通过我们的VAD模块来实现一个简单的自动智能客服系统,假设我们预计可能存在以下若干关键词:
查房
退房
清洁
续住
预订
订房
叫餐
退押金
不能上网
人工服务
我们采用的引擎是科大讯飞的引擎,用于通过FreeSwitch把语音流和科大讯飞的云开放平台对接起来后,进行TTS、ASR处理后,再进一步由我们来进行更多的处理,但由于是演示,所以基本是产生一个文本通过TTS转给我们。
要测试的话,可以通过注册到我们的云服务器上,注册一个1000-1019共20个账号,密码均为1234,注册截图如下:
我们的业务处理代码:
/*
名称:智能语音自动处理和应答
开发者:李浩
引擎:科大讯飞
所有权:上海宁卫信息技术有限公司
时间:2017-10-21
*/
package mainimport ( "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()
}