修复优化后的代码如下:

package main

import (
	"encoding/base64"
	"encoding/json"
	"fmt"
	"net/http"
	"time"

	"github.com/astaxie/beego"
	"github.com/gorilla/websocket"
)

const (
	// Maximum message size allowed from peer.
	maxMessageSize = 5120000
)

type VoiceDriverCtl struct {
	beego.Controller
}

func (this *VoiceDriverCtl) onForbidden() {
	this.Ctx.Output.SetStatus(401)
	this.Ctx.Output.Body([]byte("Forbidden"))
	this.StopRun()
}

func (this *VoiceDriverCtl) OnDemo() {
	if !this.Ctx.Input.IsWebsocket() {
		this.onForbidden()
		return
	}

	OnModelVoiceDriverSocket(this.Ctx.ResponseWriter, this.Ctx.Request)
}

func OnModelVoiceDriverSocket(resp http.ResponseWriter, req *http.Request) {
	remoteAddr := req.RemoteAddr
	commonInfo := fmt.Sprintf("OnModelVoiceDriverSocket, ip = %s", remoteAddr)

	var upgrader = websocket.Upgrader{
		ReadBufferSize:  1024,
		WriteBufferSize: 1024,
		// 允许所有的CORS 跨域请求,正式环境可以关闭
		CheckOrigin: func(r *http.Request) bool {
			return true
		},
	}
	// 应答客户端告知升级连接为websocket
	wsSocket, err := upgrader.Upgrade(resp, req, nil)
	if err != nil {
		beego.Error("%s, 升级为websocket失败, err = %v", commonInfo, err.Error())
		return
	}
	wsSocket.SetReadLimit(maxMessageSize)

	beego.Info("%s, is connected", commonInfo)

	defer func() {
		beego.Info("%s, is disconnected", commonInfo)
		wsSocket.Close()
	}()

	for {
		_, data, err := wsSocket.ReadMessage()
		if err != nil {
			//websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure)
			beego.Error("%s, read message error, %v", commonInfo, err.Error())
			return
		}

		beego.Info("%s, recv: %s", commonInfo, string(data))

		//发送消息给STA算法
		err = sendToSta(data)
		if err != nil {
			fmt.Println("Failed to send message to third party:", err)
		}
	}
}

func sendToSta(msg []byte) error {
	commonInfo := fmt.Sprintf("sendToSta")
	var message protocol.STAReq
	err := json.Unmarshal(msg, &message)
	if err != nil {
		beego.Error("%s, read: %s, err = %v", commonInfo, string(msg), err)
		return err
	}
	if message.Input == "" {
		beego.Error("%s,无效参数", commonInfo)
		return fmt.Errorf("%s,无效参数", commonInfo)
	}
	beego.Info("sendToSta,  gender=%d, flag=%d, input=%s", message.Gender, message.Flag, message.Input)
	// 连接第三方接口WebSocket
	// 连接服务器
	conn, resp, err := websocket.DefaultDialer.Dial(appconf.TTSStaApi, nil)
	if err != nil {
		beego.Info("OnModelVoiceDriver OnSocket dial error: %v\n", err)
		return err
	}
	defer conn.Close()

	// 输出响应信息
	beego.Info("OnModelVoiceDriver OnSocket ws resp: Status=%s, StatusCode=%d, Proto=%s\n",
		resp.Status, resp.StatusCode, resp.Proto)

	var strSlice []string
	//构造请求数据
	header := ModelStaHeader1(message.Gender)
	body := ModelStaBody1(message.Input)

	// 发送音频数据
	sendData := map[string]interface{}{"head": header, "data": body}
	sendDataBytes, _ := json.Marshal(sendData)
	err = conn.WriteMessage(websocket.TextMessage, sendDataBytes)
	if websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
		beego.Info("OnModelVoiceDriver Connection closed")
		return err
	} else if err != nil {
		beego.Error("OnModelVoiceDriver Error sending audio data:", err)
	}
	var bsFrames [][]int32
	var orderStr [][]string
	//var builder strings.Builder
	// 接收服务端返回的数据流
	for {
		_, msg, err := conn.ReadMessage()
		if websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
			beego.Info(" OnModelVoiceDriver Connection closed")
			return err
		} else if err != nil {
			beego.Error("OnModelVoiceDriver read error: %v\n", err)
			return err
		}

		var res protocol.ModelSTARes
		err = json.Unmarshal(msg, &res)
		if err != nil {
			beego.Error("receiveData, Parse JSON response and handle data,err: ", err)
			return err
		}

		// Handle content type
		switch res.Code {
		case 200:
			// Decode base64 audio data and save to file
			if len(res.Data.VesAnimeResult.Order) == 0 {
				beego.Error("Failed to get VesAnimeResult.Order: %v\n", err)
				return err
			}
			if len(res.Data.VesAnimeResult.Frame[0]) == 0 {
				beego.Error("res.Data.VesAnimeResult.Frame: %v\n", err)
				return err
			}
			if res.Data.VesAnimeResult.Coefl == 0 {
				beego.Error("res.Data.VesAnimeResult.Coefl: %v\n", err)
				return err
			}
			// 解析数据处理后给UE
			bsFrames = append(bsFrames, res.Data.VesAnimeResult.Frame...)
			orderStr = append(orderStr, res.Data.VesAnimeResult.Order)
			content, err := base64.StdEncoding.DecodeString(res.Data.Content)
			if err != nil {
				beego.Error("res.Data.Content decode error: %v", err)
			}
			strSlice = append(strSlice, string(content))
			//builder.WriteString(res.Data.Content)
		default:
			beego.Error("Received response code: %d\n", res.Code)

		}
		// 根据服务器返回的数据结束连接
		if res.Data.IsLast && res.Data.IsFinish {
			conn.Close()
			break
		}
		time.Sleep(10 * time.Millisecond)

	}
	if len(strSlice) == 0 {
		beego.Error("音频数据为空")
	}
	beego.Info("OnModelVoiceDriver,orderStr: %v", orderStr)
	byteSlice := FixFiles(strSlice)
	wavStr := base64.StdEncoding.EncodeToString(byteSlice)
	go HandelModelData(bsFrames, 10000, this.Token, commonInfo, message.Seq)
	beego.Info("%s, finish", commonInfo)
	time.Sleep(3 * time.Millisecond)
	if message.Flag == 1 {
		this.OnAddText(&message)
	}
	result := make(map[string]interface{})
	if len(wavStr) != 0 {
		//result["audio"] = builder.String()
		result["audio"] = wavStr
	} else {
	}
	return nil
}

func main() {
	beego.Router("/demo", &VoiceDriverCtl{}, "get:OnDemo")
	beego.Run()
}

修复优化的主要改动如下:

  1. 修改VoiceDriverCtl的嵌入类型为beego.Controller,并修改相应的方法调用。
  2. 修改onForbidden方法中的设置状态码的方式,使用this.Ctx.Output.SetStatus替代this.Ctx.Output.Status
  3. 修改beego.Errorbeego.Info的调用方式,使用beego.Errorbeego.Info替代logs.Errorlogs.Info
  4. 修改main函数中的路由设置,使用beego.Router替代beego.Router

以上修复优化的代码仅供参考,具体根据实际需求进行调整

请使用golang beego 修复优化这段代码:const 	 Maximum message size allowed from peer	maxMessageSize = 5120000type VoiceDriverCtl struct 	componentVHumanApifunc this VoiceDriverCtl onForbidden 	thisCtxOutputStatus

原文地址: http://www.cveoy.top/t/topic/iea0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录