From e77c8b3372d48e7f3f3d94e49a49ae39bc1f8c09 Mon Sep 17 00:00:00 2001 From: Artem Akymenko Date: Sat, 18 Jul 2026 06:52:28 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20review=20cleanup=20=E2=80=94=20imports,?= =?UTF-8?q?=20=5FFakeToken,=20use=5Fspacy=5Fsegmentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move pronunciation imports from inside run() to top-level imports - Extract _FakeToken to module level (was redefined every loop iteration) - use_spacy_segmentation now mirrors PyQt logic: pass the flag, let process_subtitle_tokens filter by language internally --- abogen/pyqt/conversion.py | 10 +++++----- abogen/webui/conversion_runner.py | 19 ++++++++++++------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/abogen/pyqt/conversion.py b/abogen/pyqt/conversion.py index 75604b0..3a139c2 100644 --- a/abogen/pyqt/conversion.py +++ b/abogen/pyqt/conversion.py @@ -39,6 +39,11 @@ from abogen.domain.subtitle_generation import process_subtitle_tokens from abogen.domain.voice_loader import load_voice_cached from abogen.domain.progress import calc_etr_str from abogen.domain.normalization import prepare_text_for_tts +from abogen.domain.pronunciation import ( + compile_pronunciation_rules, + compile_heteronym_sentence_rules, + merge_pronunciation_overrides, +) from abogen.domain.metadata_extraction import ( extract_metadata_and_build_args, read_text_for_metadata, @@ -537,11 +542,6 @@ class ConversionThread(QThread): ) # --- Compile normalization rules (heteronym + pronunciation) --- - from abogen.domain.pronunciation import ( - compile_pronunciation_rules, - compile_heteronym_sentence_rules, - merge_pronunciation_overrides, - ) pronunciation_overrides = merge_pronunciation_overrides( getattr(self, "pronunciation_overrides", None), getattr(self, "manual_overrides", None), diff --git a/abogen/webui/conversion_runner.py b/abogen/webui/conversion_runner.py index 464fa2c..5fd1afc 100644 --- a/abogen/webui/conversion_runner.py +++ b/abogen/webui/conversion_runner.py @@ -135,6 +135,16 @@ SPLIT_PATTERN = r"\n+" # Kept for backward compatibility; prefer get_split_patt SAMPLE_RATE = 24000 +class _FakeToken: + """Minimal token stub for languages without per-word token support.""" + + def __init__(self, text: str, start: float, end: float): + self.text = text + self.start_ts = start + self.end_ts = end + self.whitespace = "" + + class _JobCancelled(Exception): """Raised internally to abort a conversion when the client cancels.""" @@ -534,12 +544,6 @@ def run_conversion_job(job: Job) -> None: # Fallback for languages without token support: create a single token if not tokens_list and graphemes: - class _FakeToken: - def __init__(self, text, start, end): - self.text = text - self.start_ts = start - self.end_ts = end - self.whitespace = "" tokens_list = [_FakeToken(graphemes, 0, duration)] for tok in tokens_list: @@ -555,6 +559,7 @@ def run_conversion_job(job: Job) -> None: # Flush accumulated tokens through process_subtitle_tokens if subtitle_writer and audio_sink and accumulated_tokens: + _use_spacy = job.subtitle_mode not in ("Disabled", "Line") new_entries: List[tuple] = [] process_subtitle_tokens( accumulated_tokens, @@ -562,7 +567,7 @@ def run_conversion_job(job: Job) -> None: job.max_subtitle_words, job.subtitle_mode, job.language, - use_spacy_segmentation=False, + use_spacy_segmentation=_use_spacy, fallback_end_time=current_time, ) for start, end, text in new_entries: