标模音频驱动表情算法 - WebSocket 接口
{ "title": "标模音频驱动表情算法 - WebSocket 接口", "description": "使用 WebSocket 接口实现标模音频驱动表情算法,接收音频数据,进行处理并返回表情数据。", "keywords": "标模, 音频驱动, 表情算法, WebSocket, 接口", "content": "func (this *NoticeDetectionCtl) OnModelVoiceDriverWS() {\n\tvar resMap protocol.STAReq\n\terr := this.UnMarshal(&resMap)\n\tif err != nil {\n\t logs.Error("OnModelVoiceDriverWS, %s, err = %v", string(this.Ctx.Input.RequestBody), err)\n\t this.OnError(errno.EC_InvalidArg, errno.EM_InvalidArg)\n\t return\n\t}\n\tif resMap.Input == "" {\n\t logs.Error("OnModelVoiceDriverWS,无效参数")\n\t this.OnError(errno.EC_InvalidArg, errno.EM_InvalidArg)\n\t return\n\t}\n\tlogs.Info("OnModelVoiceDriverWS, modelId=%d, userId=%d, gender=%d, flag=%d, input=%s", this.Session.ModelId, this.Session.Id, resMap.Gender, resMap.Flag, resMap.Input)\n\tcommonInfo := fmt.Sprintf("OnModelVoiceDriverWS OnSocket start")\n\n\t// 连接服务器\n\tconn, resp, err := websocket.DefaultDialer.Dial(appconf.TTSStaApi, nil)\n\tif err != nil {\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t logs.Info("OnModelVoiceDriverWS OnSocket dial error: %v\n", err)\n\t return\n\t}\n\tdefer conn.Close()\n\n\t// 输出响应信息\n\tlogs.Info("OnModelVoiceDriverWS OnSocket ws resp: Status=%s, StatusCode=%d, Proto=%s\n",\n\t resp.Status, resp.StatusCode, resp.Proto)\n\n\tvar strSlice []string\n\t//构造请求数据\n\theader := ModelStaHeader(resMap.Gender)\n\tbody := ModelStaBody(resMap.Input)\n\n\t// 发送音频数据\n\tsendData := map[string]interface{}{"head": header, "data": body}\n\tsendDataBytes, _ := json.Marshal(sendData)\n\terr = conn.WriteMessage(websocket.TextMessage, sendDataBytes)\n\tif websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {\n\t logs.Info("OnModelVoiceDriverWS Connection closed")\n\t return\n\t} else if err != nil {\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t logs.Error("OnModelVoiceDriverWS Error sending audio data:", err)\n\t}\n\n\tvar bsFrames [][]int32\n\tvar orderStr [][]string\n\t//var builder strings.Builder\n\t// 接收服务端返回的数据流\n\tfor {\n\t _, msg, err := conn.ReadMessage()\n\t if websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {\n\t logs.Info(" OnModelVoiceDriverWS Connection closed")\n\t return\n\t } else if err != nil {\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t logs.Error("OnModelVoiceDriverWS read error: %v\n", err)\n\t return\n\t }\n\n\t var res protocol.ModelSTARes\n\t err = json.Unmarshal(msg, &res)\n\t if err != nil {\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t logs.Error("receiveData, Parse JSON response and handle data,err: ", err)\n\t return\n\t }\n\n\t // Handle content type\n\t switch res.Code {\n\t case 200:\n\t // Decode base64 audio data and save to file\n\t if len(res.Data.VesAnimeResult.Order) == 0 {\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t logs.Error("Failed to get VesAnimeResult.Order: %v\n", err)\n\t return\n\t }\n\t if len(res.Data.VesAnimeResult.Frame[0]) == 0 {\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t logs.Error("res.Data.VesAnimeResult.Frame: %v\n", err)\n\t return\n\t }\n\t if res.Data.VesAnimeResult.Coefl == 0 {\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t logs.Error("res.Data.VesAnimeResult.Coefl: %v\n", err)\n\t return\n\t }\n\t // 解析数据处理后给UE\n\t bsFrames = append(bsFrames, res.Data.VesAnimeResult.Frame...)\n\t orderStr = append(orderStr, res.Data.VesAnimeResult.Order)\n\t content, err := base64.StdEncoding.DecodeString(res.Data.Content)\n\t if err != nil {\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t logs.Error("res.Data.Content decode error: %v", err)\n\t }\n\t strSlice = append(strSlice, string(content))\n\t //builder.WriteString(res.Data.Content)\n\t default:\n\t logs.Error("Received response code: %d\n", res.Code)\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t }\n\t // 根据服务器返回的数据结束连接\n\t if res.Data.IsLast && res.Data.IsFinish {\n\t conn.Close()\n\t break\n\t }\n\t time.Sleep(10 * time.Millisecond)\n\n\t}\n\tif len(strSlice) == 0 {\n\t logs.Error("音频数据为空")\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t}\n\tlogs.Info("OnModelVoiceDriverWS,orderStr: %v", orderStr)\n\tbyteSlice := FixFiles(strSlice)\n\twavStr := base64.StdEncoding.EncodeToString(byteSlice)\n\tgo HandelModelData(bsFrames, 10000, this.Token, commonInfo, resMap.Seq)\n\tlogs.Info("%s, finish", commonInfo)\n\ttime.Sleep(3 * time.Millisecond)\n\tif resMap.Flag == 1 {\n\t this.OnAddText(&resMap)\n\t}\n\tresult := make(map[string]interface{})\n\tif len(wavStr) != 0 {\n\t //result["audio"] = builder.String()\n\t result["audio"] = wavStr\n\t this.OnSuccess(result)\n\t} else {\n\t this.OnError(errno.EC_InnerError, errno.EM_InnerError)\n\t}\n}
原文地址: https://www.cveoy.top/t/topic/pV70 著作权归作者所有。请勿转载和采集!