diff --git a/internal/pkg/ffmpeg_helper/ffmpeg_helper.go b/internal/pkg/ffmpeg_helper/ffmpeg_helper.go index 81c60d6e1..201fb8360 100644 --- a/internal/pkg/ffmpeg_helper/ffmpeg_helper.go +++ b/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) diff --git a/internal/pkg/sub_helper/dialogue_merger.go b/internal/pkg/sub_helper/dialogue_merger.go index 6d3c30339..f3a1581f2 100644 --- a/internal/pkg/sub_helper/dialogue_merger.go +++ b/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 = "" diff --git a/internal/pkg/sub_helper/sub_unit.go b/internal/pkg/sub_helper/sub_unit.go index 1b6325606..e6fda9b51 100644 --- a/internal/pkg/sub_helper/sub_unit.go +++ b/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 真实时间转偏移时间 diff --git a/internal/pkg/sub_timeline_fixer/fixer.go b/internal/pkg/sub_timeline_fixer/fixer.go index 3c3be76b0..62ad9988c 100644 --- a/internal/pkg/sub_timeline_fixer/fixer.go +++ b/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 秒