请使用golang beego 修复优化这段代码:package controllersimport encodingbase64 encodingjson fmt githubcombeegobeegov2corelogs githubcomgorillawebsocket gopkginmgov2 migucomcomponent migucomdao migucomerrno appcon
package controllers
import ( "encoding/base64" "encoding/json" "fmt" "github.com/beego/beego/v2/core/logs" "github.com/gorilla/websocket" "gopkg.in/mgo.v2" "migu.com/component" "migu.com/dao" "migu.com/errno" appconf "migu.com/server/avatar-api-v2/config" "migu.com/server/avatar-api-v2/protocol" "net/http" "net/url" "time" )
const ( // Maximum message size allowed from peer. maxMessageSize = 5120000 )
type VoiceDriverCtl struct { component.VHumanApi }
func (this *VoiceDriverCtl) onForbidden() { this.Ctx.Output.Status = http.StatusUnauthorized 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 {
logs.Error("%s, 升级为websocket失败, err = %v", commonInfo, err.Error())
return
}
wsSocket.SetReadLimit(maxMessageSize)
logs.Info("%s, is connected", commonInfo)
defer func() {
logs.Info("%s, is disconnected", commonInfo)
wsSocket.Close()
}()
for {
_, data, err := wsSocket.ReadMessage()
if err != nil {
//websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure)
logs.Error("%s, read message error, %v", commonInfo, err.Error())
return
}
logs.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 ModelStaHeader(gender int) map[string]string { sid := "1223012033" APPID := "" speaker := 10 if gender == 2 { speaker = 0 } param := map[string]interface{}{ "audio_format": "wav", "speaker_id": speaker, "emotion": 0, "speed_ratio": "1.0", "energy_ratio": "1.0", "pitch_ratio": "1.0", "emotion_control": "1.0", "local": 1, "S_style": 3, "lang": "CH", // CH / EN } data, _ := json.Marshal(param) paramBase64 := base64.StdEncoding.EncodeToString(data)
sessionParam := map[string]interface{}{
"native_voice_name": "xiaoyan",
"audio_coding": "wav",
}
sessionData, _ := json.Marshal(sessionParam)
sessionParam64 := base64.StdEncoding.EncodeToString(sessionData)
header := map[string]string{
"Param": paramBase64,
"Appid": APPID,
"sessionParam": sessionParam64,
"sid": sid,
}
logs.Info("ModelStaHeader %v:", header)
return header
}
func ModelStaBody(input string) string { fileContentURLEncode := url.Values{} fileContentURLEncode.Set("text", input) body := fileContentURLEncode.Encode()
return body
}
func sendToSta(msg []byte) error { commonInfo := fmt.Sprintf("sendToSta") var message protocol.STAReq err := json.Unmarshal(msg, &message) if err != nil { logs.Error("%s, read: %s, err = %v", commonInfo, string(msg), err) return err } if message.Input == "" { logs.Error("%s,无效参数", commonInfo) return fmt.Errorf("%s,无效参数", commonInfo) } logs.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 { logs.Info("OnModelVoiceDriver OnSocket dial error: %v\n", err) return err } defer conn.Close()
// 输出响应信息
logs.Info("OnModelVoiceDriver OnSocke
原文地址: http://www.cveoy.top/t/topic/ieaC 著作权归作者所有。请勿转载和采集!