From 9f78e3b126b15a9b331c3a1a318da1ceea30114c Mon Sep 17 00:00:00 2001 From: yinbangzhong <zhongbangyin@126.com> Date: 星期一, 29 七月 2024 16:15:52 +0800 Subject: [PATCH] export --- service/process.go | 293 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 293 insertions(+), 0 deletions(-) diff --git a/service/process.go b/service/process.go index c9413c0..9b20951 100644 --- a/service/process.go +++ b/service/process.go @@ -2,11 +2,25 @@ import ( "bytes" + "context" "encoding/json" + "errors" + "fmt" + "github.com/fsnotify/fsnotify" + "gorm.io/gorm" "io" + "log" "mime/multipart" "net/http" "os" + "os/exec" + "path/filepath" + "speechAnalysis/conf" + "speechAnalysis/constvar" + "speechAnalysis/models" + "speechAnalysis/pkg/logx" + "strings" + "time" ) // Response 缁撴瀯浣撶敤浜庡瓨鍌ㄥ搷搴斾綋鐨勫唴瀹� @@ -74,3 +88,282 @@ return } + +func Process(audioId uint) (err error) { + audio, err := models.NewAudioSearch().SetID(audioId).First() + + if err != nil { + return errors.New("鏌ユ壘闊抽澶辫触") + } + + if audio.AudioStatus != constvar.AudioStatusUploadOk && audio.AudioStatus != constvar.AudioStatusFailed { + return errors.New("鐘舵�佷笉姝g‘") + } + + err = models.NewAudioSearch().SetID(audioId).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusProcessing}) + if err != nil { + return errors.New("DB閿欒") + } + + go func() { + var resp Response + sz := audio.Size / 1024 / 1024 + if sz > 2 { + resp, err = AnalysisAudio(audio.FilePath, conf.AanlysisConf.LongUrl) + } else { + resp, err = AnalysisAudio(audio.FilePath, conf.AanlysisConf.Url) + } + if err != nil { + logx.Errorf("err when AnalysisAudio:%v", err) + _ = models.NewAudioSearch().SetID(audioId).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed}) + return + } + if resp.Code != 0 { + logx.Errorf("AnalysisAudio error return:%v", resp) + _ = models.NewAudioSearch().SetID(audioId).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed}) + return + } + logx.Infof("AnalysisAudio result: %v", resp) + words := GetWordFromText(resp.Result, audio) + + err = models.WithTransaction(func(db *gorm.DB) error { + err = models.NewAudioSearch().SetOrm(db).SetID(audioId).UpdateByMap(map[string]interface{}{ + "audio_status": constvar.AudioStatusFinish, + "score": resp.Score, + "tags": strings.Join(words, ","), + }) + if err != nil { + return err + } + err = models.NewAudioTextSearch().SetOrm(db).Save(&models.AudioText{ + AudioID: audio.ID, + AudioText: resp.Result, + }) + return err + }) + if err != nil { + logx.Infof("AnalysisAudio success but update record failed: %v", err) + _ = models.NewAudioSearch().SetID(audioId).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed}) + return + } + }() + + return nil +} + +func GetWordFromText(text string, audio *models.Audio) (words []string) { + if audio == nil { + return nil + } + wordRecords, err := models.NewWordSearch().SetLocomotiveNumber(audio.LocomotiveNumber).FindNotTotal() + if err != nil || len(wordRecords) == 0 { + return nil + } + for _, v := range wordRecords { + if strings.Contains(text, v.Content) { + words = append(words, v.Content) + } + } + return words +} + +func PreLoad(cxt context.Context) { + mkdirErr := os.MkdirAll(conf.LocalConf.PreLoadPath, os.ModePerm) + if mkdirErr != nil { + logx.Errorf("function os.MkdirAll() err:%v", mkdirErr) + } + mkdirErr1 := os.MkdirAll(conf.LocalConf.StorePath, os.ModePerm) + if mkdirErr1 != nil { + logx.Errorf("function os.MkdirAll() err:%v", mkdirErr1) + } + //鏂囦欢澶逛笅鏂板闊抽鏂囦欢鏃惰Е鍙� + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + err = watcher.Add(conf.LocalConf.PreLoadPath) + if err != nil { + log.Fatal(err) + } + + audoF := func(eventName, fileName string, audio *models.Audio) bool { + time.Sleep(time.Second * 1) + //璁剧疆鏂囦欢璁块棶鏉冮檺 + err = os.Chmod(eventName, 0777) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", eventName, "璁剧疆鏂囦欢鏉冮檺澶辫触")) + } + + //鏍¢獙鏂囦欢鍛藉悕 + arr := strings.Split(fileName, "_") + if len(arr) != 6 { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏂囦欢鍚嶇О閿欒")) + return false + } + timeStr := arr[4] + strings.Split(arr[5], ".")[0] + t, err := time.ParseInLocation("20060102150405", timeStr, time.Local) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏃堕棿鏍煎紡涓嶅")) + } + + //鏌ラ噸 + _, err = models.NewAudioSearch().SetName(fileName).First() + if err != gorm.ErrRecordNotFound { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "閲嶅涓婁紶")) + return false + } + + //灏嗘枃浠剁Щ鍔ㄥ埌uploads鏂囦欢澶逛笅 + //鍒ゆ柇storePath涓湯灏炬槸鍚﹀甫 + var src string + if strings.HasSuffix(conf.LocalConf.StorePath, "/") { + src = conf.LocalConf.StorePath + fileName + } else { + src = conf.LocalConf.StorePath + "/" + fileName + } + //err = os.Rename(eventName, src) + //鍒╃敤exec鍛戒护绉诲姩鏂囦欢 + cmd := exec.Command("mv", eventName, src) + err = cmd.Run() + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s-%s", fileName, "绉诲姩鏂囦欢澶辫触", err.Error())) + return false + } + // 璇诲彇鏂囦欢澶у皬 + fileInfo, err := os.Stat(src) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鑾峰彇鏂囦欢澶у皬澶辫触")) + return false + } + size := fileInfo.Size() + fmt.Println("fileName:", fileName, "size:", size, "src1", src) + + audio.Name = fileName + audio.Size = size + audio.FilePath = src + audio.AudioStatus = constvar.AudioStatusUploadOk + audio.LocomotiveNumber = arr[0] + audio.TrainNumber = arr[1] + audio.DriverNumber = arr[2] + audio.Station = arr[3] + audio.OccurrenceAt = t + audio.IsFollowed = 0 + return true + } + + txtF := func(filePath string, audio *models.Audio) bool { + fileName := filepath.Base(filePath) + //璇诲彇filepath鏂囦欢鍐呭鍒癰ts + bts, err := os.ReadFile(filePath) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", filePath, "璇诲彇txt鏂囦欢澶辫触")) + return false + } + //瑙f瀽 浜よ矾鍙�:123_鍏噷鏍�:321 + fileds := string(bts) + arr := strings.Split(fileds, "\n") + if len(arr) != 2 { + logx.Errorf(fmt.Sprintf("%s:%s", filePath, "璇诲彇txt鏂囦欢鍐呭鏍煎紡涓嶅")) + return false + } else { + RouteNumber := strings.Split(arr[0], ":") + KilometerMarker := strings.Split(arr[1], ":") + if len(RouteNumber) > 1 && len(KilometerMarker) > 1 { + audio.RouteNumber = RouteNumber[1] + audio.KilometerMarker = KilometerMarker[1] + } else { + logx.Errorf(fmt.Sprintf("%s:%s", filePath, "鏂囦欢鍐呭鏍煎紡涓嶅")) + return false + } + } + var src string + if strings.HasSuffix(conf.LocalConf.StorePath, "/") { + src = conf.LocalConf.StorePath + fileName + } else { + src = conf.LocalConf.StorePath + "/" + fileName + } + //err = os.Rename(filePath, src) + //鍒╃敤exec鍛戒护绉诲姩鏂囦欢 + cmd := exec.Command("mv", filePath, src) + err = cmd.Run() + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "绉诲姩鏂囦欢澶辫触")) + return false + } + audio.TxtFilePath = src + return true + } + + //鎴愬鍙橀噺 + pair := make(map[string]string) +FOR: + for { + select { + case <-cxt.Done(): + fmt.Println("preload stop") + break FOR // 閫�鍑哄惊鐜� + case event, ok := <-watcher.Events: + if !ok { + continue + } + if event.Op&fsnotify.Create == fsnotify.Create { + // 鏂囦欢鍚� + fileName := filepath.Base(event.Name) + //鑾峰彇涓嶅甫鎵╁睍鍚嶇殑鏂囦欢鍚� + name := strings.TrimSuffix(fileName, filepath.Ext(fileName)) + //鍒ゆ柇鏂囦欢鍦╬air涓� + if _, ok := pair[name]; !ok { + pair[name] = event.Name + } else { + audio := &models.Audio{} + isOk := true + // 鍒ゆ柇鏂囦欢绫诲瀷鏄惁涓�.mp3鎴�.wav + if strings.ToLower(filepath.Ext(event.Name)) == ".mp3" || strings.ToLower(filepath.Ext(event.Name)) == ".wav" { + isOk = audoF(event.Name, fileName, audio) && txtF(pair[name], audio) + } + if strings.ToLower(filepath.Ext(event.Name)) == ".txt" { + isOk = audoF(pair[name], filepath.Base(pair[name]), audio) && txtF(event.Name, audio) + } + if !isOk { + delete(pair, name) + continue + } + if len(audio.Name) > 0 { + if err = models.NewAudioSearch().Create(audio); err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏁版嵁搴揷reate澶辫触")) + continue + } + go func() { + var trainInfoNames = []string{audio.LocomotiveNumber, audio.TrainNumber, audio.Station} // + var ( + info *models.TrainInfo + err error + parent models.TrainInfo + ) + for i := 0; i < 3; i++ { + name := trainInfoNames[i] + class := constvar.Class(i + 1) + info, err = models.NewTrainInfoSearch().SetName(name).SetClass(class).First() + if err == gorm.ErrRecordNotFound { + info = &models.TrainInfo{ + Name: name, + Class: class, + ParentID: parent.ID, + } + _ = models.NewTrainInfoSearch().Create(info) + } + parent = *info + } + + }() + } + } + } + case err, ok := <-watcher.Errors: + if !ok { + logx.Errorf(err.Error()) + } + } + } +} -- Gitblit v1.8.0