speech_recognition.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. package speech_recognition
  2. import (
  3. "eta/eta_api/utils"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "github.com/rdlucklib/rdluck_tools/paging"
  7. "strings"
  8. "time"
  9. )
  10. const (
  11. SpeechRecognitionFileRemoveFlag = 1 // 文件删除标记
  12. SpeechRecognitionStateWait = 1
  13. SpeechRecognitionStateSuccess = 2
  14. SpeechRecognitionStateFail = 3
  15. )
  16. // SpeechRecognition 语音识别主表
  17. type SpeechRecognition struct {
  18. SpeechRecognitionId int `orm:"column(speech_recognition_id);pk"`
  19. UniqueCode string `description:"唯一编码"`
  20. FileName string `description:"文件名称"`
  21. ResourceUrl string `description:"文件路径"`
  22. MenuId int `description:"目录ID"`
  23. SysUserId int `description:"创建人ID"`
  24. SysUserName string `description:"创建人姓名"`
  25. State int `description:"状态:1-待转换;2-转换完成;3-转换失败"`
  26. Abstract string `description:"摘要,取前几段内容"`
  27. Sort int `description:"目录下的排序"`
  28. FileState int `description:"文件(非语音识别)删除状态:0-正常;1-删除(该字段作为软删标识)"`
  29. FileSecond int `description:"文件时长(秒)"`
  30. FileSize int `description:"文件大小(byte)"`
  31. ConvertRemark string `description:"转写备注-失败原因"`
  32. CreateTime time.Time `description:"创建时间"`
  33. ModifyTime time.Time `description:"修改时间"`
  34. }
  35. var SpeechRecognitionCols = struct {
  36. SpeechRecognitionId string
  37. UniqueCode string
  38. FileName string
  39. ResourceUrl string
  40. MenuId string
  41. MenuPath string
  42. SysUserId string
  43. SysUserName string
  44. State string
  45. Abstract string
  46. Sort string
  47. FileState string
  48. FileSecond string
  49. FileSize string
  50. ConvertRemark string
  51. CreateTime string
  52. ModifyTime string
  53. }{
  54. SpeechRecognitionId: "speech_recognition_id",
  55. UniqueCode: "unique_code",
  56. FileName: "file_name",
  57. ResourceUrl: "resource_url",
  58. MenuId: "menu_id",
  59. MenuPath: "menu_path",
  60. SysUserId: "sys_user_id",
  61. SysUserName: "sys_user_name",
  62. State: "state",
  63. Abstract: "abstract",
  64. Sort: "sort",
  65. FileState: "file_state",
  66. FileSecond: "file_second",
  67. FileSize: "file_size",
  68. ConvertRemark: "convert_remark",
  69. CreateTime: "create_time",
  70. ModifyTime: "modify_time",
  71. }
  72. func (m *SpeechRecognition) TableName() string {
  73. return "speech_recognition"
  74. }
  75. func (m *SpeechRecognition) PrimaryId() string {
  76. return SpeechRecognitionCols.SpeechRecognitionId
  77. }
  78. func (m *SpeechRecognition) Create() (err error) {
  79. o := orm.NewOrm()
  80. id, err := o.Insert(m)
  81. if err != nil {
  82. return
  83. }
  84. m.SpeechRecognitionId = int(id)
  85. return
  86. }
  87. func (m *SpeechRecognition) CreateMulti(items []*SpeechRecognition) (err error) {
  88. if len(items) == 0 {
  89. return
  90. }
  91. o := orm.NewOrm()
  92. _, err = o.InsertMulti(len(items), items)
  93. return
  94. }
  95. func (m *SpeechRecognition) Update(cols []string) (err error) {
  96. o := orm.NewOrm()
  97. _, err = o.Update(m, cols...)
  98. return
  99. }
  100. func (m *SpeechRecognition) Del() (err error) {
  101. o := orm.NewOrm()
  102. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
  103. _, err = o.Raw(sql, m.SpeechRecognitionId).Exec()
  104. return
  105. }
  106. func (m *SpeechRecognition) MultiDel(menuIds []int) (err error) {
  107. if len(menuIds) == 0 {
  108. return
  109. }
  110. o := orm.NewOrm()
  111. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.PrimaryId(), utils.GetOrmInReplace(len(menuIds)))
  112. _, err = o.Raw(sql, menuIds).Exec()
  113. return
  114. }
  115. func (m *SpeechRecognition) GetItemById(id int) (item *SpeechRecognition, err error) {
  116. o := orm.NewOrm()
  117. sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
  118. err = o.Raw(sql, id).QueryRow(&item)
  119. return
  120. }
  121. func (m *SpeechRecognition) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *SpeechRecognition, err error) {
  122. o := orm.NewOrm()
  123. order := ``
  124. if orderRule != "" {
  125. order = ` ORDER BY ` + orderRule
  126. }
  127. sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
  128. err = o.Raw(sql, pars).QueryRow(&item)
  129. return
  130. }
  131. func (m *SpeechRecognition) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
  132. o := orm.NewOrm()
  133. sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
  134. err = o.Raw(sql, pars).QueryRow(&count)
  135. return
  136. }
  137. func (m *SpeechRecognition) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*SpeechRecognition, err error) {
  138. o := orm.NewOrm()
  139. fields := strings.Join(fieldArr, ",")
  140. if len(fieldArr) == 0 {
  141. fields = `*`
  142. }
  143. order := `ORDER BY create_time DESC`
  144. if orderRule != "" {
  145. order = ` ORDER BY ` + orderRule
  146. }
  147. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
  148. _, err = o.Raw(sql, pars).QueryRows(&items)
  149. return
  150. }
  151. func (m *SpeechRecognition) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*SpeechRecognition, err error) {
  152. o := orm.NewOrm()
  153. fields := strings.Join(fieldArr, ",")
  154. if len(fieldArr) == 0 {
  155. fields = `*`
  156. }
  157. order := `ORDER BY create_time DESC`
  158. if orderRule != "" {
  159. order = ` ORDER BY ` + orderRule
  160. }
  161. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
  162. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  163. return
  164. }
  165. // SpeechRecognitionItem 语音识别信息
  166. type SpeechRecognitionItem struct {
  167. SpeechRecognitionId int
  168. UniqueCode string `description:"唯一编码"`
  169. FileName string `description:"文件名称"`
  170. ResourceUrl string `description:"文件路径"`
  171. MenuId int `description:"目录ID"`
  172. SysUserId int `description:"创建人ID"`
  173. SysUserName string `description:"创建人姓名"`
  174. State int `description:"状态:1-待转换;2-转换完成;3-转换失败"`
  175. Abstract string `description:"摘要,取前几段内容"`
  176. Sort int `description:"目录下的排序"`
  177. ConvertRemark string `description:"转写备注-失败原因"`
  178. CreateTime string `description:"创建时间"`
  179. ModifyTime string `description:"修改时间"`
  180. }
  181. func FormatSpeechRecognition2Item(origin *SpeechRecognition) (item *SpeechRecognitionItem) {
  182. if origin == nil {
  183. return
  184. }
  185. item = new(SpeechRecognitionItem)
  186. item.SpeechRecognitionId = origin.SpeechRecognitionId
  187. item.UniqueCode = origin.UniqueCode
  188. item.FileName = origin.FileName
  189. item.ResourceUrl = origin.ResourceUrl
  190. if origin.FileState == SpeechRecognitionFileRemoveFlag {
  191. item.ResourceUrl = ""
  192. }
  193. item.MenuId = origin.MenuId
  194. item.SysUserId = origin.SysUserId
  195. item.SysUserName = origin.SysUserName
  196. item.State = origin.State
  197. item.Abstract = origin.Abstract
  198. item.Sort = origin.Sort
  199. item.ConvertRemark = origin.ConvertRemark
  200. item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
  201. item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
  202. return
  203. }
  204. // SpeechRecognitionSaveReq 保存请求体
  205. type SpeechRecognitionSaveReq struct {
  206. SpeechRecognitionId int `description:"语音识别ID"`
  207. Contents []SpeechRecognitionSaveContentReq `description:"保存内容"`
  208. }
  209. // SpeechRecognitionSaveContentReq 保存内容
  210. type SpeechRecognitionSaveContentReq struct {
  211. SpeechRecognitionContentId int `description:"语音识别内容ID"`
  212. Content string `description:"段落内容"`
  213. }
  214. // SpeechRecognitionRenameReq 重命名
  215. type SpeechRecognitionRenameReq struct {
  216. SpeechRecognitionId int `description:"语音识别ID"`
  217. FileName string `description:"文件名称"`
  218. }
  219. // SpeechRecognitionRemoveReq 删除
  220. type SpeechRecognitionRemoveReq struct {
  221. SpeechRecognitionId int `description:"语音识别ID"`
  222. }
  223. // SpeechRecognitionRemoveFileReq 删除文件
  224. type SpeechRecognitionRemoveFileReq struct {
  225. SpeechRecognitionId int `description:"语音识别ID"`
  226. }
  227. // SpeechRecognitionSaveTagReq 保存标签
  228. type SpeechRecognitionSaveTagReq struct {
  229. SpeechRecognitionId int `description:"语音识别ID"`
  230. TagIds []int `description:"标签IDs"`
  231. }
  232. // SpeechRecognitionConvertReq 批量转写
  233. type SpeechRecognitionConvertReq struct {
  234. MenuId int `description:"目录ID"`
  235. Files []SpeechRecognitionConvertFiles `description:"转写文件"`
  236. }
  237. // SpeechRecognitionConvertFiles 批量转写文件
  238. type SpeechRecognitionConvertFiles struct {
  239. FileName string `description:"文件名称"`
  240. ResourceUrl string `description:"文件地址"`
  241. }
  242. // UpdateSpeechAndApiLog 更新语音识别及API记录
  243. func UpdateSpeechAndApiLog(speechItem *SpeechRecognition, speechCols []string, apiLogItem *SpeechRecognitionApiLog, logCols []string) (err error) {
  244. if speechItem == nil || apiLogItem == nil {
  245. err = fmt.Errorf("speechItem nil or apiLogItem nil")
  246. return
  247. }
  248. o := orm.NewOrm()
  249. tx, err := o.Begin()
  250. if err != nil {
  251. return
  252. }
  253. defer func() {
  254. if err != nil {
  255. _ = tx.Rollback()
  256. } else {
  257. _ = tx.Commit()
  258. }
  259. }()
  260. _, e := tx.Update(speechItem, speechCols...)
  261. if e != nil {
  262. err = fmt.Errorf("update speech err: %s", e.Error())
  263. return
  264. }
  265. _, e = tx.Update(apiLogItem, logCols...)
  266. if e != nil {
  267. err = fmt.Errorf("update api log err: %s", e.Error())
  268. return
  269. }
  270. return
  271. }
  272. // CreateContentAndUpdateSpeechAndApiLog 新增语音识别内容并更新语音识别及API记录
  273. func CreateContentAndUpdateSpeechAndApiLog(contents []*SpeechRecognitionContent, speechItem *SpeechRecognition, speechCols []string, apiLogItem *SpeechRecognitionApiLog, logCols []string) (err error) {
  274. if speechItem == nil || apiLogItem == nil {
  275. err = fmt.Errorf("speechItem nil or apiLogItem nil")
  276. return
  277. }
  278. o := orm.NewOrm()
  279. tx, err := o.Begin()
  280. if err != nil {
  281. return
  282. }
  283. defer func() {
  284. if err != nil {
  285. _ = tx.Rollback()
  286. } else {
  287. _ = tx.Commit()
  288. }
  289. }()
  290. _, e := tx.Update(speechItem, speechCols...)
  291. if e != nil {
  292. err = fmt.Errorf("update speech err: %s", e.Error())
  293. return
  294. }
  295. _, e = tx.Update(apiLogItem, logCols...)
  296. if e != nil {
  297. err = fmt.Errorf("update api log err: %s", e.Error())
  298. return
  299. }
  300. if len(contents) > 0 {
  301. _, e = tx.InsertMulti(len(contents), contents)
  302. if e != nil {
  303. err = fmt.Errorf("insert multi contents err: %s", e.Error())
  304. return
  305. }
  306. }
  307. return
  308. }
  309. // SpeechRecognitionDetailItem 语音识别详情信息
  310. type SpeechRecognitionDetailItem struct {
  311. SpeechRecognitionId int
  312. UniqueCode string `description:"唯一编码"`
  313. FileName string `description:"文件名称"`
  314. ResourceUrl string `description:"文件路径"`
  315. MenuId int `description:"目录ID"`
  316. SysUserId int `description:"创建人ID"`
  317. SysUserName string `description:"创建人姓名"`
  318. Abstract string `description:"摘要,取前几段内容"`
  319. Sort int `description:"目录下的排序"`
  320. FileSecond int `description:"文件时长(秒)"`
  321. FileSize int `description:"文件大小(byte)"`
  322. CreateTime string `description:"创建时间"`
  323. ModifyTime string `description:"修改时间"`
  324. Contents []*SpeechRecognitionContentItem `description:"语音识别内容"`
  325. Tags []*SpeechRecognitionDetailTag `description:"标签"`
  326. }
  327. func FormatSpeechRecognition2DetailItem(origin *SpeechRecognition, contents []*SpeechRecognitionContentItem, tags []*SpeechRecognitionDetailTag) (item *SpeechRecognitionDetailItem) {
  328. if origin == nil {
  329. return
  330. }
  331. item = new(SpeechRecognitionDetailItem)
  332. item.SpeechRecognitionId = origin.SpeechRecognitionId
  333. item.UniqueCode = origin.UniqueCode
  334. item.FileName = origin.FileName
  335. item.ResourceUrl = origin.ResourceUrl
  336. if origin.FileState == SpeechRecognitionFileRemoveFlag {
  337. item.ResourceUrl = ""
  338. }
  339. item.MenuId = origin.MenuId
  340. item.SysUserId = origin.SysUserId
  341. item.SysUserName = origin.SysUserName
  342. item.Abstract = origin.Abstract
  343. item.Sort = origin.Sort
  344. item.FileSecond = origin.FileSecond
  345. item.FileSize = origin.FileSize
  346. item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
  347. item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
  348. item.Contents = contents
  349. item.Tags = tags
  350. return
  351. }
  352. // SpeechRecognitionDetailTag 语音识别详情标签
  353. type SpeechRecognitionDetailTag struct {
  354. TagId int `description:"标签ID"`
  355. TagName string `description:"标签名称"`
  356. }
  357. // GetSpeechRecognitionTagBySpeechId 获取语音识别标签
  358. func GetSpeechRecognitionTagBySpeechId(speechId int) (items []*SpeechRecognitionDetailTag, err error) {
  359. o := orm.NewOrm()
  360. sql := `SELECT a.speech_recognition_tag_id AS tag_id, a.tag_name FROM speech_recognition_tag AS a
  361. JOIN speech_recognition_tag_mapping AS b ON a.speech_recognition_tag_id = b.tag_id
  362. WHERE b.speech_recognition_id = ?`
  363. _, err = o.Raw(sql, speechId).QueryRows(&items)
  364. return
  365. }
  366. // SpeechRecognitionMappingTags 语音识别标签
  367. type SpeechRecognitionMappingTags struct {
  368. SpeechRecognitionId int `description:"语音识别ID"`
  369. TagId int `description:"标签ID"`
  370. TagName string `description:"标签名称"`
  371. }
  372. // GetSpeechRecognitionTagsBySpeechIds 根据语音识别IDs获取标签
  373. func GetSpeechRecognitionTagsBySpeechIds(speechIds []int) (items []*SpeechRecognitionMappingTags, err error) {
  374. if len(speechIds) == 0 {
  375. return
  376. }
  377. o := orm.NewOrm()
  378. sql := fmt.Sprintf(`SELECT a.speech_recognition_id, a.tag_id, b.tag_name FROM speech_recognition_tag_mapping AS a
  379. JOIN speech_recognition_tag AS b ON a.tag_id = b.speech_recognition_tag_id
  380. WHERE a.speech_recognition_id IN (%s)`, utils.GetOrmInReplace(len(speechIds)))
  381. _, err = o.Raw(sql, speechIds).QueryRows(&items)
  382. return
  383. }
  384. // SpeechRecognitionListReq 语音识别列表请求体
  385. type SpeechRecognitionListReq struct {
  386. PageSize int `form:"PageSize"`
  387. CurrentIndex int `form:"CurrentIndex"`
  388. FileName string `form:"FileName" description:"文件名称"`
  389. StartTime string `form:"StartTime" description:"开始时间"`
  390. EndTime string `form:"EndTime" description:"结束时间"`
  391. CreateUserId int `form:"CreateUserId" description:"创建人ID"`
  392. TagId int `form:"TagId" description:"标签ID"`
  393. MenuId int `form:"FormId" description:"目录ID"`
  394. }
  395. // SpeechRecognitionListResp 语音识别列表响应体
  396. type SpeechRecognitionListResp struct {
  397. List []*SpeechRecognitionDetailItem
  398. Paging *paging.PagingItem `description:"分页数据"`
  399. }
  400. // SpeechRecognitionContentExportReq 导出内容
  401. type SpeechRecognitionContentExportReq struct {
  402. SpeechRecognitionId int `description:"语音识别ID"`
  403. ExportType int `description:"导出类型:1-txt;2-doc;3-pdf"`
  404. Timestamp bool `description:"是否显示时间戳"`
  405. }
  406. // UpdateSortByMenuId 根据分类ID更新排序
  407. func (m *SpeechRecognition) UpdateSortByMenuId(menuId, nowSort int, prevSpeechId int, updateSort string) (err error) {
  408. o := orm.NewOrm()
  409. sql := fmt.Sprintf(`UPDATE %s SET %s = %s WHERE %s = ? `, m.TableName(), SpeechRecognitionCols.Sort, updateSort, SpeechRecognitionCols.MenuId)
  410. if prevSpeechId > 0 {
  411. sql += fmt.Sprintf(` AND (%s > ? OR (%s > %d AND %s = %d))`, SpeechRecognitionCols.Sort, SpeechRecognitionCols.SpeechRecognitionId, prevSpeechId, SpeechRecognitionCols.Sort, nowSort)
  412. } else {
  413. sql += fmt.Sprintf(` AND %s > ?`, SpeechRecognitionCols.Sort)
  414. }
  415. _, err = o.Raw(sql, menuId, nowSort).Exec()
  416. return
  417. }
  418. // GetMaxSortByMenuId 获取分类下最大Sort
  419. func (m *SpeechRecognition) GetMaxSortByMenuId(menuId int) (sort int, err error) {
  420. o := orm.NewOrm()
  421. sql := fmt.Sprintf(`SELECT MAX(sort) AS sort FROM %s WHERE %s = ?`, m.TableName(), SpeechRecognitionCols.MenuId)
  422. err = o.Raw(sql, menuId).QueryRow(&sort)
  423. return
  424. }
  425. // GetFirstByMenuId 获取目录下排序第一的数据
  426. func (m *SpeechRecognition) GetFirstByMenuId(menuId int) (item *SpeechRecognition, err error) {
  427. o := orm.NewOrm()
  428. sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? ORDER BY %s ASC, %s ASC LIMIT 1`, m.TableName(), SpeechRecognitionCols.MenuId, SpeechRecognitionCols.Sort, SpeechRecognitionCols.SpeechRecognitionId)
  429. err = o.Raw(sql, menuId).QueryRow(&item)
  430. return
  431. }