diff --git a/service/speechNlu/constant.go b/service/speechNlu/constant.go index ec0526f54de6382b9609a8cfae333c69eb12cf3a..5c015e07fc358986d17da586237672c61fa36abc 100644 --- a/service/speechNlu/constant.go +++ b/service/speechNlu/constant.go @@ -91,11 +91,11 @@ const ( //SLEEPMUSIC = "声音博物馆" RELATION = "亲戚关系计算" WASTESORTING = "垃圾分类" + FOOD = "食物营养查询" SOUND = "sound" ALMANAC = "almanac" - FOOD = "food" GENERALQA = "general_question_answering" COMMONQA = "common_qa" diff --git a/service/speechNlu/new.go b/service/speechNlu/new.go new file mode 100644 index 0000000000000000000000000000000000000000..0643e5363d598da9b66548c6ddbc749cf8172219 --- /dev/null +++ b/service/speechNlu/new.go @@ -0,0 +1,141 @@ +package speechNlu + +//type WebSocketSession struct { +// Conn *websocket.Conn +// SessionID string +// RequestChan chan []byte // 发送请求的通道 +// ResponseChan chan model.SpeechWsResp // 接收响应的通道 +// ErrorChan chan error // 错误通知通道 +// CloseChan chan struct{} // 主动关闭信号 +// IsAlive bool // 连接状态标记 +//} +// +//func SpeechWs(ip, deviceId string) (*websocket.Conn, error) { +// SpeechWs_Url := global.SpeechSetting.Url +// SpeechWs_ProductId := global.SpeechSetting.ProductId +// SpeechWs_ApiKey := global.SpeechSetting.ApiKey +// +// //st := time.Now() +// dialer := websocket.Dialer{ +// HandshakeTimeout: 30 * time.Second, +// } +// +// header := http.Header{} +// header.Set("X-Forwarded-For", ip) +// +// SpeechUrl := SpeechWs_Url + "?serviceType=websocket&productId=" + SpeechWs_ProductId + +// "&apikey=" + SpeechWs_ApiKey + "&deviceId=" + deviceId +// fmt.Println(SpeechUrl) +// +// conn, resp, err := dialer.Dial(SpeechUrl, header) +// if err != nil { +// global.Logger.WithFields(logger.Fields{ +// "url": SpeechUrl, +// "resp": readResp(resp), +// }).Errorf("[SpeechWs] Connect error : %v", err.Error()) +// return nil, err +// } +// return conn, nil +//} +// +//func SpeechNlpWsReq1(data *model.SemanticReq, session *WebSocketSession) *SpeechWsData { +// req := &SpeechWsData{ +// Topic: "nlu.input.text", +// RecordId: data.RequestId, +// SessionId: session.SessionID, // 直接从会话中获取 SessionID +// RefText: data.Query, +// } +// global.Logger.WithFields(logger.Fields{ +// "req": req, +// "sessionId": session.SessionID, +// }).Info("构造 NLU 请求") +// return req +//} +// +//func NewWebSocketSession(ip, deviceID string) (*WebSocketSession, error) { +// // 建立 WebSocket 连接 +// conn, err := SpeechWs(ip, deviceID) +// if err != nil { +// return nil, err +// } +// +// session := &WebSocketSession{ +// Conn: conn, +// RequestChan: make(chan []byte, 10), +// ResponseChan: make(chan model.SpeechWsResp, 10), +// ErrorChan: make(chan error), +// CloseChan: make(chan struct{}), +// IsAlive: true, +// } +// +// // 启动读写协程 +// go session.readLoop() +// go session.writeLoop() +// +// return session, nil +//} +// +//func (s *WebSocketSession) readLoop() { +// defer s.cleanup() +// +// for { +// select { +// case <-s.CloseChan: +// return +// default: +// _, message, err := s.Conn.ReadMessage() +// if err != nil { +// s.ErrorChan <- fmt.Errorf("读取消息失败: %v", err) +// return +// } +// +// var resp model.SpeechWsResp +// if err := json.Unmarshal(message, &resp); err != nil { +// s.ErrorChan <- fmt.Errorf("解析消息失败: %v", err) +// continue +// } +// +// // 更新 SessionID(假设服务端返回 sessionId) +// if resp.SessionId != "" { +// s.SessionID = resp.SessionId +// } +// +// s.ResponseChan <- resp +// +// // 检查是否需要结束会话(根据业务逻辑) +// if resp.Dm != nil && resp.Dm.ShouldEndSession { +// s.CloseChan <- struct{}{} +// } +// } +// } +//} +// +//func (s *WebSocketSession) writeLoop() { +// defer s.cleanup() +// +// for { +// select { +// case <-s.CloseChan: +// return +// case req := <-s.RequestChan: +// if err := s.Conn.WriteMessage(websocket.TextMessage, req); err != nil { +// s.ErrorChan <- fmt.Errorf("发送请求失败: %v", err) +// return +// } +// } +// } +//} +// +//func (s *WebSocketSession) Close() { +// if s.IsAlive { +// close(s.CloseChan) // 通知读写协程退出 +// s.Conn.Close() // 关闭 WebSocket 连接 +// s.IsAlive = false +// } +//} +// +//func (s *WebSocketSession) cleanup() { +// close(s.RequestChan) +// close(s.ResponseChan) +// close(s.ErrorChan) +//} diff --git a/service/speechNlu/register.go b/service/speechNlu/register.go index 9a11c56a893e5a30212aedde159184f94077b44f..f84a130f94b1b2fd97fb72fbb6a9deb15fa6a4a8 100644 --- a/service/speechNlu/register.go +++ b/service/speechNlu/register.go @@ -51,6 +51,7 @@ func register() { DomainRegister(HOLIDAY, holidayDomain) DomainRegister(RELATION, speechOtherDomain) DomainRegister(WASTESORTING, speechOtherDomain) + DomainRegister(FOOD, speechOtherDomain) DomainRegister("", speechOtherDomain) // diff --git a/service/speechNlu/speech.go b/service/speechNlu/speech.go index 9705018f65d3b248ea7e92f927af8df1313c7857..93494e6a1765113e05bd98a9360194bf1510e93d 100644 --- a/service/speechNlu/speech.go +++ b/service/speechNlu/speech.go @@ -38,16 +38,11 @@ func SpeechNlu(reqStruct *model.SemanticReq) (string, *errCode.Error) { // 结果 var channelStr string - //ts := time.Now() err, content, url := dao.GetTestContent(reqStruct.MacWifi, reqStruct.Query) - //tc := time.Since(ts) - //fmt.Println(time.Now().String()[:19], err, reqStruct.MacWifi, reqStruct.Query, tc) if err == nil { channelStr = string(getTencentSongReply(url, content, reqStruct.Query)) } else { if reqStruct.Query == "声道测试" || reqStruct.Query == "音响音质测试" || reqStruct.Query == "音箱音质测试" { - // channelStr = string(getTencentSongReply("", reqStruct.Query)) - // err, content, url := dao.GetAnyTestContent(reqStruct.MacWifi, reqStruct.Query) url = global.OthersSetting.SoundTestUrl content = "" channelStr = string(getTencentSongReply(url, content, reqStruct.Query)) @@ -60,21 +55,20 @@ func SpeechNlu(reqStruct *model.SemanticReq) (string, *errCode.Error) { } else if reqStruct.Query == "编号七零六八一" && reqStruct.MacWifi == "f4911e594443" { channelStr = string(getGreeNluChatReply("好的,计时五分钟马上开始,五,四,三,二,一", "countdown", reqStruct.Query)) } else { - var session string + var sessionId string // 自动清理过期Session的守护协程 go StartSessionJanitor(1 * time.Minute) // 自动携带有效SessionID(自动刷新时间戳) if sessionID, valid := GetAndRefreshSession(reqStruct.MacVoice, 30); valid { - session = sessionID + sessionId = sessionID log.Printf("检测到有效SessionID: %s", sessionID) } else { log.Println("Session已过期或无可用Session") - session = "" - + sessionId = "" } start := time.Now() - data := SpeechNlpWsReq(reqStruct, session) + data := SpeechNlpWsReq(reqStruct, sessionId) speechNluWs := SpeechNlpWs{} var nlpWsConn *websocket.Conn @@ -132,7 +126,7 @@ func SpeechNlu(reqStruct *model.SemanticReq) (string, *errCode.Error) { } } - return string(replyWithChat(error_reply, "doudi")), errCode.InternalServiceError + //return string(replyWithChat(error_reply, "doudi")), errCode.InternalServiceError } }