Bläddra i källkod

新增mp3格式文件转码转文字

dxc 1 år sedan
förälder
incheckning
da1ff25863

+ 2 - 1
internal/logic/transcodercallbacklogic.go

@@ -32,7 +32,7 @@ func (l *TranscoderCallbackLogic) TranscoderCallback(req *types.CallbackRequest)
 		return
 	}
 	//校验req.Path是否符合url的正则格式
-	var urlRegexp = regexp.MustCompile(`^(?:(http|https|ftp):\/\/)?((|[\w-]+\.)+[a-z0-9]+)(?:(\/[^/?#]+)*)?(\?[^#]+)?(#.+)?$`)
+	var urlRegexp = regexp.MustCompile(`^(?:(http|https|ftp):\/\/)?((|[\w-]+\.)*[a-z0-9]+(:\d+)?)(?:(\/[^/?#]+)*)?(\?[^#]+)?(#.+)?$`)
 	if !urlRegexp.MatchString(req.Path) || !urlRegexp.MatchString(req.CallbackUrl) {
 		err = errors.New("path or callback_url is not url")
 		return
@@ -42,5 +42,6 @@ func (l *TranscoderCallbackLogic) TranscoderCallback(req *types.CallbackRequest)
 		return
 	}
 	err = l.svcCtx.BoltSdk.Set(uuid.NewString(), string(bts))
+	resp = &types.CallbackResponse{}
 	return
 }

+ 7 - 97
internal/logic/transcoderlogic.go

@@ -1,18 +1,10 @@
 package logic
 
 import (
-	"context"
-	"errors"
-	"github.com/google/uuid"
-	"io"
-	"net/http"
-	"os"
-	"silk2audio/silk"
-	"strings"
-	"sync"
-
 	"audio_transcoder/internal/svc"
 	"audio_transcoder/internal/types"
+	"audio_transcoder/job"
+	"context"
 
 	"github.com/zeromicro/go-zero/core/logx"
 )
@@ -32,95 +24,13 @@ func NewTranscoderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Transc
 }
 
 func (l *TranscoderLogic) Transcoder(req *types.Request) (resp *types.Response, err error) {
-	if req.Path == "" {
-		err = errors.New("path is empty")
-		return
-	}
-	// 发起HTTP GET请求
-	resp1, err := http.Get(req.Path)
-	if err != nil {
-		logx.Errorf("下载文件失败 error:", err.Error())
-		return
-	}
-	defer resp1.Body.Close()
-	if resp1.StatusCode != http.StatusOK {
-		err = errors.New("download file failed")
-		logx.Errorf("下载文件失败 error:", resp1.StatusCode)
-		return
-	}
-	// 读取响应体内容
-	silkPath := uuid.NewString() + ".silk" // 本地保存的文件路径
-	silkFile, err := os.Create(silkPath)
+	transcoder, err := job.Transcoder(l.svcCtx, &types.CallbackRequest{Path: req.Path})
 	if err != nil {
-		logx.Errorf("读取silk文件失败 error:", err.Error())
-		return
-	}
-	defer func() {
-		silkFile.Close()
-		silk.FileRemove(silkPath)
-	}()
-	_, err = io.Copy(silkFile, resp1.Body)
-	if err != nil {
-		logx.Errorf("读取文件失败 error:", err.Error())
-		return
-	}
-	// 转码
-	wavPath, pcmPath := silk.TransSilkToWav(silkPath)
-	wavFile, err := os.Open(wavPath)
-	if err != nil {
-		logx.Errorf("读取wav文件失败 error:", err.Error())
-		return
-	}
-	defer func() {
-		wavFile.Close()
-		silk.FileRemove(wavPath)
-	}()
-	pcmFile, err := os.Open(pcmPath)
-	if err != nil {
-		logx.Errorf("读取pcm文件失败 error:", err.Error())
-		return
-	}
-	defer func() {
-		pcmFile.Close()
-		silk.FileRemove(pcmPath)
-	}()
-	//多线程处理上传录音和语音识别
-	var wg sync.WaitGroup
-	wg.Add(2)
-	//构建返回数据
-	resp = &types.Response{}
-	var err1, err2 error
-	//上传录音
-	go func() {
-		defer wg.Done()
-		bts, _ := io.ReadAll(wavFile)
-		url, err := l.svcCtx.QiNiuSdk.Upload(bts, int64(len(bts)), wavPath)
-		if err != nil {
-			logx.Errorf("上传七牛云失败 error:", err.Error())
-			return
-		}
-		err1 = err
-		resp.Path = url
-	}()
-	//识别录音
-	go func() {
-		defer wg.Done()
-		bts, _ := io.ReadAll(pcmFile)
-		asrResp, err := l.svcCtx.AsrSdk.Asr(bts, "pcm", 16000)
-		if err != nil {
-			logx.Errorf("语音识别失败 error:", err.Error())
-			return
-		}
-		err2 = err
-		resp.Message = strings.Join(asrResp.Result, "\n")
-	}()
-	wg.Wait()
-	//返回数据
-	if err1 != nil {
-		return nil, err1
+		return nil, err
 	}
-	if err2 != nil {
-		return nil, err2
+	resp = &types.Response{
+		Path:    transcoder.Path,
+		Message: transcoder.Message,
 	}
 	return
 }

+ 31 - 20
job/job.go

@@ -41,7 +41,7 @@ func AutoTranscoder(ctx *svc.ServiceContext) {
 			continue
 		}
 		//业务处理
-		resp, err := transcoder(ctx, &req.CallbackRequest)
+		resp, err := Transcoder(ctx, &req.CallbackRequest)
 		logx.Info("转码结果 data:", resp, err)
 		if err != nil {
 			logx.Error(err)
@@ -72,11 +72,15 @@ func AutoTranscoder(ctx *svc.ServiceContext) {
 	}
 }
 
-func transcoder(svcCtx *svc.ServiceContext, req *types.CallbackRequest) (resp *types.OriginDataResponse, err error) {
+// Transcoder 转码
+func Transcoder(svcCtx *svc.ServiceContext, req *types.CallbackRequest) (resp *types.OriginDataResponse, err error) {
 	if req.Path == "" {
 		err = StopTranscoderError
 		return
 	}
+	// 去除空格
+	req.Path = strings.TrimSpace(req.Path)
+	req.CallbackUrl = strings.TrimSpace(req.CallbackUrl)
 	resp = &types.OriginDataResponse{OriginData: req.OriginData}
 	// 发起HTTP GET请求
 	resp1, err := http.Get(req.Path)
@@ -91,39 +95,46 @@ func transcoder(svcCtx *svc.ServiceContext, req *types.CallbackRequest) (resp *t
 		return
 	}
 	// 读取响应体内容
-	silkPath := uuid.NewString() + ".silk" // 本地保存的文件路径
-	silkFile, err := os.Create(silkPath)
+	inputPath := uuid.NewString() // 本地保存的文件路径
+	inputFile, err := os.Create(inputPath)
 	if err != nil {
-		logx.Errorf("读取silk文件失败 error:", err.Error())
+		logx.Errorf("读取文件失败 error:", err.Error())
 		return
 	}
-	_, err = io.Copy(silkFile, resp1.Body)
-	silkFile.Close()
+	_, err = io.Copy(inputFile, resp1.Body)
+	inputFile.Close()
 	if err != nil {
 		logx.Errorf("读取文件失败 error:", err.Error())
 		return
 	}
-	silkFile, _ = os.Open(silkPath)
-	defer func() {
-		silkFile.Close()
-		silk.FileRemove(silkPath)
-	}()
-	//判断文件类型,如果不是语音则返回
-	var isAudio bool
+	//判断文件类型,如果不是指定语音则返回
+	inputFile, _ = os.Open(inputPath)
+	var inputType int // 1:silk 2:mp3
 	var buf = make([]byte, 10)
-	if _, err = silkFile.Read(buf); err == nil {
+	if _, err = inputFile.Read(buf); err == nil {
+		inputFile.Close()
 		if bytes.Equal(buf, []byte{2, 35, 33, 83, 73, 76, 75, 95, 86, 51}) {
-			isAudio = true
+			os.Rename(inputPath, inputPath+".silk")
+			inputType = 1
+			inputPath += ".silk"
+		} else if bytes.Equal(buf[:5], []byte{35, 33, 65, 77, 82}) {
+			os.Rename(inputPath, inputPath+".mp3")
+			inputType = 2
+			inputPath += ".mp3"
 		}
+		defer silk.FileRemove(inputPath)
 	}
-	//读取的游标回到0
-	silkFile.Seek(0, 0)
-	if !isAudio {
+	if inputType == 0 {
 		err = StopTranscoderError
 		return
 	}
 	// 转码
-	wavPath, pcmPath := silk.TransSilkToWav(silkPath)
+	var wavPath, pcmPath string
+	if inputType == 1 {
+		wavPath, pcmPath = silk.TransSilkToWav(inputPath)
+	} else if inputType == 2 {
+		wavPath, pcmPath = silk.TransMp3ToWav(inputPath)
+	}
 	wavFile, err := os.Open(wavPath)
 	if err != nil {
 		logx.Errorf("读取wav文件失败 error:", err.Error())

+ 25 - 0
pkg/silk2audio/silk/silk.go

@@ -16,6 +16,7 @@ import "C"
 import (
 	"fmt"
 	"os"
+	"os/exec"
 	"silk2audio/transcoder/ffmpeg"
 	"strings"
 	"unsafe"
@@ -37,6 +38,20 @@ func TransSilkToWav(inputPath string) (string, string) {
 	return wavPath, outputPath
 }
 
+func TransMp3ToWav(inputPath string) (string, string) {
+	var outputPath = strings.Replace(inputPath, ".mp3", ".pcm", -1)
+	var wavPath = strings.Replace(inputPath, ".mp3", ".wav", -1)
+
+	//将mp3转成pcm
+	transMp3ToAudio(inputPath, outputPath)
+	
+	//ffmpeg pcm转码音频
+	transPcmToAudio(outputPath, wavPath)
+
+	//_ = FileRemove(outputPath)
+	return wavPath, outputPath
+}
+
 func transPcmToAudio(inputPath, OutputPath string) {
 	format := "s16le"
 	overwrite := true
@@ -66,6 +81,16 @@ func transPcmToAudio(inputPath, OutputPath string) {
 	}
 }
 
+func transMp3ToAudio(inputPath, OutputPath string) {
+	cmdArgs := []string{"-i", inputPath, "-f", "s16le", "-acodec", "pcm_s16le", "-ar", "12000", "-ac", "2", OutputPath}
+	err := exec.Command("ffmpeg", cmdArgs...).Run()
+	if err != nil {
+		fmt.Println(err.Error())
+	} else {
+		fmt.Println(OutputPath)
+	}
+}
+
 func FileRemove(logFile string) error {
 	_, err := os.Stat(logFile)
 	if err == nil {

+ 30 - 0
pkg/silk2audio/silk/silk_test.go

@@ -0,0 +1,30 @@
+package silk
+
+import (
+	"fmt"
+	"io"
+	"os"
+	"testing"
+)
+
+func Test_TransMp3ToAudio(t *testing.T) {
+	transMp3ToAudio("1.mp3", "1.pcm")
+}
+
+func Test_TransMp3ToWav(t *testing.T) {
+	TransMp3ToWav("1.mp3")
+}
+
+func Test_1(t *testing.T) {
+	f1, _ := os.Open("1.mp3")
+	bytes, _ := io.ReadAll(f1)
+	fmt.Println(bytes[:10])
+
+	f2, _ := os.Open("2.mp3")
+	bytes2, _ := io.ReadAll(f2)
+	fmt.Println(bytes2[:10])
+
+	f3, _ := os.Open("3.mp3")
+	bytes3, _ := io.ReadAll(f3)
+	fmt.Println(bytes3[:10])
+}