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