| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- package controllers
- import (
- "errors"
- "github.com/gin-gonic/gin"
- "gorm.io/gorm"
- "path"
- "speechAnalysis/conf"
- "speechAnalysis/constvar"
- "speechAnalysis/extend/code"
- "speechAnalysis/extend/util"
- "speechAnalysis/models"
- "speechAnalysis/pkg/logx"
- "speechAnalysis/request"
- "speechAnalysis/service"
- "speechAnalysis/utils/upload"
- "strings"
- "time"
- )
- type AudioCtl struct{}
- // Upload
- // @Tags 音频
- // @Summary 上传音频
- // @Produce application/json
- // @Param file formData file true "音频文件"
- // @Success 200 {object} util.Response "成功"
- // @Router /api-sa/v1/audio/upload [post]
- func (slf AudioCtl) Upload(c *gin.Context) {
- _, header, err := c.Request.FormFile("file")
- if err != nil {
- util.ResponseFormat(c, code.RequestParamError, err.Error())
- return
- }
- filename := path.Base(header.Filename)
- arr := strings.Split(filename, "_")
- if len(arr) != 6 {
- util.ResponseFormat(c, code.RequestParamError, "文件名称错误")
- return
- }
- _, err = models.NewAudioSearch().SetName(filename).First()
- if err != gorm.ErrRecordNotFound {
- util.ResponseFormat(c, code.RequestParamError, "重复上传")
- return
- }
- oss := upload.NewOss()
- filePath, filename, uploadErr := oss.UploadFile(header)
- if uploadErr != nil {
- logx.Errorf("upload audio err: %v", err)
- util.ResponseFormat(c, code.RequestParamError, "上传失败")
- return
- }
- timeStr := arr[4] + strings.Split(arr[5], ".")[0]
- t, err := time.ParseInLocation("20060102150405", timeStr, time.Local)
- if err != nil {
- util.ResponseFormat(c, code.RequestParamError, "时间格式不对")
- return
- }
- audio := &models.Audio{
- Name: filename,
- Size: header.Size,
- FilePath: filePath,
- AudioStatus: constvar.AudioStatusUploadOk,
- LocomotiveNumber: arr[0],
- TrainNumber: arr[1],
- DriverNumber: arr[2],
- StationNumber: arr[3],
- OccurrenceAt: t,
- IsFollowed: 0,
- }
- if err = models.NewAudioSearch().Create(audio); err != nil {
- util.ResponseFormat(c, code.SaveFail, "上传失败")
- return
- }
- util.ResponseFormat(c, code.Success, "添加成功")
- }
- func (slf AudioCtl) ParamsCheck(filename string) (err error) {
- arr := strings.Split(filename, "_")
- if len(arr) != 6 {
- return errors.New("文件格式错误")
- }
- return nil
- }
- // List
- // @Tags 音频
- // @Summary 音频分析检索
- // @Produce application/json
- // @Param object query request.GetAudioList true "查询参数"
- // @Success 200 {object} util.ResponseList{data=[]models.Audio} "成功"
- // @Router /api-sa/v1/audio/list [get]
- func (slf AudioCtl) List(c *gin.Context) {
- var params request.GetAudioList
- if err := c.ShouldBindQuery(¶ms); err != nil {
- util.ResponseFormat(c, code.RequestParamError, err.Error())
- return
- }
- if !params.PageInfo.Check() {
- util.ResponseFormat(c, code.RequestParamError, "分页参数错误")
- return
- }
- list, total, err := models.NewAudioSearch().
- SetPage(params.Page, params.PageSize).
- SetKeyword(params.Keyword).
- SetLocomotiveNumber(params.LocomotiveNumber).
- SetTrainNumber(params.TrainNumber).
- SetDriverNumber(params.DriverNumber).
- SetStationNumber(params.StationNumber).
- Find()
- if err != nil {
- util.ResponseFormat(c, code.RequestParamError, "查找失败")
- return
- }
- util.ResponseFormatList(c, code.Success, list, int(total))
- }
- // Process
- // @Tags 音频
- // @Summary 处理音频
- // @Produce application/json
- // @Param object body request.ProcessAudio true "音频信息"
- // @Success 200 {object} util.Response "成功"
- // @Router /api-sa/v1/audio/process [post]
- func (slf AudioCtl) Process(c *gin.Context) {
- var params request.ProcessAudio
- if err := c.ShouldBind(¶ms); err != nil {
- util.ResponseFormat(c, code.RequestParamError, err.Error())
- return
- }
- audio, err := models.NewAudioSearch().SetID(params.ID).First()
- if err != nil {
- util.ResponseFormat(c, code.RequestParamError, "查找音频失败")
- return
- }
- if audio.AudioStatus != constvar.AudioStatusUploadOk && audio.AudioStatus != constvar.AudioStatusFailed {
- util.ResponseFormat(c, code.RequestParamError, "状态不正确")
- return
- }
- err = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusProcessing})
- if err != nil {
- util.ResponseFormat(c, code.RequestParamError, "处理失败")
- return
- }
- go func() {
- resp, err := service.AnalysisAudio(audio.FilePath, conf.AanlysisConf.Url)
- if err != nil {
- logx.Errorf("err when AnalysisAudio:%v", err)
- _ = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed})
- return
- }
- if resp.Code != 0 {
- logx.Errorf("AnalysisAudio error return:%v", resp)
- _ = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed})
- return
- }
- logx.Infof("AnalysisAudio result: %v", resp)
- err = models.WithTransaction(func(db *gorm.DB) error {
- err = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFinish})
- if err != nil {
- return err
- }
- err = models.NewAudioTextSearch().Save(&models.AudioText{
- AudioID: audio.ID,
- AudioText: resp.Result,
- Score: resp.Score,
- })
- return err
- })
- if err != nil {
- logx.Infof("AnalysisAudio success but update record failed: %v", err)
- return
- }
- }()
- util.ResponseFormat(c, code.UpdateSuccess, "成功")
- }
|