Skip to content

Releases: goodroot/hyprwhspr

v1.35.0

Choose a tag to compare

@goodroot goodroot released this 05 Jul 02:56

v1.35.0

Headline feature: first-class Noctalia support. Also includes native VAD for the pywhispercpp backend, a more robust wheel pipeline, and a handful of correctness fixes.

Added

  • Noctalia (v5+) integration. (or hyprwhspr setup, which now
    Headline feature: first-class Nocnative VAD for the pywhispercppbackend, a more robust wheel pipeline, and a handful of correctness fixes.

Added

  • Noctalia (v5+) integration. hyprwhspr noctalia install (or hyprwhspr setup, which now offers it automatically when Noctalia is detected) sets up:
    • A bar widget (noctwhspr) that mirrors the Waybar module's service/recording state as a glyph — left-click records, right-click restarts.
    • Automatic mic-OSD theme sync: the recording overlay renders in your live Noctalia palette via an app-theming template, and follows theme switches live.
    • hyprwhspr noctalia status / remove round out the command, and reinstalling migrates any earlier plugin/template names automatically.
  • Opt-in native VAD for the pywhispercpp backend (pywhispercpp_use_vad, default off). Bumps pywhispercpp to 1.5.0 (whisper.cpp 1.8.4), which exposes whisper.cpp's native Silero VAD. The VAD model auto-downloads on first use; a stale pre-1.5.0 install falls back gracefully with upgrade guidance instead of erroring.

Fixed

  • Audio ducking no longer moves your speaker volume. Ducking now lowers each playing application's stream volume (PulseAudio/PipeWire sink inputs) instead of the output device's master volume — so desktop-shell volume OSDs (Noctalia, swayosd, GNOME) don't fire on every recording, and your speaker setting is never touched. Restoration is now identity-checked per stream to avoid mis-restoring an unrelated app if a sink-input index gets reused mid-recording.
  • Model lookup now respects a cservice, not just theinstaller/CLI — previously a non- the CLI could download a modelthe running service then couldn't find.
  • Model download hash validation is now keyed per model file instead of one shared key, so validation actually checks the model you just downloaded rather than whatever was downloaded last. The minimum valid-download 100MB to 20MB so model downloadtiny (~31MB quantized) stops re-downloading itself every time.

Changed

  • Wheel publishing is now automatic. CI derives the pinned pywhispercpp commit straight from the installer (no more hand-maintained SHA fallbacks to forget) and only builds when the pinned version's wheels are actually missing from wheels-v2 — closing the drift that caused two silent CUDA source-build outages this cycle.
  • Tests now fail loudly on real network access. A guard on tests/ catches any mispatched mock that would otherwise reach out to HuggingFace mid-test-run, across both direct-network and proxied environments.

Full Changelog: https://githuare/v1.34.2...v1.35.0

v1.34.2

Choose a tag to compare

@goodroot goodroot released this 01 Jul 03:21

v1.34.2

Bug-fix release hardening the Waybar tray and the mic-OSD overlay.

Fixed

  • Tray no longer flashes a false ERR under load. The Waybar module polls
    every 2s and re-derived system health via timeout-guarded probes, so a single
    slow tick — common while transcribing — could be misread as a mic/service
    fault. Three changes close this:

    • The probe helper now uses a non-login shell (a login shell re-sourced
      /etc/profile + ~/.bash_profile on every call, adding ~100–250ms) and a
      wider timeout, so load jitter can't expire an otherwise-fast probe.
    • Backend availability checks (onnx-asr, faster-whisper) use
      importlib.util.find_spec instead of a full import (~18ms vs ~250–490ms
      under load).
    • Error states are now debounced: a fault must persist across consecutive
      polls before the tray shows ERR. Recovery and click-action feedback stay
      immediate.
    • Thanks to @Sandruin for the detailed report and measurements.
  • Mic-OSD overlay now works on Debian/Ubuntu. The gtk4-layer-shell
    LD_PRELOAD search missed Debian's multiarch library path
    (/usr/lib/x86_64-linux-gnu/, etc.), so the overlay silently fell back to
    notifications even when layer-shell was installed and supported. The search
    now matches any multiarch triplet. Verified on Linux Mint 22 / KWin.
    Thanks to @mitchell-wallace (#199, follow-up to #145 .

pywhispercpp wheels (v2 pipeline)

Pre-release

Choose a tag to compare

@goodroot goodroot released this 04 Jul 16:10

Rolling storage for prebuilt CUDA wheels, consumed by the installer (WHEEL_BASE_URL).

v1.34.1

Choose a tag to compare

@goodroot goodroot released this 24 Jun 18:12

1.34.1

What's Changed

  • Reworked the pywhispercpp wheel pipeline for pywhispercpp 1.4.1.

    • CUDA wheels now use the new wheels-v2 release path.
    • CUDA 12 installs use a single cuda12 wheel variant.
    • CPU installs now rely on PyPI's manylinux CPU wheels instead of self-hosted CPU wheels.
    • CI now verifies that produced wheel filenames match what the installer will request.
  • Improved default local Whisper performance.

    • threads now defaults to min(8, CPU count) instead of a fixed 4.
    • Added a default word override for hyper whisper -> hyprwhspr.

Full Changelog: v1.34.0...v1.34.1

v1.34.0

Choose a tag to compare

@goodroot goodroot released this 24 Jun 03:44

1.34.0

Highlights

  • Added an opt-in GNOME Shell waveform OSD extension for GNOME/Mutter users - thanks @ninyawee!
  • Added per-application paste rules, including custom paste chords and app-level injection disable.
{
    "applications": {
        "emacs": { "auto_paste": "ctrl+y" },  // custom paste chord
        "some-app": { "auto_paste": false }    // disable: nothing pasted, clipboard untouched
    }
}

Find your active window class easily with:

sleep 3; hyprwhspr config focused-window   # then click into the app you want
  • Improved paste injection reliability across GNOME, non-QWERTY layouts, custom chords, and misconfigured paste settings.
  • Fixed native audio sample-rate handling for capture and realtime streaming backends.
  • Refreshed README, configuration docs, and homepage copy for current features.

Fixed

  • Capture streams now use the resolved input device’s native sample rate instead of assuming 16 kHz.
  • Realtime clients now track the actual capture input rate and resample to provider-required rates when needed.
  • Local transcription paths that require 16 kHz audio now resample from the native capture rate.
  • ONNX-ASR receives the actual sample rate for recognition.
  • Paste injection now skips expensive focused-window lookup when explicit paste settings make the result unused.
  • Invalid or unusable configured paste chords now warn clearly instead of failing silently.
  • App-specific disabled injection now leaves the target app untouched and avoids writing dictated text to the clipboard.
  • GNOME AT-SPI window detection is isolated in a child process and negative-cached when unavailable.
  • GNOME accessibility setup now reports when the gsettings change cannot be applied automatically.

PRs

  • feat(contrib): GNOME Shell waveform OSD (fills the mic-osd gap on Mutter) by @ninyawee in #193

Full Changelog: v1.33.0...v1.34.0

v1.33.0

Choose a tag to compare

@goodroot goodroot released this 22 Jun 22:45

v1.33.0

Added

  • Added keyboard_hotplug, enabled by default, so keyboards connected after startup can be attached automatically without restarting the service.
  • Added support for using PulseAudio/PipeWire source names from pactl list short sources in audio_device_id and audio_device_name.

Fixed

  • Fixed audio device selection when configs use PulseAudio/PipeWire source names instead of PortAudio device indexes.
  • Fixed paste injection on GNOME with non-Latin keyboard layouts such as Thai, Russian, Arabic, Greek, and Hebrew by temporarily switching to a Latin input source for the paste chord.
  • Fixed keyboard hotplug behavior so docked, Bluetooth, and USB keyboards can work without explicitly listing every device name.
  • Fixed installs where optional visualizer GUI dependencies failed to build, especially PyGObject on Ubuntu 24.04. Core runtime dependencies now install independently of the visualizer.
  • Fixed website dependency vulnerabilities.

Changed

  • keyboard_device_names is now an optional allowlist only. Leaving it unset keeps the default behavior of attaching any valid keyboard, including hotplugged keyboards.
  • Visualizer-only Python dependencies moved into requirements-visualizer.txt and are installed best-effort.

Pull requests

  • support keyboard hotplug without listing device names by @zeldovich in #194
  • fix(install): optional visualizer deps shouldn't abort core install (PyGObject build failure on Ubuntu 24.04) by @ninyawee in #192
  • fix(paste): restore paste on non-Latin keyboard layouts (Thai, Russian, …) on GNOME by @ninyawee in #191

New Contributors

Full Changelog: v1.32.1...v1.33.0

v1.32.1

Choose a tag to compare

@goodroot goodroot released this 15 Jun 19:24

v1.32.1

Some small but crucial maintenance fixes improve startup in more conditions and prevent conditions for races to occur.

Fixed

  • Recover WAYLAND_DISPLAY at startup when systemd did not import it, by falling back to the newest wayland-* socket in XDG_RUNTIME_DIR.
  • Reattach global shortcut keyboard devices after suspend/resume, including a delayed second resync pass for devices that reappear late.
  • Clear stale held-key shortcut state during keyboard resync so combinations do not remain wedged after resume.
  • Refresh audio capture when the PulseAudio default source changes even if it maps to the same PortAudio device.
  • Fall back cleanly to the PortAudio default input when the current PulseAudio default source has no concrete PortAudio match, avoiding stale microphone bindings.
  • Improve default microphone recovery around stream-open retries and default input changes.

Documentation

  • Documented the startup WAYLAND_DISPLAY fallback and kept compositor environment export as the recommended systemd-wide fix.

v1.32.0

Choose a tag to compare

@goodroot goodroot released this 01 Jun 01:31

v 1.32.0

Thanks to @calebdw for the reports that led to a series of solid improvements.

Highlights

  • Improved microphone handling when using the system default input device.
  • Fixed ONNX-ASR VAD routing so short dictations avoid unnecessary VAD trimming.
  • Added a configurable ONNX-ASR VAD duration threshold.

Configuration

New setting:

{
  "onnx_asr_vad_min_duration": 30
}

This is the minimum recording duration, in seconds, before ONNX-ASR routes audio through Silero VAD. Set it lower to use VAD more often, or higher to keep more recordings on direct recognition.

Audio Device Management

  • hyprwhspr now re-checks the current PulseAudio/PipeWire default microphone right before opening a recording stream when no explicit audio device is configured.
  • Changing the system default microphone no longer requires restarting hyprwhspr for the next recording to use the new input.
  • Stream startup retries now refresh the default input once before retrying, helping recover from transient PulseAudio/PipeWire host errors after a device change.
  • The keepalive stream now moves to the refreshed default microphone when the default input changes.
  • Explicitly configured audio devices remain sticky. If audio_device_id or audio_device_name is configured, hyprwhspr does not silently convert the setup into "follow system default" mode after a fallback.
  • Device validation now rejects output-only devices when resolving defaults.
  • Sounddevice default input updates now preserve the output device instead of overwriting the whole default device tuple.

Hotplug Handling

  • Audio hotplug events are now queued and dispatched serially through a worker thread.
  • This keeps callback ordering predictable during noisy USB plug/unplug sequences.
  • Device monitor startup failure now cleans up observer and worker state more completely.
  • Device monitor shutdown now stops the dispatch worker cleanly.

ONNX-ASR / Parakeet

  • ONNX-ASR now keeps the direct model and VAD-wrapped model separate.
  • Short recordings use direct recognition by default, avoiding aggressive speech-boundary trimming on normal dictation.
  • Long recordings still use Silero VAD when onnx_asr_use_vad is enabled.
  • Added onnx_asr_vad_min_duration, defaulting to 30 seconds, to control when ONNX-ASR switches from direct recognition to VAD-assisted recognition.
  • Invalid VAD duration values fall back to 30 seconds, and negative values clamp to 0.
  • Model unload now clears the cached ONNX-ASR VAD model as well as the direct model.

v1.31.0

Choose a tag to compare

@goodroot goodroot released this 28 May 00:34

1.31.0

Thanks to community member @sqonde for a PR which greatly improves base GNOME/Mutter support. Cheers!

Also many other fixes and QoL improvements.

Added

  • Added legacy setup default handling so pywhispercpp maps to Whisper CPU instead of Parakeet.
  • Added Mutter detection for GNOME/Mutter Wayland injection behavior.
  • Added short TTL caching for active keyboard layout detection.
  • Added GNOME input-source parsing for active mru-sources, including non-XKB IME detection.
  • Added notification ID fallback via direct gdbus org.freedesktop.Notifications.Notify when notify-send -p is unavailable.
  • Added the same notification fallback behavior to the Hyprland tray script.
  • Added setup/runtime diagnostics for:
    • Keyboard allowlist entries that match no visible devices.
    • Layer-shell fallback on wlroots-like sessions.
    • GNOME direct typing vs. clipboard-manager behavior.
    • Retired ydotool.service migration.
  • Added Hyprland config reload after setup writes compositor bindings.
  • Added setup summary clarity when Mic-OSD is enabled but dependencies are still missing.

Fixed

  • Fixed NotificationPresenter(active_timeout_ms=0) being ignored.
  • Fixed clipboard restore fallback delay to use 5.0s, matching config defaults.
  • Fixed notification presenter imports in the Mic-OSD daemon path.
  • Fixed Mic-OSD startup failures leaving users with no recording indicator by falling back to desktop notifications.
  • Fixed backend reinstall logic so missing installed_backend no longer forces reinstall when requirements and imports are valid.
  • Fixed setup printing Configuration loaded from ... twice.
  • Fixed Hyprland bindings setup to use the configured install root instead of hardcoded /usr/lib/hyprwhspr.
  • Fixed local setup behavior so Hyprland OSD/binding changes take effect immediately after setup where possible.

New Contributors

Full Changelog: v1.30.1...v1.31.0

v1.30.1

Choose a tag to compare

@goodroot goodroot released this 24 May 22:17

v1.30.1

Fixed

  • Added wl-clipboard as a required Arch/AUR dependency.

    • hyprwhspr relies on wl-copy / wl-paste for clipboard-based injection and clipboard restoration.
    • This fixes fresh Arch installs where dictation completed but paste injection failed until users manually installed wl- clipboard.
  • wl-clipboard is now a required package within the AUR instead of optional

Thanks to #178 @sp3nx0r and #179 @madebymlai for the reports 🙏