diff --git a/meet/gui.py b/meet/gui.py index b9acdf2..733b3f0 100644 --- a/meet/gui.py +++ b/meet/gui.py @@ -514,6 +514,41 @@ def _on_mlx_model_changed(entry): grid.attach(_label("MLX model:"), 0, 2, 1, 1) grid.attach(self._mlx_model_entry, 1, 2, 1, 1) + # Language --------------------------------------------------------- + # Whisper auto-detect on sparse / quiet audio (long silences, short + # opening utterances) is unreliable and can mis-classify English as + # ja/zh, producing pages of CJK hallucinations. Letting the user + # set the meeting language up-front avoids that failure mode. + # The list mirrors the alignment-models registry plus a few common + # Whisper-supported languages. + language_values = [ + "auto", + "en", + "de", + "fr", + "es", + "tr", + "fa", + "it", + "pt", + "nl", + "ja", + "zh", + "ko", + "ar", + "ru", + ] + current_language = self._transcribe_kwargs.get("language", "auto") + self._language_combo = _combo(language_values, current_language) + self._language_combo.connect( + "changed", + lambda c: self._transcribe_kwargs.__setitem__( + "language", c.get_active_text() or "auto" + ), + ) + grid.attach(_label("Language:"), 0, 3, 1, 1) + grid.attach(self._language_combo, 1, 3, 1, 1) + expander.add(grid) parent_vbox.pack_start(expander, False, False, 0) diff --git a/tests/test_gui.py b/tests/test_gui.py index 1fbe070..f73b13d 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -98,3 +98,37 @@ def show_all(self): assert tk["device"] is None assert tk["torch_device"] is None assert tk["mlx_model"] is None + # Language defaults to "auto" so Whisper auto-detects. Users can override + # via --language on the CLI or the GUI Advanced panel dropdown. + assert tk["language"] == "auto" + + +def test_launch_passes_explicit_language(monkeypatch): + """``launch(language='en')`` must thread into transcribe_kwargs so the + GUI Advanced panel dropdown can override Whisper's auto-detect.""" + import meet.gui as gui_mod + + captured: dict = {} + + class _StubWindow: + _rec_btn_box = type("_X", (), {"hide": lambda self: None})() + _alignment_box = type("_X", (), {"hide": lambda self: None})() + _label_box = type("_X", (), {"hide": lambda self: None})() + _sync_box = type("_X", (), {"hide": lambda self: None})() + _progress_bar = type("_X", (), {"hide": lambda self: None})() + _open_transcript_btn = type("_X", (), {"hide": lambda self: None})() + _open_folder_btn = type("_X", (), {"hide": lambda self: None})() + _bg_label = type("_X", (), {"hide": lambda self: None})() + + def __init__(self, capture_kwargs, transcribe_kwargs, **kwargs): + captured["transcribe_kwargs"] = transcribe_kwargs + + def show_all(self): + pass + + monkeypatch.setattr(gui_mod, "MeetRecorderWindow", _StubWindow) + monkeypatch.setattr(gui_mod.Gtk, "main", lambda: None) + + gui_mod.launch(language="en") + + assert captured["transcribe_kwargs"]["language"] == "en"