Skip to content

Commit

Permalink
修复 sub_unit.go 的时间轴截取问题
Browse files Browse the repository at this point in the history
Signed-off-by: allan716 <525223688@qq.com>
  • Loading branch information
allanpk716 committed Nov 8, 2021
1 parent b2ec5a0 commit 2975b60
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 29 deletions.
4 changes: 2 additions & 2 deletions internal/pkg/ffmpeg_helper/ffmpeg_helper.go
Expand Up @@ -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, ".", "#")
Expand All @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/pkg/sub_helper/dialogue_merger.go
Expand Up @@ -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 = ""
Expand Down
44 changes: 29 additions & 15 deletions internal/pkg/sub_helper/sub_unit.go
Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
Expand All @@ -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
}
}

Expand All @@ -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)
}
Expand All @@ -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 真实时间转偏移时间
Expand Down
29 changes: 18 additions & 11 deletions internal/pkg/sub_timeline_fixer/fixer.go
Expand Up @@ -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++
}
Expand Down Expand Up @@ -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("---------------------------------------------")
Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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 秒

0 comments on commit 2975b60

Please sign in to comment.