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
请使用golang beego 修复优化这段代码:package controllersimport 	encodingbase64	encodingjson	fmt	githubcombeegobeegov2corelogs	githubcomgorillawebsocket	gopkginmgov2	migucomcomponent	migucomdao	migucomerrno	appcon

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

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