Bläddra i källkod

修复 sub_unit.go 的时间轴截取问题

Signed-off-by: allan716 <[email protected]>
allan716 4 år sedan
förälder
incheckning
2975b607b1

+ 2 - 2
internal/pkg/ffmpeg_helper/ffmpeg_helper.go

@@ -175,7 +175,7 @@ func (f *FFMPEGHelper) ExportAudioAndSubArgsByTimeRange(audioFullPath, subFullPa
 }
 
 // ExportSubArgsByTimeRange 根据输入的时间轴导出字幕分段信息 "0:1:27" "28.2"
-func (f *FFMPEGHelper) ExportSubArgsByTimeRange(subFullPath string, startTimeString, timeLength string) (string, string, error) {
+func (f *FFMPEGHelper) ExportSubArgsByTimeRange(subFullPath, outName string, startTimeString, timeLength string) (string, string, error) {
 
 	outStartTimeString := strings.ReplaceAll(startTimeString, ":", "-")
 	outStartTimeString = strings.ReplaceAll(outStartTimeString, ".", "#")
@@ -184,7 +184,7 @@ func (f *FFMPEGHelper) ExportSubArgsByTimeRange(subFullPath string, startTimeStr
 
 	frontName := strings.ReplaceAll(filepath.Base(subFullPath), filepath.Ext(subFullPath), "")
 
-	outSubName := frontName + "_" + outStartTimeString + "_" + outTimeLength + common.SubExtSRT
+	outSubName := frontName + "_" + outStartTimeString + "_" + outTimeLength + "_" + outName + common.SubExtSRT
 
 	var outSubFullPath = filepath.Join(filepath.Dir(subFullPath), outSubName)
 

+ 1 - 1
internal/pkg/sub_helper/dialogue_merger.go

@@ -33,7 +33,7 @@ func (d *DialogueMerger) Add(inDialogueEx subparser.OneDialogueEx) bool {
 		if d.lastStartTime == "" {
 			return false
 		}
-		// 这里除了拼接 EnLine,还需要把 EndTime 更新
+		// 这里除了拼接 EnLine,还需要把 offsetEndTime 更新
 		d.dialogueMap[d.lastStartTime].EnLine += " " + inDialogueEx.EnLine
 		d.dialogueMap[d.lastStartTime].EndTime = inDialogueEx.EndTime
 		//d.lastStartTime = ""

+ 29 - 15
internal/pkg/sub_helper/sub_unit.go

@@ -9,12 +9,12 @@ import (
 )
 
 type SubUnit struct {
-	baseTime  time.Time // 这个是基础的时间,后续需要减去这个,不然与导出的片段字幕去对比会有一个起始时间的偏差
-	StartTime time.Time // 这个时间会减去 baseTime 再存储
-	EndTime   time.Time // 这个时间会减去 baseTime 再存储
-	VADList   []vad.VADInfo
-	subCount  int
-	firstAdd  bool
+	baseTime        time.Time // 这个是基础的时间,后续需要减去这个,不然与导出的片段字幕去对比会有一个起始时间的偏差
+	offsetStartTime time.Time // 相对时间,这个时间会减去 baseTime 再存储
+	offsetEndTime   time.Time // 相对时间,这个时间会减去 baseTime 再存储
+	VADList         []vad.VADInfo
+	subCount        int
+	firstAdd        bool
 }
 
 func NewSubUnit() *SubUnit {
@@ -49,11 +49,11 @@ func (s *SubUnit) AddAndInsert(oneSubStartTime, oneSubEndTime time.Time) {
 	if s.firstAdd == false {
 		// 第一次 Add 需要给 baseTime 赋值
 		s.baseTime = oneSubStartTime
-		s.StartTime = s.RealTimeToOffsetTime(oneSubStartTime)
+		s.offsetStartTime = s.RealTimeToOffsetTime(oneSubStartTime)
 		s.firstAdd = true
 	}
 
-	s.EndTime = oneSubEndTime.Add(-my_util.Time2Duration(s.baseTime))
+	s.offsetEndTime = oneSubEndTime.Add(-my_util.Time2Duration(s.baseTime))
 
 	nowStartTime := s.RealTimeToOffsetTime(oneSubStartTime)
 	nowEndTime := s.RealTimeToOffsetTime(oneSubEndTime)
@@ -78,19 +78,30 @@ func (s SubUnit) GetDialogueCount() int {
 
 // GetStartTimeNumber 获取这个单元的起始时间,单位是秒
 func (s SubUnit) GetStartTimeNumber(realOrOffsetTime bool) float64 {
+	return my_util.Time2SecendNumber(s.GetStartTime(realOrOffsetTime))
+}
+
+// GetStartTime 获取这个单元的起始时间
+func (s SubUnit) GetStartTime(realOrOffsetTime bool) time.Time {
 	if realOrOffsetTime == true {
-		return my_util.Time2SecendNumber(s.StartTime.Add(my_util.Time2Duration(s.baseTime)))
+		return s.offsetStartTime.Add(my_util.Time2Duration(s.baseTime))
 	} else {
-		return my_util.Time2SecendNumber(s.StartTime)
+		return s.offsetStartTime
 	}
 }
 
 // GetEndTimeNumber 获取这个单元的结束时间,单位是秒
 func (s SubUnit) GetEndTimeNumber(realOrOffsetTime bool) float64 {
+
+	return my_util.Time2SecendNumber(s.GetEndTime(realOrOffsetTime))
+}
+
+// GetEndTime 获取这个单元的起始时间
+func (s SubUnit) GetEndTime(realOrOffsetTime bool) time.Time {
 	if realOrOffsetTime == true {
-		return my_util.Time2SecendNumber(s.EndTime.Add(my_util.Time2Duration(s.baseTime)))
+		return s.offsetEndTime.Add(my_util.Time2Duration(s.baseTime))
 	} else {
-		return my_util.Time2SecendNumber(s.EndTime)
+		return s.offsetEndTime
 	}
 }
 
@@ -99,6 +110,7 @@ func (s SubUnit) GetTimelineRange() float64 {
 	return s.GetEndTimeNumber(false) - s.GetStartTimeNumber(false)
 }
 
+// GetOffsetTimeNumber 偏移时间,单位是秒
 func (s SubUnit) GetOffsetTimeNumber() float64 {
 	return my_util.Time2SecendNumber(s.baseTime)
 }
@@ -107,14 +119,16 @@ func (s SubUnit) GetOffsetTimeNumber() float64 {
 func (s SubUnit) GetFFMPEGCutRange(expandTimeRange float64) (string, string) {
 
 	var tmpStartTime time.Time
-	if s.GetStartTimeNumber(true)-expandTimeRange*60 < 0 {
+	if s.GetStartTimeNumber(true)-expandTimeRange < 0 {
 		tmpStartTime = time.Time{}
 	} else {
-		tmpStartTime = s.StartTime.Add(time.Duration(expandTimeRange) * time.Minute).Add(my_util.Time2Duration(s.baseTime))
+		startTime := s.GetStartTime(true)
+		subTime := time.Duration(expandTimeRange) * time.Second
+		tmpStartTime = startTime.Add(-subTime)
 	}
 
 	return fmt.Sprintf("%d:%d:%d.%d", tmpStartTime.Hour(), tmpStartTime.Minute(), tmpStartTime.Second(), tmpStartTime.Nanosecond()/1000/1000),
-		fmt.Sprintf("%f", s.GetTimelineRange()+expandTimeRange*60.0)
+		fmt.Sprintf("%f", s.GetTimelineRange()+expandTimeRange)
 }
 
 // RealTimeToOffsetTime 真实时间转偏移时间

+ 18 - 11
internal/pkg/sub_timeline_fixer/fixer.go

@@ -208,8 +208,8 @@ func (s *SubTimelineFixer) GetOffsetTimeV1(infoBase, infoSrc *subparser.FileInfo
 
 		//println(fmt.Sprintf("Similarity: %f Base[%d] %s-%s '%s' <--> Src[%d] %s-%s '%s'",
 		//	highestSimilarity,
-		//	baseIndex, infoBase.DialoguesEx[baseIndex].StartTime, infoBase.DialoguesEx[baseIndex].EndTime, baseCorpus[baseIndex],
-		//	srcIndex, srcOneDialogueEx.StartTime, srcOneDialogueEx.EndTime, srcOneDialogueEx.EnLine))
+		//	baseIndex, infoBase.DialoguesEx[baseIndex].relativelyStartTime, infoBase.DialoguesEx[baseIndex].relativelyEndTime, baseCorpus[baseIndex],
+		//	srcIndex, srcOneDialogueEx.relativelyStartTime, srcOneDialogueEx.relativelyEndTime, srcOneDialogueEx.EnLine))
 
 		srcIndex++
 	}
@@ -269,8 +269,8 @@ func (s *SubTimelineFixer) GetOffsetTimeV1(infoBase, infoSrc *subparser.FileInfo
 			debugInfos = append(debugInfos, "StartDiffTime: "+fmt.Sprintf("%f", TimeDiffStart.Seconds()))
 			//println(fmt.Sprintf("Diff Start-End: %s - %s Base[%d] %s-%s '%s' <--> Src[%d] %s-%s '%s'",
 			//	TimeDiffStart, TimeDiffEnd,
-			//	tmpBaseIndex, infoBase.DialoguesEx[tmpBaseIndex].StartTime, infoBase.DialoguesEx[tmpBaseIndex].EndTime, infoBase.DialoguesEx[tmpBaseIndex].EnLine,
-			//	tmpSrcIndex, infoSrc.DialoguesEx[tmpSrcIndex].StartTime, infoSrc.DialoguesEx[tmpSrcIndex].EndTime, infoSrc.DialoguesEx[tmpSrcIndex].EnLine))
+			//	tmpBaseIndex, infoBase.DialoguesEx[tmpBaseIndex].relativelyStartTime, infoBase.DialoguesEx[tmpBaseIndex].relativelyEndTime, infoBase.DialoguesEx[tmpBaseIndex].EnLine,
+			//	tmpSrcIndex, infoSrc.DialoguesEx[tmpSrcIndex].relativelyStartTime, infoSrc.DialoguesEx[tmpSrcIndex].relativelyEndTime, infoSrc.DialoguesEx[tmpSrcIndex].EnLine))
 		}
 		debugInfos = append(debugInfos, "---------------------------------------------")
 		//println("---------------------------------------------")
@@ -377,9 +377,16 @@ func (s *SubTimelineFixer) GetOffsetTimeV2(infoBase, infoSrc *subparser.FileInfo
 
 		startTimeString, subLength := srcSubUnit.GetFFMPEGCutRange(ExpandTimeRange)
 		// 导出当前的字幕文件适合与匹配的范围的临时字幕文件
-		nowTmpSubBaseFPath, errString, err := s.ffmpegHelper.ExportSubArgsByTimeRange(infoBase.FileFullPath, startTimeString, subLength)
+		nowTmpSubBaseFPath, errString, err := s.ffmpegHelper.ExportSubArgsByTimeRange(infoBase.FileFullPath, "base", startTimeString, subLength)
 		if err != nil {
-			log_helper.GetLogger().Errorln("ExportSubArgsByTimeRange", errString, err)
+			log_helper.GetLogger().Errorln("ExportSubArgsByTimeRange base", errString, err)
+			return false, 0, 0, err
+		}
+		// 导出当前的字幕文件适合与匹配的范围的临时字幕文件
+		startTimeString, subLength = srcSubUnit.GetFFMPEGCutRange(0)
+		_, errString, err = s.ffmpegHelper.ExportSubArgsByTimeRange(infoSrc.FileFullPath, "src", startTimeString, subLength)
+		if err != nil {
+			log_helper.GetLogger().Errorln("ExportSubArgsByTimeRange src", errString, err)
 			return false, 0, 0, err
 		}
 
@@ -425,11 +432,11 @@ func (s *SubTimelineFixer) GetOffsetTimeV2(infoBase, infoSrc *subparser.FileInfo
 		// base
 		for _, vadInfo := range nowTmpBaseSubVADList.VADList {
 			nowBaseSubTimeLineData = append(nowBaseSubTimeLineData, opts.LineData{Value: vadInfo.Active})
-			baseTime := srcSubUnit.GetOffsetTimeNumber()
+			//baseTime := srcSubUnit.GetOffsetTimeNumber()
 			nowVADInfoTimeNumber := vadInfo.Time.Seconds()
 			//println(fmt.Sprintf("%d - %f", index, nowVADInfoTimeNumber-baseTime))
-			nowOffsetTime := nowVADInfoTimeNumber - baseTime
-			nowBaseSubXAxis = append(nowBaseSubXAxis, fmt.Sprintf("%f", nowOffsetTime))
+			//nowOffsetTime := nowVADInfoTimeNumber// - baseTime
+			nowBaseSubXAxis = append(nowBaseSubXAxis, fmt.Sprintf("%f", nowVADInfoTimeNumber))
 		}
 
 		baseSubVADStaticLineFullPath := filepath.Join(outDir, outBaseNameWithOutExt+"_sub_base.html")
@@ -557,5 +564,5 @@ func (s *SubTimelineFixer) GetOffsetTimeV3(audioInfo vad.AudioInfo, infoSrc *sub
 
 const FixMask = "-fix"
 const FrontAndEndPer = 0.10 // 前百分之 15 和后百分之 15 都不进行识别
-const SubUnitMaxCount = 10  // 一个 Sub单元有五句对白
-const ExpandTimeRange = 0.7 // 从字幕的时间轴片段需要向前和向后多匹配一部分的音频,这里定义的就是这个 range 以分钟为单位, 正负 1 分钟
+const SubUnitMaxCount = 50  // 一个 Sub单元有五句对白
+const ExpandTimeRange = 50  // 从字幕的时间轴片段需要向前和向后多匹配一部分的音频,这里定义的就是这个 range 以分钟为单位, 正负 60 秒