Files
hyprvoice/README.md
T
2025-08-08 00:07:38 +02:00

136 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)
```bash
# 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 → `wtype``ydotool` |
| **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. `toggle`**recording**
2. First frame sent → **transcribing**
3. Cloud ASR returns **final****injecting**
4. Paste once → **idle**
5. Notifications at each transition
---
## Build from source
```bash
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](LICENSE.md)