audio.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package controllers
  2. import (
  3. "errors"
  4. "github.com/gin-gonic/gin"
  5. "gorm.io/gorm"
  6. "path"
  7. "speechAnalysis/conf"
  8. "speechAnalysis/constvar"
  9. "speechAnalysis/extend/code"
  10. "speechAnalysis/extend/util"
  11. "speechAnalysis/models"
  12. "speechAnalysis/pkg/logx"
  13. "speechAnalysis/request"
  14. "speechAnalysis/service"
  15. "speechAnalysis/utils/upload"
  16. "strings"
  17. "time"
  18. )
  19. type AudioCtl struct{}
  20. // Upload
  21. // @Tags 音频
  22. // @Summary 上传音频
  23. // @Produce application/json
  24. // @Param file formData file true "音频文件"
  25. // @Success 200 {object} util.Response "成功"
  26. // @Router /api-sa/v1/audio/upload [post]
  27. func (slf AudioCtl) Upload(c *gin.Context) {
  28. _, header, err := c.Request.FormFile("file")
  29. if err != nil {
  30. util.ResponseFormat(c, code.RequestParamError, err.Error())
  31. return
  32. }
  33. filename := path.Base(header.Filename)
  34. arr := strings.Split(filename, "_")
  35. if len(arr) != 6 {
  36. util.ResponseFormat(c, code.RequestParamError, "文件名称错误")
  37. return
  38. }
  39. _, err = models.NewAudioSearch().SetName(filename).First()
  40. if err != gorm.ErrRecordNotFound {
  41. util.ResponseFormat(c, code.RequestParamError, "重复上传")
  42. return
  43. }
  44. oss := upload.NewOss()
  45. filePath, filename, uploadErr := oss.UploadFile(header)
  46. if uploadErr != nil {
  47. logx.Errorf("upload audio err: %v", err)
  48. util.ResponseFormat(c, code.RequestParamError, "上传失败")
  49. return
  50. }
  51. timeStr := arr[4] + strings.Split(arr[5], ".")[0]
  52. t, err := time.ParseInLocation("20060102150405", timeStr, time.Local)
  53. if err != nil {
  54. util.ResponseFormat(c, code.RequestParamError, "时间格式不对")
  55. return
  56. }
  57. audio := &models.Audio{
  58. Name: filename,
  59. Size: header.Size,
  60. FilePath: filePath,
  61. AudioStatus: constvar.AudioStatusUploadOk,
  62. LocomotiveNumber: arr[0],
  63. TrainNumber: arr[1],
  64. DriverNumber: arr[2],
  65. StationNumber: arr[3],
  66. OccurrenceAt: t,
  67. IsFollowed: 0,
  68. }
  69. if err = models.NewAudioSearch().Create(audio); err != nil {
  70. util.ResponseFormat(c, code.SaveFail, "上传失败")
  71. return
  72. }
  73. util.ResponseFormat(c, code.Success, "添加成功")
  74. }
  75. func (slf AudioCtl) ParamsCheck(filename string) (err error) {
  76. arr := strings.Split(filename, "_")
  77. if len(arr) != 6 {
  78. return errors.New("文件格式错误")
  79. }
  80. return nil
  81. }
  82. // List
  83. // @Tags 音频
  84. // @Summary 音频分析检索
  85. // @Produce application/json
  86. // @Param object query request.GetAudioList true "查询参数"
  87. // @Success 200 {object} util.ResponseList{data=[]models.Audio} "成功"
  88. // @Router /api-sa/v1/audio/list [get]
  89. func (slf AudioCtl) List(c *gin.Context) {
  90. var params request.GetAudioList
  91. if err := c.ShouldBindQuery(&params); err != nil {
  92. util.ResponseFormat(c, code.RequestParamError, err.Error())
  93. return
  94. }
  95. if !params.PageInfo.Check() {
  96. util.ResponseFormat(c, code.RequestParamError, "分页参数错误")
  97. return
  98. }
  99. list, total, err := models.NewAudioSearch().
  100. SetPage(params.Page, params.PageSize).
  101. SetKeyword(params.Keyword).
  102. SetLocomotiveNumber(params.LocomotiveNumber).
  103. SetTrainNumber(params.TrainNumber).
  104. SetDriverNumber(params.DriverNumber).
  105. SetStationNumber(params.StationNumber).
  106. Find()
  107. if err != nil {
  108. util.ResponseFormat(c, code.RequestParamError, "查找失败")
  109. return
  110. }
  111. util.ResponseFormatList(c, code.Success, list, int(total))
  112. }
  113. // Process
  114. // @Tags 音频
  115. // @Summary 处理音频
  116. // @Produce application/json
  117. // @Param object body request.ProcessAudio true "音频信息"
  118. // @Success 200 {object} util.Response "成功"
  119. // @Router /api-sa/v1/audio/process [post]
  120. func (slf AudioCtl) Process(c *gin.Context) {
  121. var params request.ProcessAudio
  122. if err := c.ShouldBind(&params); err != nil {
  123. util.ResponseFormat(c, code.RequestParamError, err.Error())
  124. return
  125. }
  126. audio, err := models.NewAudioSearch().SetID(params.ID).First()
  127. if err != nil {
  128. util.ResponseFormat(c, code.RequestParamError, "查找音频失败")
  129. return
  130. }
  131. if audio.AudioStatus != constvar.AudioStatusUploadOk && audio.AudioStatus != constvar.AudioStatusFailed {
  132. util.ResponseFormat(c, code.RequestParamError, "状态不正确")
  133. return
  134. }
  135. err = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusProcessing})
  136. if err != nil {
  137. util.ResponseFormat(c, code.RequestParamError, "处理失败")
  138. return
  139. }
  140. go func() {
  141. resp, err := service.AnalysisAudio(audio.FilePath, conf.AanlysisConf.Url)
  142. if err != nil {
  143. logx.Errorf("err when AnalysisAudio:%v", err)
  144. _ = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed})
  145. return
  146. }
  147. if resp.Code != 0 {
  148. logx.Errorf("AnalysisAudio error return:%v", resp)
  149. _ = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed})
  150. return
  151. }
  152. logx.Infof("AnalysisAudio result: %v", resp)
  153. err = models.WithTransaction(func(db *gorm.DB) error {
  154. err = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFinish})
  155. if err != nil {
  156. return err
  157. }
  158. err = models.NewAudioTextSearch().Save(&models.AudioText{
  159. AudioID: audio.ID,
  160. AudioText: resp.Result,
  161. Score: resp.Score,
  162. })
  163. return err
  164. })
  165. if err != nil {
  166. logx.Infof("AnalysisAudio success but update record failed: %v", err)
  167. return
  168. }
  169. }()
  170. util.ResponseFormat(c, code.UpdateSuccess, "成功")
  171. }