Hyprvoice

Voicepowered typing for Wayland/Hyprland — press to toggle, speak, instant paste. Streams audio while you talk and pastes the final text the moment you toggle off → aims to be the fastest feel on Wayland.

Status: Early development (expect rough edges)


TL;DR

  • Toggle workflow (Hyprlandfriendly): press to start, press to stop.
  • Cloud streaming ASR (MVP) → single final paste into the focused window.
  • Daemon with clear states & events; desktop notifications.
  • Clipboardbased injection (save/restore) with wtype
  • Unixy pipeline (small pieces, bounded channels).

Requirements

  • Wayland + Hyprland
  • PipeWire (audio capture)
  • systemd --user (service)
  • wl-clipboard (clipboard save/restore)
  • libnotify/notify-send (optional notifications)
  • wtype or ydotool (optional text injection fallback)

Other distros may work, but Arch/Hyprland is the primary target for now.


Install (Arch / Hyprland)

# AUR
yay -S hyprvoice          # or: yay -S hyprvoice-bin

# Enable user service
systemctl --user enable --now hyprvoice.service

# Hyprland keybind (toggle)
bind = SUPER, R, exec, hyprvoice toggle

Usage

  • Press your toggle key to start; press again to stop.
  • Audio streams to the cloud ASR while you speak.
  • On stop (or VAD endpoint), Hyprvoice pastes once into the focused window.
  • Injection flow: save clipboard → copy final text → send Ctrl+V → restore clipboard.

Status

Component State Notes
Daemon (control plane) State, IPC, worker orchestration
Recording control hyprvoice toggle
Desktop notifications notify-send (logs fallback)
Audio capture 🔄 PipeWire + VAD
ASR backends 🔄 Cloud streaming now; local Whisper next
Text injection 🔄 Clipboard paste → wtypeydotool
Service management 🔄 systemd --user

Legend: done · 🔄 in progress · planned


How it works

  • Model: pipeline + central state (daemon = control plane).
  • State machine: idle → recording → transcribing → injecting → idle.
  • Rule: switch to transcribing** as soon as the first audio frame is sent** to the ASR.

ASCII diagram

          +-------------------+        Unix socket IPC        +-----------+
CLI cmd → |   Control Daemon  | <---------------------------- |  CLI/Tool |
          |-------------------|                               +-----------+
          | State: idle/rec/  |
          |  transcribing/... |  events        events
          | Event bus (chan)  | -----> [Notifications] -----> notify-send/log
          |                   |
          |  frames    finals |
          +--+-----------+----+
             |           |
      Audio  |           |  Final Text
      Frames v           v
         +--------+   +--------+      text      +-----------+
         | Audio  |-->|  ASR   | -------------->| Injection |
         | Capture|   | Stream |                |  Worker   |
         +--------+   +--------+                +-----------+
             |              ^
             +--------------+
               backpressure via bounded channels

State (daemon):
idle --toggle--> recording --first frame--> transcribing --final--> injecting --done--> idle

Data flow

  1. togglerecording
  2. First frame sent → transcribing
  3. Cloud ASR returns finalinjecting
  4. Paste once → idle
  5. Notifications at each transition

Build from source

git clone https://github.com/leonardotrapani/hyprvoice.git
cd hyprvoice
CGO_ENABLED=1 go build -o hyprvoice ./cmd/hyprvoice
go test ./...

Contributing

  • All PRs and issues welcome.

License

MIT — see LICENSE.md

S
Description
my hyprvoice fork with remote ai support
Readme
3.5 MiB
Languages
Go 99.3%
Shell 0.7%