diff --git a/linux/CHANGELOG.md b/linux/CHANGELOG.md index 6120019..ac070e3 100644 --- a/linux/CHANGELOG.md +++ b/linux/CHANGELOG.md @@ -9,6 +9,17 @@ The version is defined in [`blitztext/__init__.py`](blitztext/__init__.py). ## [Unreleased] +## [2.03.19] - 2026-06-10 + +### Added +- **Wakeword engine checkboxes in benchmark.** A row of checkboxes above the + "Run wakeword benchmark" button lets you pick which engines to include. + All are checked by default. +- **Wakeword model selector in benchmark.** A "Wakeword" combo lets you + override which wakeword phrase (model) to test. Leave empty for the default + (each engine uses its own configured model). Pick a specific model (e.g. + `okay_computer`) to test that phrase on every selected engine. + ## [2.03.18] - 2026-06-10 ### Fixed diff --git a/linux/blitztext/__init__.py b/linux/blitztext/__init__.py index d9f0c6d..7b00dd3 100644 --- a/linux/blitztext/__init__.py +++ b/linux/blitztext/__init__.py @@ -6,4 +6,4 @@ counterpart to the macOS Blitztext menu bar app: it runs natively on the host (not in a container) so it can type into any application via xdotool. """ -__version__ = "2.03.18" +__version__ = "2.03.19" diff --git a/linux/blitztext/gtksettings.py b/linux/blitztext/gtksettings.py index c220017..26ddd47 100644 --- a/linux/blitztext/gtksettings.py +++ b/linux/blitztext/gtksettings.py @@ -2387,6 +2387,33 @@ notebook.bt-nb tab:checked label { connect_box.pack_start(self.wwb_test_lbl, False, False, 0) _labeled(page, "", connect_box) + # ---- Wakeword engine checkboxes ---- + _section_title(page, "Engines to test", margin_top=10, + icon="audio-input-microphone-symbolic") + self._wwb_checks: dict[str, Gtk.CheckButton] = {} + eng_row = Gtk.Box(spacing=16) + eng_row.set_margin_bottom(4) + for e in self.cfg.wakeword_engines: + cb = Gtk.CheckButton(label=e.name) + cb.set_active(True) + self._wwb_checks[e.name] = cb + eng_row.pack_start(cb, False, False, 0) + if not self.cfg.wakeword_engines: + eng_row.pack_start(Gtk.Label(label="(no wakeword engines configured — add one in the Input tab)"), + False, False, 0) + page.pack_start(eng_row, False, False, 0) + + # ---- Wakeword model selector ---- + all_ww_models = list(dict.fromkeys( + e.model for e in self.cfg.wakeword_engines if e.model)) + self.wwb_wakeword = _model_combo("auto — each engine's own model") + self.wwb_wakeword.set_models(all_ww_models) + _labeled(page, "Wakeword", self.wwb_wakeword, + tooltip="Which wakeword model to test. Leave empty to use each engine's own " + "configured model. Select a specific model to override all engines " + "and test that phrase (e.g. okay_computer on all servers).") + + # ---- Samples + run ---- adj = Gtk.Adjustment(value=12, lower=1, upper=200, step_increment=1, page_increment=10) self.wwb_count = Gtk.SpinButton(adjustment=adj, climb_rate=1, digits=0) self.wwb_count.set_halign(Gtk.Align.START); self.wwb_count.set_size_request(90, -1) @@ -2589,6 +2616,23 @@ notebook.bt-nb tab:checked label { if not voices: self._error("Add at least one voice (or press Connect to fetch them).") return + + # Filter engines by checkboxes + checks = getattr(self, "_wwb_checks", {}) + engines = [e for e in self.cfg.wakeword_engines + if not checks or checks.get(e.name, Gtk.CheckButton(active=True)).get_active()] + if not engines: + self._error("Select at least one wakeword engine to benchmark.") + return + + # Override wakeword model if the user picked a specific one + ww_override = self.wwb_wakeword.get_text().strip() if hasattr(self, "wwb_wakeword") else "" + if ww_override: + import copy as _copy + engines = [_copy.copy(e) for e in engines] + for e in engines: + e.model = ww_override + self.wwb_summary.set_markup("Synthesizing and streaming… this talks to your TTS " "and wyoming-openwakeword servers.") @@ -2597,7 +2641,7 @@ notebook.bt-nb tab:checked label { GLib.idle_add(self._wwbench_progress, ei, n_eng, eng_name, ui, total, u) try: runs = wakeword_bench.run( - self.cfg.wakeword_engines, + engines, tts_url=url, tts_api_key_env=key, tts_model=model, voices=voices, language=self.cfg.language, count=count, progress=prog) except Exception as exc: # noqa: BLE001 - surface setup errors