Subtitles: cap chunk duration at 2.5s, split long lines into multiple time slices for faster reels pacing
This commit is contained in:
parent
e001387a89
commit
ba787744a6
@ -39,14 +39,32 @@ def transcribe(video, lang=None, model_size="small"):
|
|||||||
sec = s % 60
|
sec = s % 60
|
||||||
return f"{h:02d}:{m:02d}:{sec:06.3f}".replace(".", ",")
|
return f"{h:02d}:{m:02d}:{sec:06.3f}".replace(".", ",")
|
||||||
|
|
||||||
# Generiramo word-level chunked podnapise: 3-5 besed naenkrat
|
# Generiramo word-level chunked podnapise: 3-4 besede naenkrat,
|
||||||
# Vse v VELIKIH TISKANIH ČRKAH za reels stil
|
# max 2.5s na chunk za hiter pacing v reels stil.
|
||||||
|
# Vse v VELIKIH TISKANIH ČRKAH.
|
||||||
|
MAX_CHUNK_DURATION = 2.5 # sekund
|
||||||
|
|
||||||
|
def write_chunk(idx, start, end, text):
|
||||||
|
# Če je chunk daljši od MAX, razdeli ga na N enakih kosov z istim tekstom
|
||||||
|
duration = end - start
|
||||||
|
if duration <= MAX_CHUNK_DURATION:
|
||||||
|
srt_path.write(f"{idx}\n{fmt_ts(start)} --> {fmt_ts(end)}\n{text}\n\n")
|
||||||
|
return idx + 1
|
||||||
|
# Razdeli na N enakih kosov
|
||||||
|
n_parts = int(duration / MAX_CHUNK_DURATION) + 1
|
||||||
|
chunk_dur = duration / n_parts
|
||||||
|
for i in range(n_parts):
|
||||||
|
chunk_start = start + i * chunk_dur
|
||||||
|
chunk_end = start + (i + 1) * chunk_dur
|
||||||
|
srt_path.write(f"{idx}\n{fmt_ts(chunk_start)} --> {fmt_ts(chunk_end)}\n{text}\n\n")
|
||||||
|
idx += 1
|
||||||
|
return idx
|
||||||
|
|
||||||
idx = 1
|
idx = 1
|
||||||
for seg in segments:
|
for seg in segments:
|
||||||
words = seg.words or []
|
words = seg.words or []
|
||||||
if not words:
|
if not words:
|
||||||
srt_path.write(f"{idx}\n{fmt_ts(seg.start)} --> {fmt_ts(seg.end)}\n{seg.text.strip().upper()}\n\n")
|
idx = write_chunk(idx, seg.start, seg.end, seg.text.strip().upper())
|
||||||
idx += 1
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Združi v skupine po ~4 besede
|
# Združi v skupine po ~4 besede
|
||||||
@ -57,15 +75,13 @@ def transcribe(video, lang=None, model_size="small"):
|
|||||||
start = group[0].start
|
start = group[0].start
|
||||||
end = group[-1].end
|
end = group[-1].end
|
||||||
text = "".join(g.word for g in group).strip().upper()
|
text = "".join(g.word for g in group).strip().upper()
|
||||||
srt_path.write(f"{idx}\n{fmt_ts(start)} --> {fmt_ts(end)}\n{text}\n\n")
|
idx = write_chunk(idx, start, end, text)
|
||||||
idx += 1
|
|
||||||
group = []
|
group = []
|
||||||
if group:
|
if group:
|
||||||
start = group[0].start
|
start = group[0].start
|
||||||
end = group[-1].end
|
end = group[-1].end
|
||||||
text = "".join(g.word for g in group).strip().upper()
|
text = "".join(g.word for g in group).strip().upper()
|
||||||
srt_path.write(f"{idx}\n{fmt_ts(start)} --> {fmt_ts(end)}\n{text}\n\n")
|
idx = write_chunk(idx, start, end, text)
|
||||||
idx += 1
|
|
||||||
|
|
||||||
srt_path.close()
|
srt_path.close()
|
||||||
print(f"📝 SRT: {srt_path.name} ({idx - 1} segmentov)")
|
print(f"📝 SRT: {srt_path.name} ({idx - 1} segmentov)")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user