Prechádzať zdrojové kódy

对接到最新的 pipeline.go 自动校正上。

Signed-off-by: allan716 <[email protected]>
allan716 3 rokov pred
rodič
commit
6f6aed02a5

+ 31 - 84
internal/logic/sub_timeline_fixer/SubTimelineFixerHelperEx.go

@@ -2,13 +2,11 @@ package sub_timeline_fixer
 
 import (
 	"errors"
-	"fmt"
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/sub_parser/ass"
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/sub_parser/srt"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/ffmpeg_helper"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
-	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_helper"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_parser_hub"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_timeline_fixer"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/vad"
@@ -20,18 +18,20 @@ import (
 )
 
 type SubTimelineFixerHelperEx struct {
-	ffmpegHelper       *ffmpeg_helper.FFMPEGHelper
-	subParserHub       *sub_parser_hub.SubParserHub
-	timelineFixer      *sub_timeline_fixer.SubTimelineFixer
-	needDownloadFFMPeg bool
+	ffmpegHelper        *ffmpeg_helper.FFMPEGHelper
+	subParserHub        *sub_parser_hub.SubParserHub
+	timelineFixPipeLine *sub_timeline_fixer.Pipeline
+	fixerConfig         sub_timeline_fiexer.SubTimelineFixerConfig
+	needDownloadFFMPeg  bool
 }
 
 func NewSubTimelineFixerHelperEx(fixerConfig sub_timeline_fiexer.SubTimelineFixerConfig) *SubTimelineFixerHelperEx {
 	return &SubTimelineFixerHelperEx{
-		ffmpegHelper:       ffmpeg_helper.NewFFMPEGHelper(),
-		subParserHub:       sub_parser_hub.NewSubParserHub(ass.NewParser(), srt.NewParser()),
-		timelineFixer:      sub_timeline_fixer.NewSubTimelineFixer(fixerConfig),
-		needDownloadFFMPeg: false,
+		ffmpegHelper:        ffmpeg_helper.NewFFMPEGHelper(),
+		subParserHub:        sub_parser_hub.NewSubParserHub(ass.NewParser(), srt.NewParser()),
+		timelineFixPipeLine: sub_timeline_fixer.NewPipeline(sub_timeline_fixer.DefaultMaxOffsetSeconds),
+		fixerConfig:         fixerConfig,
+		needDownloadFFMPeg:  false,
 	}
 }
 
@@ -56,6 +56,7 @@ func (s SubTimelineFixerHelperEx) Process(videoFileFullPath, srcSubFPath string)
 	}
 
 	var infoSrc *subparser.FileInfo
+	var pipeResultMax sub_timeline_fixer.PipeResult
 	bProcess := false
 	offSetTime := 0.0
 	bok := false
@@ -103,7 +104,7 @@ func (s SubTimelineFixerHelperEx) Process(videoFileFullPath, srcSubFPath string)
 			log_helper.GetLogger().Warnln("Can`t find audio info, skip time fix --", videoFileFullPath)
 			return nil
 		}
-		bProcess, infoSrc, offSetTime, err = s.processByAudio(ffmpegInfo.AudioInfoList[0].FullPath, srcSubFPath)
+		bProcess, infoSrc, pipeResultMax, err = s.processByAudio(ffmpegInfo.AudioInfoList[0].FullPath, srcSubFPath)
 		if err != nil {
 			return err
 		}
@@ -122,7 +123,7 @@ func (s SubTimelineFixerHelperEx) Process(videoFileFullPath, srcSubFPath string)
 		}
 		_, index := fileSizes.Max()
 		baseSubFPath := ffmpegInfo.SubtitleInfoList[index.(int)].FullPath
-		bProcess, infoSrc, offSetTime, err = s.processBySub(baseSubFPath, srcSubFPath)
+		bProcess, infoSrc, pipeResultMax, err = s.processBySub(baseSubFPath, srcSubFPath)
 		if err != nil {
 			return err
 		}
@@ -133,7 +134,7 @@ func (s SubTimelineFixerHelperEx) Process(videoFileFullPath, srcSubFPath string)
 		log_helper.GetLogger().Infoln("Skip TimeLine Fix --", srcSubFPath)
 		return nil
 	}
-	err = s.changeTimeLineAndSave(infoSrc, offSetTime, srcSubFPath)
+	err = s.changeTimeLineAndSave(infoSrc, pipeResultMax, srcSubFPath)
 	if err != nil {
 		return err
 	}
@@ -144,51 +145,34 @@ func (s SubTimelineFixerHelperEx) Process(videoFileFullPath, srcSubFPath string)
 	return nil
 }
 
-func (s SubTimelineFixerHelperEx) processBySub(baseSubFileFPath, srcSubFileFPath string) (bool, *subparser.FileInfo, float64, error) {
+func (s SubTimelineFixerHelperEx) processBySub(baseSubFileFPath, srcSubFileFPath string) (bool, *subparser.FileInfo, sub_timeline_fixer.PipeResult, error) {
 
 	bFind, infoBase, err := s.subParserHub.DetermineFileTypeFromFile(baseSubFileFPath)
 	if err != nil {
-		return false, nil, 0, err
+		return false, nil, sub_timeline_fixer.PipeResult{}, err
 	}
 	if bFind == false {
 		log_helper.GetLogger().Warnln("processBySub.DetermineFileTypeFromFile sub not match --", baseSubFileFPath)
-		return false, nil, 0, nil
+		return false, nil, sub_timeline_fixer.PipeResult{}, nil
 	}
 	bFind, infoSrc, err := s.subParserHub.DetermineFileTypeFromFile(srcSubFileFPath)
 	if err != nil {
-		return false, nil, 0, err
+		return false, nil, sub_timeline_fixer.PipeResult{}, err
 	}
 	if bFind == false {
 		log_helper.GetLogger().Warnln("processBySub.DetermineFileTypeFromFile sub not match --", srcSubFileFPath)
-		return false, nil, 0, nil
+		return false, nil, sub_timeline_fixer.PipeResult{}, nil
 	}
 	// ---------------------------------------------------------------------------------------
-	baseUnitNew, err := sub_helper.GetVADInfoFeatureFromSubNew(infoBase, s.timelineFixer.FixerConfig.V2_FrontAndEndPerBase)
+	pipeResult, err := s.timelineFixPipeLine.CalcOffsetTime(infoBase, infoSrc, nil, false)
 	if err != nil {
-		return false, nil, 0, err
-	}
-	srcUnitNew, err := sub_helper.GetVADInfoFeatureFromSubNew(infoSrc, s.timelineFixer.FixerConfig.V2_FrontAndEndPerSrc)
-	if err != nil {
-		return false, nil, 0, err
-	}
-	// ---------------------------------------------------------------------------------------
-	bok, _, err := s.timelineFixer.GetOffsetTimeV2(baseUnitNew, srcUnitNew, nil)
-	if err != nil {
-		return false, nil, 0, err
-	}
-	if bok == false {
-		log_helper.GetLogger().Warnln("processBySub.GetOffsetTimeV2 return false -- " + baseSubFileFPath)
-		return false, nil, 0, nil
+		return false, nil, sub_timeline_fixer.PipeResult{}, err
 	}
 
-	//if s.jugOffsetAndSD("processBySub", offsetTime, sd) == false {
-	//	return false, nil, 0, nil
-	//}
-
-	return true, infoSrc, 0, nil
+	return true, infoSrc, pipeResult, nil
 }
 
-func (s SubTimelineFixerHelperEx) processByAudio(baseAudioFileFPath, srcSubFileFPath string) (bool, *subparser.FileInfo, float64, error) {
+func (s SubTimelineFixerHelperEx) processByAudio(baseAudioFileFPath, srcSubFileFPath string) (bool, *subparser.FileInfo, sub_timeline_fixer.PipeResult, error) {
 
 	audioVADInfos, err := vad.GetVADInfoFromAudio(vad.AudioInfo{
 		FileFullPath: baseAudioFileFPath,
@@ -196,64 +180,27 @@ func (s SubTimelineFixerHelperEx) processByAudio(baseAudioFileFPath, srcSubFileF
 		BitDepth:     16,
 	}, true)
 	if err != nil {
-		return false, nil, 0, err
+		return false, nil, sub_timeline_fixer.PipeResult{}, err
 	}
 
 	bFind, infoSrc, err := s.subParserHub.DetermineFileTypeFromFile(srcSubFileFPath)
 	if err != nil {
-		return false, nil, 0, err
+		return false, nil, sub_timeline_fixer.PipeResult{}, err
 	}
 	if bFind == false {
 		log_helper.GetLogger().Warnln("processByAudio.DetermineFileTypeFromFile sub not match --", srcSubFileFPath)
-		return false, nil, 0, nil
-	}
-	// ---------------------------------------------------------------------------------------
-	srcUnitNew, err := sub_helper.GetVADInfoFeatureFromSubNew(infoSrc, s.timelineFixer.FixerConfig.V2_FrontAndEndPerSrc)
-	if err != nil {
-		return false, nil, 0, err
+		return false, nil, sub_timeline_fixer.PipeResult{}, nil
 	}
 	// ---------------------------------------------------------------------------------------
-	bok, _, err := s.timelineFixer.GetOffsetTimeV2(nil, srcUnitNew, audioVADInfos)
+	pipeResult, err := s.timelineFixPipeLine.CalcOffsetTime(nil, infoSrc, audioVADInfos, false)
 	if err != nil {
-		return false, nil, 0, err
-	}
-	if bok == false {
-		log_helper.GetLogger().Warnln("processByAudio.GetOffsetTimeV2 return false -- " + baseAudioFileFPath)
-		return false, nil, 0, nil
+		return false, nil, sub_timeline_fixer.PipeResult{}, err
 	}
 
-	//if s.jugOffsetAndSD("processByAudio", offsetTime, sd) == false {
-	//	return false, nil, 0, nil
-	//}
-
-	return true, infoSrc, 0, nil
-}
-
-func (s SubTimelineFixerHelperEx) jugOffsetAndSD(processName string, offsetTime, sd float64) bool {
-	// SD 要达标
-	if sd > s.timelineFixer.FixerConfig.V2_MaxStartTimeDiffSD {
-		log_helper.GetLogger().Infoln(fmt.Sprintf("Skip, %s sd: %v > %v", processName, sd, s.timelineFixer.FixerConfig.V2_MaxStartTimeDiffSD))
-		return false
-	}
-	// 时间偏移的最小值才修正
-	if offsetTime < s.timelineFixer.FixerConfig.V2_MinOffset && offsetTime > -s.timelineFixer.FixerConfig.V2_MinOffset {
-		log_helper.GetLogger().Infoln(fmt.Sprintf("Skip, %s offset: %v > -%v && %v < %v",
-			processName,
-			offsetTime, s.timelineFixer.FixerConfig.V2_MinOffset,
-			offsetTime, s.timelineFixer.FixerConfig.V2_MinOffset))
-		return false
-	}
-	// sub_timeline_fixer.calcMeanAndSD 输出的可能的极小值
-
-	if my_util.IsEqual(offsetTime, sub_timeline_fixer.MinValue) == true {
-		log_helper.GetLogger().Infoln("Skip, offsetTime == -9999")
-		return false
-	}
-
-	return true
+	return true, infoSrc, pipeResult, nil
 }
 
-func (s SubTimelineFixerHelperEx) changeTimeLineAndSave(infoSrc *subparser.FileInfo, offsetTime float64, desSubSaveFPath string) error {
+func (s SubTimelineFixerHelperEx) changeTimeLineAndSave(infoSrc *subparser.FileInfo, pipeResult sub_timeline_fixer.PipeResult, desSubSaveFPath string) error {
 	/*
 		修复的字幕先存放到缓存目录,然后需要把原有的字幕进行“备份”,改名,然后再替换过来
 	*/
@@ -264,7 +211,7 @@ func (s SubTimelineFixerHelperEx) changeTimeLineAndSave(infoSrc *subparser.FileI
 			return err
 		}
 	}
-	_, err := s.timelineFixer.FixSubTimelineOneOffsetTime(infoSrc, offsetTime, subFileName)
+	_, err := s.timelineFixPipeLine.FixSubFileTimeline(infoSrc, pipeResult.ScaledFileInfo, pipeResult.GetOffsetTime(), desSubSaveFPath)
 	if err != nil {
 		return err
 	}

+ 13 - 12
internal/pkg/sub_timeline_fixer/pipeline.go

@@ -27,7 +27,7 @@ func NewPipeline(maxOffsetSeconds int) *Pipeline {
 	}
 }
 
-func (p Pipeline) FixTimeline(infoBase, infoSrc *subparser.FileInfo, audioVadList []vad.VADInfo, useGSS bool, desSaveSubFileFullPath string) (PipeResult, string, error) {
+func (p Pipeline) CalcOffsetTime(infoBase, infoSrc *subparser.FileInfo, audioVadList []vad.VADInfo, useGSS bool) (PipeResult, error) {
 
 	baseVADInfo := make([]float64, 0)
 	useSubtitleOrAudioAsBase := false
@@ -43,11 +43,11 @@ func (p Pipeline) FixTimeline(infoBase, infoSrc *subparser.FileInfo, audioVadLis
 		// 解析处 VAD 信息
 		baseUnitNew, err := sub_helper.GetVADInfoFeatureFromSubNew(infoBase, 0)
 		if err != nil {
-			return PipeResult{}, "", err
+			return PipeResult{}, err
 		}
 		baseVADInfo = baseUnitNew.GetVADFloatSlice()
 	} else {
-		return PipeResult{}, "", errors.New("FixTimeline input is error")
+		return PipeResult{}, errors.New("FixTimeline input is error")
 	}
 
 	pipeResults := make([]PipeResult, 0)
@@ -106,7 +106,7 @@ func (p Pipeline) FixTimeline(infoBase, infoSrc *subparser.FileInfo, audioVadLis
 		// 3. speech_extract	从字幕转换为 VAD 的语音检测信息
 		tmpSrcInfoUnit, err := sub_helper.GetVADInfoFeatureFromSubNew(tmpInfoSrc, 0)
 		if err != nil {
-			return PipeResult{}, "", err
+			return PipeResult{}, err
 		}
 		bestOffset, score := fffAligner.Fit(baseVADInfo, tmpSrcInfoUnit.GetVADFloatSlice())
 		pipeResult := PipeResult{
@@ -163,23 +163,19 @@ func (p Pipeline) FixTimeline(infoBase, infoSrc *subparser.FileInfo, audioVadLis
 		}
 	}
 	if len(filterPipeResults) <= 0 {
-		return PipeResult{}, "", errors.New(fmt.Sprintf("AutoFixTimeline failed; you can set 'MaxOffSetTime' > %d", p.MaxOffsetSeconds) +
+		return PipeResult{}, errors.New(fmt.Sprintf("AutoFixTimeline failed; you can set 'MaxOffSetTime' > %d", p.MaxOffsetSeconds) +
 			fmt.Sprintf(" Or this two subtiles are not fited to this video!"))
 	}
 	// 从得到的结果里面找到分数最高的
 	sort.Sort(PipeResults(filterPipeResults))
 	maxPipeResult := filterPipeResults[len(filterPipeResults)-1]
 
-	fixedSubContent, err := p.fixTime(infoSrc, maxPipeResult.ScaledFileInfo,
-		float64(maxPipeResult.BestOffset)/100.0,
-		desSaveSubFileFullPath)
-
-	return maxPipeResult, fixedSubContent, err
+	return maxPipeResult, nil
 }
 
-// fixTime 这里传入的 scaledInfoSrc 是从 pipeResults 筛选出来的最大分数的 FileInfo
+// FixSubFileTimeline 这里传入的 scaledInfoSrc 是从 pipeResults 筛选出来的最大分数的 FileInfo
 // infoSrc 是从源文件读取出来的,这样才能正确匹配 Content 中的时间戳
-func (p Pipeline) fixTime(infoSrc, scaledInfoSrc *subparser.FileInfo, inOffsetTime float64, desSaveSubFileFullPath string) (string, error) {
+func (p Pipeline) FixSubFileTimeline(infoSrc, scaledInfoSrc *subparser.FileInfo, inOffsetTime float64, desSaveSubFileFullPath string) (string, error) {
 
 	/*
 		从解析的实例中,正常来说是可以匹配出所有的 Dialogue 对话的 Start 和 End time 的信息
@@ -254,6 +250,11 @@ type PipeResult struct {
 	ScaledFileInfo *subparser.FileInfo
 }
 
+// GetOffsetTime 从偏移得到偏移时间
+func (p PipeResult) GetOffsetTime() float64 {
+	return float64(p.BestOffset) / 100.0
+}
+
 type PipeResults []PipeResult
 
 func (d PipeResults) Len() int {

+ 33 - 14
internal/pkg/sub_timeline_fixer/pipeline_test.go

@@ -37,29 +37,29 @@ func TestPipeline_FitGSS(t *testing.T) {
 			ffsubSyncSubFile: "C:\\Tmp\\BL - S01E03\\ffsubsync.ass",
 			srcSubFile:       "C:\\Tmp\\BL - S01E03\\org.ass",
 			srcFixedSubFile:  "C:\\Tmp\\BL - S01E03\\org-fix.ass",
-		}, want: -4.1, wantErr: false},
+		}, want: -4.290000, wantErr: false},
 		{name: "Rick and Morty - S05E01", args: args{
 			baseSubFile:      "C:\\Tmp\\Rick and Morty - S05E01\\英_2.ass",
 			ffsubSyncSubFile: "C:\\Tmp\\Rick and Morty - S05E01\\ffsubsync.ass",
 			srcSubFile:       "C:\\Tmp\\Rick and Morty - S05E01\\org.ass",
 			srcFixedSubFile:  "C:\\Tmp\\Rick and Morty - S05E01\\org-fix.ass",
-		}, want: -4.1, wantErr: false},
+		}, want: -6.170000, wantErr: false},
 		{name: "Rick and Morty - S05E10", args: args{
 			baseSubFile:      "C:\\Tmp\\Rick and Morty - S05E10\\英_2.ass",
 			ffsubSyncSubFile: "C:\\Tmp\\Rick and Morty - S05E10\\ffsubsync.ass",
 			srcSubFile:       "C:\\Tmp\\Rick and Morty - S05E10\\org.ass",
 			srcFixedSubFile:  "C:\\Tmp\\Rick and Morty - S05E10\\org-fix.ass",
-		}, want: -4.1, wantErr: false},
+		}, want: -6.020000, wantErr: false},
 		{name: "Foundation - S01E09", args: args{
 			baseSubFile:      "C:\\Tmp\\Foundation - S01E09\\英_2.ass",
 			ffsubSyncSubFile: "C:\\Tmp\\Foundation - S01E09\\ffsubsync.ass",
 			srcSubFile:       "C:\\Tmp\\Foundation - S01E09\\org.ass",
 			srcFixedSubFile:  "C:\\Tmp\\Foundation - S01E09\\org-fix.ass",
-		}, want: -4.1, wantErr: false},
-		{name: "mix", args: args{
-			baseSubFile: "C:\\Tmp\\Rick and Morty - S05E10\\英_2.ass",
-			srcSubFile:  "C:\\Tmp\\BL - S01E03\\org.ass",
-		}, want: -4.1, wantErr: false},
+		}, want: -29.890000, wantErr: false},
+		//{name: "mix", args: args{
+		//	baseSubFile: "C:\\Tmp\\Rick and Morty - S05E10\\英_2.ass",
+		//	srcSubFile:  "C:\\Tmp\\BL - S01E03\\org.ass",
+		//}, want: -4.1, wantErr: false},
 	}
 
 	for _, tt := range tests {
@@ -81,14 +81,23 @@ func TestPipeline_FitGSS(t *testing.T) {
 				t.Fatal("sub not match")
 			}
 			// ---------------------------------------------------------------------------------------
-			pipeResult, _, err := NewPipeline(DefaultMaxOffsetSeconds).FixTimeline(infoBase, infoSrc, nil, false, tt.args.srcFixedSubFile)
+			p := NewPipeline(DefaultMaxOffsetSeconds)
+			pipeResult, err := p.CalcOffsetTime(infoBase, infoSrc, nil, false)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("FitGSS() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
 
+			if pipeResult.GetOffsetTime() != tt.want {
+				t.Errorf("FitGSS() offsetTome = %v, want %v", pipeResult.GetOffsetTime(), tt.want)
+			}
+
+			_, err = p.FixSubFileTimeline(infoSrc, pipeResult.ScaledFileInfo,
+				pipeResult.GetOffsetTime(),
+				tt.args.srcFixedSubFile)
+
 			println(fmt.Sprintf("Offset: %f, Score: %f, Scale:%f",
-				float64(pipeResult.BestOffset)/100.0,
+				pipeResult.GetOffsetTime(),
 				pipeResult.Score,
 				pipeResult.ScaleFactor))
 		})
@@ -119,7 +128,7 @@ func TestPipeline_FitGSSByAudio(t *testing.T) {
 				},
 				subFilePath:     "C:\\Tmp\\Rick and Morty - S05E01\\英_2.ass",
 				srcFixedSubFile: "C:\\Tmp\\Rick and Morty - S05E01\\org-fix.ass"},
-			want: true, want1: 0,
+			want: true, want1: 0.33,
 		},
 		// Rick and Morty - S05E01
 		{name: "Rick and Morty - S05E01 -- 1",
@@ -129,7 +138,7 @@ func TestPipeline_FitGSSByAudio(t *testing.T) {
 				},
 				subFilePath:     "C:\\Tmp\\Rick and Morty - S05E01\\org.ass",
 				srcFixedSubFile: "C:\\Tmp\\Rick and Morty - S05E01\\org-fix.ass"},
-			want: true, want1: 0,
+			want: true, want1: -6.1,
 		},
 	}
 
@@ -153,13 +162,23 @@ func TestPipeline_FitGSSByAudio(t *testing.T) {
 				t.Fatal("sub not match")
 			}
 			// ---------------------------------------------------------------------------------------
-			pipeResult, _, err := NewPipeline(DefaultMaxOffsetSeconds).FixTimeline(nil, infoSrc, audioVADInfos, false, tt.args.srcFixedSubFile)
+			p := NewPipeline(DefaultMaxOffsetSeconds)
+			pipeResult, err := p.CalcOffsetTime(nil, infoSrc, audioVADInfos, false)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("FitGSS() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
+
+			if pipeResult.GetOffsetTime() != tt.want1 {
+				t.Errorf("FitGSS() offsetTome = %v, want1 %v", pipeResult.GetOffsetTime(), tt.want1)
+			}
+
+			_, err = p.FixSubFileTimeline(infoSrc, pipeResult.ScaledFileInfo,
+				pipeResult.GetOffsetTime(),
+				tt.args.srcFixedSubFile)
+
 			println(fmt.Sprintf("Offset: %f, Score: %f, Scale:%f",
-				float64(pipeResult.BestOffset)/100.0,
+				pipeResult.GetOffsetTime(),
 				pipeResult.Score,
 				pipeResult.ScaleFactor))
 		})