audio.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. package controllers
  2. import (
  3. "errors"
  4. "github.com/gin-gonic/gin"
  5. "gorm.io/gorm"
  6. "path"
  7. "speechAnalysis/constvar"
  8. "speechAnalysis/extend/code"
  9. "speechAnalysis/extend/util"
  10. "speechAnalysis/models"
  11. "speechAnalysis/pkg/logx"
  12. "speechAnalysis/request"
  13. "speechAnalysis/response"
  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. Station: 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. go func() {
  74. var trainInfoNames = []string{arr[0], arr[1], arr[3]}
  75. var (
  76. info *models.TrainInfo
  77. err error
  78. parent models.TrainInfo
  79. )
  80. for i := 0; i < 3; i++ {
  81. name := trainInfoNames[i]
  82. class := constvar.Class(i + 1)
  83. info, err = models.NewTrainInfoSearch().SetName(name).SetClass(class).First()
  84. if err == gorm.ErrRecordNotFound {
  85. info = &models.TrainInfo{
  86. Name: name,
  87. Class: class,
  88. ParentID: parent.ID,
  89. }
  90. _ = models.NewTrainInfoSearch().Create(info)
  91. }
  92. parent = *info
  93. }
  94. }()
  95. util.ResponseFormat(c, code.Success, "添加成功")
  96. }
  97. func (slf AudioCtl) ParamsCheck(filename string) (err error) {
  98. arr := strings.Split(filename, "_")
  99. if len(arr) != 6 {
  100. return errors.New("文件格式错误")
  101. }
  102. return nil
  103. }
  104. // TrainInfoList
  105. // @Tags 音频
  106. // @Summary 获取火车信息
  107. // @Produce application/json
  108. // @Param object query request.GetTrainInfoList true "参数"
  109. // @Success 200 {object} util.ResponseList{data=[]models.TrainInfo} "成功"
  110. // @Router /api-sa/v1/audio/trainInfoList [get]
  111. func (slf AudioCtl) TrainInfoList(c *gin.Context) {
  112. var params request.GetTrainInfoList
  113. if err := c.ShouldBindQuery(&params); err != nil {
  114. util.ResponseFormat(c, code.RequestParamError, err.Error())
  115. return
  116. }
  117. if !params.PageInfo.Check() {
  118. util.ResponseFormat(c, code.RequestParamError, "分页参数错误")
  119. return
  120. }
  121. list, total, err := models.NewTrainInfoSearch().
  122. SetPage(params.Page, params.PageSize).
  123. SetClass(params.Class).
  124. SetParentId(params.ParentID).
  125. Find()
  126. if err != nil {
  127. util.ResponseFormat(c, code.RequestParamError, "查找失败")
  128. return
  129. }
  130. util.ResponseFormatList(c, code.Success, list, total)
  131. }
  132. // List
  133. // @Tags 音频
  134. // @Summary 音频分析检索
  135. // @Produce application/json
  136. // @Param object query request.GetAudioList true "参数"
  137. // @Success 200 {object} util.ResponseList{data=[]models.Audio} "成功"
  138. // @Router /api-sa/v1/audio/list [get]
  139. func (slf AudioCtl) List(c *gin.Context) {
  140. var params request.GetAudioList
  141. if err := c.ShouldBindQuery(&params); err != nil {
  142. util.ResponseFormat(c, code.RequestParamError, err.Error())
  143. return
  144. }
  145. if !params.PageInfo.Check() {
  146. util.ResponseFormat(c, code.RequestParamError, "分页参数错误")
  147. return
  148. }
  149. list, total, err := models.NewAudioSearch().
  150. SetPage(params.Page, params.PageSize).
  151. SetKeyword(params.Keyword).
  152. SetLocomotiveNumber(params.LocomotiveNumber).
  153. SetTrainNumber(params.TrainNumber).
  154. SetDriverNumber(params.DriverNumber).
  155. SetStation(params.StationNumber).
  156. SetBeginTime(params.BeginTime).
  157. SetEndTime(params.EndTime).
  158. SetIsFollowed(params.IsFollowed).
  159. Find()
  160. if err != nil {
  161. util.ResponseFormat(c, code.RequestParamError, "查找失败")
  162. return
  163. }
  164. util.ResponseFormatList(c, code.Success, list, total)
  165. }
  166. // Process
  167. // @Tags 音频
  168. // @Summary 处理音频
  169. // @Produce application/json
  170. // @Param object body request.ProcessAudio true "参数"
  171. // @Success 200 {object} util.Response "成功"
  172. // @Router /api-sa/v1/audio/process [post]
  173. func (slf AudioCtl) Process(c *gin.Context) {
  174. var params request.ProcessAudio
  175. if err := c.ShouldBind(&params); err != nil {
  176. util.ResponseFormat(c, code.RequestParamError, err.Error())
  177. return
  178. }
  179. err := service.Process(params.ID)
  180. if err != nil {
  181. util.ResponseFormat(c, code.InternalError, err.Error())
  182. return
  183. }
  184. util.ResponseFormat(c, code.UpdateSuccess, "成功")
  185. }
  186. // AudioInfo
  187. // @Tags 音频
  188. // @Summary 音频详情,含解析结果
  189. // @Produce application/json
  190. // @Param object query request.ProcessAudio true "参数"
  191. // @Success 200 {object} util.Response{data=models.Audio} "成功"
  192. // @Router /api-sa/v1/audio/info [get]
  193. func (slf AudioCtl) AudioInfo(c *gin.Context) {
  194. var params request.ProcessAudio
  195. if err := c.ShouldBindQuery(&params); err != nil {
  196. util.ResponseFormat(c, code.RequestParamError, err.Error())
  197. return
  198. }
  199. audio, err := models.NewAudioSearch().SetID(params.ID).First()
  200. if err != nil {
  201. util.ResponseFormat(c, code.InternalError, "请求失败")
  202. return
  203. }
  204. audioText, err := models.NewAudioTextSearch().SetAudioID(audio.ID).First()
  205. if err == nil {
  206. audio.AudioText = audioText.AudioText
  207. }
  208. util.ResponseFormat(c, code.UpdateSuccess, audio)
  209. }
  210. // AudioDownload
  211. // @Tags 音频
  212. // @Summary 音频下载
  213. // @Produce application/json
  214. // @Param object query request.ProcessAudio true "参数"
  215. // @Success 200 {object} util.Response{data=models.Audio} "成功"
  216. // @Router /api-sa/v1/audio/download [get]
  217. func (slf AudioCtl) AudioDownload(c *gin.Context) {
  218. var params request.ProcessAudio
  219. if err := c.ShouldBindQuery(&params); err != nil {
  220. util.ResponseFormat(c, code.RequestParamError, err.Error())
  221. return
  222. }
  223. audio, err := models.NewAudioSearch().SetID(params.ID).First()
  224. if err != nil {
  225. util.ResponseFormat(c, code.InternalError, "查询失败")
  226. return
  227. }
  228. if audio.FilePath == "" {
  229. util.ResponseFormat(c, code.InternalError, "查询失败")
  230. return
  231. }
  232. c.Header("Content-Description", "File Transfer")
  233. c.Header("Content-Disposition", "attachment; filename="+audio.Name)
  234. c.Header("Content-Type", "application/octet-stream")
  235. c.File(audio.FilePath)
  236. }
  237. // BatchProcess
  238. // @Tags 音频
  239. // @Summary 批量处理音频
  240. // @Produce application/json
  241. // @Param object body request.BatchProcessAudio true "参数"
  242. // @Success 200 {object} util.Response "成功"
  243. // @Router /api-sa/v1/audio/batchProcess [post]
  244. func (slf AudioCtl) BatchProcess(c *gin.Context) {
  245. var params request.BatchProcessAudio
  246. if err := c.ShouldBind(&params); err != nil {
  247. util.ResponseFormat(c, code.RequestParamError, err.Error())
  248. return
  249. }
  250. var failedNumber int
  251. for _, audioID := range params.IDs {
  252. err := service.Process(audioID)
  253. if err != nil {
  254. logx.Errorf("%v,编号: %v", err.Error(), audioID)
  255. failedNumber++
  256. continue
  257. }
  258. }
  259. if failedNumber == 0 {
  260. util.ResponseFormat(c, code.UpdateSuccess, "成功")
  261. return
  262. } else if failedNumber < len(params.IDs) {
  263. util.ResponseFormat(c, code.RequestParamError, "部分处理失败")
  264. return
  265. } else {
  266. util.ResponseFormat(c, code.RequestParamError, "全部处理失败")
  267. return
  268. }
  269. }
  270. // Delete
  271. // @Tags 音频
  272. // @Summary 删除音频
  273. // @Produce application/json
  274. // @Param object body request.ProcessAudio true "参数"
  275. // @Success 200 {object} util.Response "成功"
  276. // @Router /api-sa/v1/audio/delete [delete]
  277. func (slf AudioCtl) Delete(c *gin.Context) {
  278. var params request.ProcessAudio
  279. if err := c.ShouldBind(&params); err != nil {
  280. util.ResponseFormat(c, code.RequestParamError, err.Error())
  281. return
  282. }
  283. err := service.DeleteAudio(params.ID)
  284. if err != nil {
  285. util.ResponseFormat(c, code.InternalError, err.Error())
  286. return
  287. }
  288. util.ResponseFormat(c, code.DeleteSuccess, "成功")
  289. }
  290. // BatchDelete
  291. // @Tags 音频
  292. // @Summary 批量删除音频
  293. // @Produce application/json
  294. // @Param object body request.BatchProcessAudio true "参数"
  295. // @Success 200 {object} util.Response "成功"
  296. // @Router /api-sa/v1/audio/batchDelete [delete]
  297. func (slf AudioCtl) BatchDelete(c *gin.Context) {
  298. var params request.BatchProcessAudio
  299. if err := c.ShouldBind(&params); err != nil {
  300. util.ResponseFormat(c, code.RequestParamError, err.Error())
  301. return
  302. }
  303. err := service.BatchDeleteAudio(params.IDs)
  304. if err != nil {
  305. util.ResponseFormat(c, code.InternalError, err.Error())
  306. return
  307. }
  308. util.ResponseFormat(c, code.DeleteSuccess, "成功")
  309. }
  310. // Follow
  311. // @Tags 音频
  312. // @Summary 关注/取消关注
  313. // @Produce application/json
  314. // @Param object body request.FollowReq true "参数"
  315. // @Success 200 {object} util.Response{data=response.FollowResp} "成功"
  316. // @Router /api-sa/v1/audio/follow [post]
  317. func (slf AudioCtl) Follow(c *gin.Context) {
  318. var params request.ProcessAudio
  319. if err := c.ShouldBind(&params); err != nil {
  320. util.ResponseFormat(c, code.RequestParamError, err.Error())
  321. return
  322. }
  323. followStatus, err := service.Follow(params.ID)
  324. if err != nil {
  325. util.ResponseFormat(c, code.InternalError, err.Error())
  326. return
  327. }
  328. resp := response.FollowResp{FollowStatus: followStatus}
  329. util.ResponseFormat(c, code.UpdateSuccess, resp)
  330. }