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
+45 -39
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))
if audio.size == 0: audio = _to_float32(getattr(segment, "audio", None))
continue if audio.size == 0:
continue
local_segments += 1
if chapter_sink: local_segments += 1
chapter_sink.write(audio) if chapter_sink:
if audio_sink: chapter_sink.write(audio)
audio_sink.write(audio) if audio_sink:
audio_sink.write(audio)
duration = len(audio) / SAMPLE_RATE
processed_chars += len(graphemes) duration = len(audio) / SAMPLE_RATE
job.processed_characters = processed_chars processed_chars += len(graphemes)
if job.total_characters: job.processed_characters = processed_chars
job.progress = min(processed_chars / job.total_characters, 0.999) if job.total_characters:
else: job.progress = min(processed_chars / job.total_characters, 0.999)
job.progress = 0.0 if processed_chars == 0 else 0.999 else:
job.progress = 0.0 if processed_chars == 0 else 0.999
preview_text = graphemes or (graphemes_raw[:80] if graphemes_raw else "[silence]")
prefix = f"{preview_prefix} · " if preview_prefix else "" preview_text = graphemes or (graphemes_raw[:80] if graphemes_raw else "[silence]")
job.add_log(f"{prefix}{processed_chars:,}/{job.total_characters or ''}: {preview_text[:80]}") prefix = f"{preview_prefix} · " if preview_prefix else ""
job.add_log(f"{prefix}{processed_chars:,}/{job.total_characters or ''}: {preview_text[:80]}")
if subtitle_writer and audio_sink and graphemes:
subtitle_writer.write_segment( if subtitle_writer and audio_sink and graphemes:
index=subtitle_index, subtitle_writer.write_segment(
text=graphemes, index=subtitle_index,
start=current_time, text=graphemes,
end=current_time + duration, start=current_time,
) end=current_time + duration,
subtitle_index += 1 )
subtitle_index += 1
if audio_sink:
current_time += duration if audio_sink:
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(