pipeline.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package sub_timeline_fixer
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/internal/pkg/gss"
  4. "github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
  5. )
  6. type Pipeline struct {
  7. framerateRatios []float64
  8. }
  9. func NewPipeline() *Pipeline {
  10. return &Pipeline{
  11. framerateRatios: make([]float64, 0),
  12. }
  13. }
  14. func (p Pipeline) Fit_gss(infoBase, infoSrc subparser.FileInfo) error {
  15. /*
  16. ffsubsync 的 pipeline 有这三个步骤
  17. 1. parse 解析字幕
  18. 2. scale 根据帧数比率调整时间轴
  19. 3. speech_extract 从字幕转换为 VAD 的语音检测信息
  20. */
  21. opt_func := func(framerateRatio float64) float64 {
  22. nowInfoSrc := infoSrc
  23. err := nowInfoSrc.ChangeDialoguesFilterExTimeByFramerateRatio(framerateRatio)
  24. if err != nil {
  25. // 还原
  26. println("ChangeDialoguesFilterExTimeByFramerateRatio", err)
  27. nowInfoSrc = infoSrc
  28. }
  29. // 然后进行 base 与 src 匹配计算,将每一次变动 framerateRatio 计算得到的 偏移值和分数进行记录
  30. }
  31. gss.Gss(opt_func, MIN_FRAMERATE_RATIO, MAX_FRAMERATE_RATIO, 1e-4, nil)
  32. }
  33. func (p *Pipeline) getFramerateRatios2Try() []float64 {
  34. if len(p.framerateRatios) > 0 {
  35. return p.framerateRatios
  36. }
  37. p.framerateRatios = append(p.framerateRatios, FRAMERATE_RATIOS...)
  38. for i := 0; i < len(FRAMERATE_RATIOS); i++ {
  39. p.framerateRatios = append(p.framerateRatios, 1.0/FRAMERATE_RATIOS[i])
  40. }
  41. return p.framerateRatios
  42. }
  43. var FRAMERATE_RATIOS = []float64{24. / 23.976, 25. / 23.976, 25. / 24.}
  44. const MIN_FRAMERATE_RATIO = 0.9
  45. const MAX_FRAMERATE_RATIO = 1.1