From b20656d6c062c5d375406aa32acfe2e408f3f3dc Mon Sep 17 00:00:00 2001 From: lml Date: Fri, 20 Mar 2026 19:47:25 +0800 Subject: [PATCH] feat: implement custom segmentation for Japanese language and update default source language --- assets/sidecar/whisperx_worker.py | 26 +++++++++++++---------- lib/services/whisper/whisper_service.dart | 18 +--------------- lib/ui/home_page.dart | 4 ++-- 3 files changed, 18 insertions(+), 30 deletions(-) diff --git a/assets/sidecar/whisperx_worker.py b/assets/sidecar/whisperx_worker.py index c2d217e..d2bafcb 100644 --- a/assets/sidecar/whisperx_worker.py +++ b/assets/sidecar/whisperx_worker.py @@ -200,6 +200,10 @@ def build_segmentation_options( return options +def should_apply_custom_segmentation(language: Optional[str]) -> bool: + return language == "ja" + + def load_wav_pcm_s16le(path: str) -> np.ndarray: with wave.open(path, "rb") as wav_file: channels = wav_file.getnchannels() @@ -971,9 +975,6 @@ class WhisperXWorker: self.clear_device_resources(device="cuda") detected_language = str(result.get("language") or language or "unknown") - segmentation_options = build_segmentation_options( - detected_language, segmentation_overrides - ) normalized_segments = normalize_segments(result.get("segments")) if not no_align and normalized_segments: @@ -998,14 +999,17 @@ class WhisperXWorker: del align_model self.clear_device_resources(device="cuda") detected_language = str(aligned.get("language") or detected_language) - segmentation_options = build_segmentation_options( - detected_language, segmentation_overrides - ) - normalized_segments = normalize_transcript_segments( - aligned.get("segments"), - detected_language, - segmentation_options, - ) + if should_apply_custom_segmentation(detected_language): + segmentation_options = build_segmentation_options( + detected_language, segmentation_overrides + ) + normalized_segments = normalize_transcript_segments( + aligned.get("segments"), + detected_language, + segmentation_options, + ) + else: + normalized_segments = normalize_segments(aligned.get("segments")) emit_status(request_id, "finalizing") emit_progress(request_id, 96) diff --git a/lib/services/whisper/whisper_service.dart b/lib/services/whisper/whisper_service.dart index eebe309..e33e7d2 100644 --- a/lib/services/whisper/whisper_service.dart +++ b/lib/services/whisper/whisper_service.dart @@ -254,24 +254,8 @@ class WhisperService { 'min_split_chars': 6, 'prefer_punctuation_split': true, }; - case 'zh': - return const { - 'split_on_pause': true, - 'pause_threshold_sec': 0.6, - 'max_segment_duration_sec': 4.2, - 'max_segment_chars': 26, - 'min_split_chars': 4, - 'prefer_punctuation_split': true, - }; default: - return const { - 'split_on_pause': true, - 'pause_threshold_sec': 0.8, - 'max_segment_duration_sec': 6.0, - 'max_segment_chars': 42, - 'min_split_chars': 10, - 'prefer_punctuation_split': true, - }; + return const {}; } } diff --git a/lib/ui/home_page.dart b/lib/ui/home_page.dart index 957a4a3..7d3bd54 100644 --- a/lib/ui/home_page.dart +++ b/lib/ui/home_page.dart @@ -47,7 +47,7 @@ class HomePage extends StatefulWidget { class _HomePageState extends State { String _selectedModel = AppConstants.defaultWhisperModel; - String _sourceVideoLanguage = 'en'; + String _sourceVideoLanguage = 'ja'; String _targetLanguage = 'zh'; String _apiKey = ''; String _targetModel = 'gemini-2.5-flash-lite'; @@ -147,7 +147,7 @@ class _HomePageState extends State { providerId: _llmProvider, apiKey: _apiKey, baseUrl: _llmBaseUrl, - sourceLanguage: 'en', // dummy + sourceLanguage: 'ja', // dummy targetLanguage: 'zh', // dummy ), );