Compare commits

...
2 Commits
Author SHA1 Message Date
Artem AkymenkoandGitHub f1cc6deae8 Merge pull request #164 from yashupadhyayy1/main
Refactor segment processing with overflow error handling
2026-07-09 19:25:23 +03:00
YashandGitHub da68f38b9b Refactor segment processing with overflow error handling
fix: catch OverflowError in emit_text for very large numbers

Fixes #145

When text contains a very large number (e.g. a long decimal from a binary
hash), misaki's pipeline calls num2words() which raises OverflowError and
crashes the entire job. Wrap the segment iterator in try/except so the
chunk is skipped gracefully with a warning log instead of terminating.
2026-05-22 10:07:38 +05:30
+38 -32
View File
@@ -1859,45 +1859,51 @@ def run_conversion_job(job: Job) -> None:
split_pattern=split_pattern, split_pattern=split_pattern,
) )
for segment in segment_iter: try:
canceller() for segment in segment_iter:
graphemes_raw = getattr(segment, "graphemes", "") or "" canceller()
graphemes = graphemes_raw.strip() graphemes_raw = getattr(segment, "graphemes", "") or ""
graphemes = graphemes_raw.strip()
audio = _to_float32(getattr(segment, "audio", None)) audio = _to_float32(getattr(segment, "audio", None))
if audio.size == 0: if audio.size == 0:
continue continue
local_segments += 1 local_segments += 1
if chapter_sink: if chapter_sink:
chapter_sink.write(audio) chapter_sink.write(audio)
if audio_sink: if audio_sink:
audio_sink.write(audio) audio_sink.write(audio)
duration = len(audio) / SAMPLE_RATE duration = len(audio) / SAMPLE_RATE
processed_chars += len(graphemes) processed_chars += len(graphemes)
job.processed_characters = processed_chars job.processed_characters = processed_chars
if job.total_characters: if job.total_characters:
job.progress = min(processed_chars / job.total_characters, 0.999) job.progress = min(processed_chars / job.total_characters, 0.999)
else: else:
job.progress = 0.0 if processed_chars == 0 else 0.999 job.progress = 0.0 if processed_chars == 0 else 0.999
preview_text = graphemes or (graphemes_raw[:80] if graphemes_raw else "[silence]") preview_text = graphemes or (graphemes_raw[:80] if graphemes_raw else "[silence]")
prefix = f"{preview_prefix} · " if preview_prefix else "" prefix = f"{preview_prefix} · " if preview_prefix else ""
job.add_log(f"{prefix}{processed_chars:,}/{job.total_characters or ''}: {preview_text[:80]}") job.add_log(f"{prefix}{processed_chars:,}/{job.total_characters or ''}: {preview_text[:80]}")
if subtitle_writer and audio_sink and graphemes: if subtitle_writer and audio_sink and graphemes:
subtitle_writer.write_segment( subtitle_writer.write_segment(
index=subtitle_index, index=subtitle_index,
text=graphemes, text=graphemes,
start=current_time, start=current_time,
end=current_time + duration, end=current_time + duration,
) )
subtitle_index += 1 subtitle_index += 1
if audio_sink: if audio_sink:
current_time += duration current_time += duration
except OverflowError as exc:
job.add_log(
f"Skipped chunk — number too large for TTS conversion: {exc}",
level="warning",
)
return local_segments return local_segments
def append_silence( def append_silence(