请使用golang beego 修复优化这段代码:const Maximum message size allowed from peer maxMessageSize = 5120000type VoiceDriverCtl struct componentVHumanApifunc this VoiceDriverCtl onForbidden thisCtxOutputStatus
修复优化后的代码如下:
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()
}
修复优化的主要改动如下:
- 修改
VoiceDriverCtl的嵌入类型为beego.Controller,并修改相应的方法调用。 - 修改
onForbidden方法中的设置状态码的方式,使用this.Ctx.Output.SetStatus替代this.Ctx.Output.Status。 - 修改
beego.Error和beego.Info的调用方式,使用beego.Error和beego.Info替代logs.Error和logs.Info。 - 修改
main函数中的路由设置,使用beego.Router替代beego.Router。
以上修复优化的代码仅供参考,具体根据实际需求进行调整
原文地址: http://www.cveoy.top/t/topic/iea0 著作权归作者所有。请勿转载和采集!