AliJabbarpour commited on
Commit
1619f99
·
verified ·
1 Parent(s): 766dfb7

Update pipeline/postprocess.py

Browse files
Files changed (1) hide show
  1. pipeline/postprocess.py +18 -22
pipeline/postprocess.py CHANGED
@@ -1,9 +1,10 @@
1
- # ─── Post-Processing Engine v4 ─────────────────────────────────────────────────
2
 
3
- MIN_DISPLAY = 2.5 # حداقل زمان نمایش هر subtitle (ثانیه)
4
- MAX_DISPLAY = 7.0 # حداکثر زمان نمایش
5
- MAX_CHARS = 42 # حداکثر کاراکتر برای merge
6
- MAX_GAP = 1.5 # حداکثر فاصله بین دو segment برای merge
 
7
 
8
 
9
  def format_timestamp(seconds: float) -> str:
@@ -32,21 +33,21 @@ def merge_segments(segments: list) -> list:
32
  }
33
  continue
34
 
35
- gap = seg["start"] - current["end"]
36
- combined_text = current["text"] + " " + seg["text"].strip()
37
  combined_duration = seg["end"] - current["start"]
38
- ends_sentence = current["text"].rstrip().endswith((".", "!", "?"))
39
 
40
  should_merge = (
41
- len(combined_text.replace(" ", "")) <= MAX_CHARS
42
  and combined_duration <= MAX_DISPLAY
43
  and gap <= MAX_GAP
44
  and not ends_sentence
45
  )
46
 
47
  if should_merge:
48
- current["text"] = combined_text
49
- current["end"] = seg["end"]
50
  current["words"] += list(seg.get("words", []))
51
  else:
52
  merged.append(current)
@@ -88,25 +89,20 @@ def fix_overlaps(segments: list) -> list:
88
 
89
 
90
  def apply_min_display(segments: list) -> list:
91
- """
92
- اعمال حداقل زمان نمایش.
93
- اگه فاصله تا subtitle بعدی کافی باشه، end رو افزایش میدیم.
94
- اگه subtitle بعدی نزدیکه، حداکثر تا ۸۰ms قبلش امتداد میدیم.
95
- """
96
  result = []
97
  for i, seg in enumerate(segments):
98
  seg = dict(seg)
99
  duration = seg["end"] - seg["start"]
100
 
101
  if duration < MIN_DISPLAY:
102
- # حداکثر تا کجا میتونیم end رو ببریم؟
103
  if i + 1 < len(segments):
104
- next_start = segments[i + 1]["start"]
105
- max_end = next_start - 0.080 # ۸۰ms قبل از subtitle بعدی
106
  else:
107
- max_end = seg["end"] + MAX_DISPLAY
108
 
109
- new_end = seg["start"] + MIN_DISPLAY
110
  seg["end"] = min(new_end, max(max_end, seg["end"]))
111
 
112
  result.append(seg)
@@ -118,7 +114,7 @@ def split_long_segment(seg: dict) -> list:
118
  words = seg.get("words", [])
119
  text = seg["text"].strip()
120
 
121
- if len(text.replace(" ", "")) <= MAX_CHARS or len(words) < 3:
122
  return [seg]
123
 
124
  # پیدا کردن بهترین نقطه split (بزرگ‌ترین gap)
 
1
+ # ─── Post-Processing Engine v5 ─────────────────────────────────────────────────
2
 
3
+ MIN_DISPLAY = 2.5 # حداقل زمان نمایش هر subtitle (ثانیه)
4
+ MAX_DISPLAY = 7.0 # حداکثر زمان نمایش
5
+ MERGE_MAX_CHARS = 72 # حداکثر کاراکتر برای merge (با فاصله)
6
+ SPLIT_MAX_CHARS = 60 # حداکثر کاراکتر قبل از split (با فاصله)
7
+ MAX_GAP = 1.5 # حداکثر فاصله بین دو segment برای merge
8
 
9
 
10
  def format_timestamp(seconds: float) -> str:
 
33
  }
34
  continue
35
 
36
+ gap = seg["start"] - current["end"]
37
+ combined_text = current["text"] + " " + seg["text"].strip()
38
  combined_duration = seg["end"] - current["start"]
39
+ ends_sentence = current["text"].rstrip().endswith((".", "!", "?"))
40
 
41
  should_merge = (
42
+ len(combined_text) <= MERGE_MAX_CHARS
43
  and combined_duration <= MAX_DISPLAY
44
  and gap <= MAX_GAP
45
  and not ends_sentence
46
  )
47
 
48
  if should_merge:
49
+ current["text"] = combined_text
50
+ current["end"] = seg["end"]
51
  current["words"] += list(seg.get("words", []))
52
  else:
53
  merged.append(current)
 
89
 
90
 
91
  def apply_min_display(segments: list) -> list:
92
+ """اعمال حداقل زمان نمایش"""
 
 
 
 
93
  result = []
94
  for i, seg in enumerate(segments):
95
  seg = dict(seg)
96
  duration = seg["end"] - seg["start"]
97
 
98
  if duration < MIN_DISPLAY:
 
99
  if i + 1 < len(segments):
100
+ next_start = segments[i + 1]["start"]
101
+ max_end = next_start - 0.080
102
  else:
103
+ max_end = seg["end"] + MAX_DISPLAY
104
 
105
+ new_end = seg["start"] + MIN_DISPLAY
106
  seg["end"] = min(new_end, max(max_end, seg["end"]))
107
 
108
  result.append(seg)
 
114
  words = seg.get("words", [])
115
  text = seg["text"].strip()
116
 
117
+ if len(text) <= SPLIT_MAX_CHARS or len(words) < 3:
118
  return [seg]
119
 
120
  # پیدا کردن بهترین نقطه split (بزرگ‌ترین gap)