document push-to-talk and keybinding patterns in readme and config docs

This commit is contained in:
leonardotrapani
2026-03-14 15:23:35 +01:00
parent 76f66f3996
commit 6a64ba700f
2 changed files with 78 additions and 1 deletions
+35 -1
View File
@@ -80,9 +80,11 @@ systemctl --user enable --now hyprvoice.service
3. Add a keybinding (Hyprland example): 3. Add a keybinding (Hyprland example):
```bash ```bash
bind = SUPER, R, exec, hyprvoice toggle bindr = SUPER, R, exec, hyprvoice toggle
``` ```
See [Hyprland Keybindings](#hyprland-keybindings) for push-to-talk and other patterns.
4. Test voice input: 4. Test voice input:
```bash ```bash
@@ -91,6 +93,38 @@ hyprvoice toggle
Run `hyprvoice configure` anytime for advanced settings. Run `hyprvoice configure` anytime for advanced settings.
## Hyprland Keybindings
Hyprland has two bind types that matter for voice input:
- **`bind`** — fires when the key is **pressed down**
- **`bindr`** — fires when the key is **released**
### Simple toggle (recommended default)
```bash
# ~/.config/hypr/hyprland.conf
bindr = SUPER, R, exec, hyprvoice toggle
```
Using `bindr` (release) is important: modifiers like SUPER are fully released before `hyprvoice toggle` runs, so they don't interfere with text injection. With `bind`, the modifier may still be held when text is typed, causing stuck keys or wrong characters.
### Push-to-talk (hold-to-record)
Combine both bind types to get hold-to-record behavior — press to start, release to stop:
```bash
# ~/.config/hypr/hyprland.conf
bind = SUPER, R, exec, hyprvoice toggle # key down → start recording
bindr = SUPER, R, exec, hyprvoice toggle # key up → stop and transcribe
```
This gives a walkie-talkie feel: hold the key while speaking, release when done. The daemon receives two `toggle` commands — the first starts recording, the second stops it and triggers transcription.
### Why `bindr` matters
When you press SUPER+R with a regular `bind`, the SUPER modifier is still physically held when the command fires. If hyprvoice tries to inject text while SUPER is down, the compositor interprets the injected keystrokes as SUPER+key combos — leading to stuck modifiers, missed characters, or unexpected window management actions. `bindr` waits until you lift the key, ensuring a clean keyboard state for injection.
## Commands ## Commands
### Core CLI ### Core CLI
+43
View File
@@ -21,6 +21,7 @@ Configuration is stored in `~/.config/hyprvoice/config.toml` and changes are app
## Table of Contents ## Table of Contents
- [Hyprland Keybinding Patterns](#hyprland-keybinding-patterns)
- [Unified Provider System](#unified-provider-system) - [Unified Provider System](#unified-provider-system)
- [Transcription Providers](#transcription-providers) - [Transcription Providers](#transcription-providers)
- [Cloud Providers](#cloud-providers) - [Cloud Providers](#cloud-providers)
@@ -36,6 +37,48 @@ Configuration is stored in `~/.config/hyprvoice/config.toml` and changes are app
- [Example Configurations](#example-configurations) - [Example Configurations](#example-configurations)
- [Legacy Configs](#legacy-configs) - [Legacy Configs](#legacy-configs)
## Hyprland Keybinding Patterns
Hyprvoice is triggered via Hyprland keybindings. The bind type you choose affects reliability and workflow.
### `bind` vs `bindr`
| Keyword | Fires on | Use for |
|---------|----------|---------|
| `bind` | Key **press** (down) | Starting recording |
| `bindr` | Key **release** (up) | Stopping recording / injecting text |
The critical difference: with `bindr`, modifier keys (SUPER, CTRL, etc.) are fully released before the command executes. This prevents modifiers from interfering with text injection — avoiding stuck keys, wrong characters, or accidental compositor actions.
### Simple toggle (recommended)
A single `bindr` binding toggles recording on and off:
```bash
# ~/.config/hypr/hyprland.conf
bindr = SUPER, R, exec, hyprvoice toggle
```
First release starts recording, second release stops and transcribes. This is the safest default because the keyboard is always in a clean state when text is injected.
### Push-to-talk (hold-to-record)
Pair `bind` (press) with `bindr` (release) on the same key for hold-to-record:
```bash
# ~/.config/hypr/hyprland.conf
bind = SUPER, R, exec, hyprvoice toggle # key down → start recording
bindr = SUPER, R, exec, hyprvoice toggle # key up → stop and transcribe
```
Hold the key while speaking, release when done. Both lines send `toggle` to the daemon — the first starts the pipeline, the second stops it. Because the stop fires on release, modifiers are clean for injection.
### Why modifier release matters
When SUPER+R is pressed with a regular `bind`, the SUPER key is still physically held when `hyprvoice toggle` fires. If hyprvoice then injects text (via wtype or ydotool), the compositor sees SUPER+<character> for every keystroke — triggering window management shortcuts instead of typing. Using `bindr` for the stop/inject side ensures modifiers are released first.
This is especially relevant if you use the `wtype` or `ydotool` injection backends. The `clipboard` backend is less affected since it uses paste rather than simulated keystrokes, but `bindr` is still recommended for consistency.
## Unified Provider System ## Unified Provider System
Hyprvoice uses a unified provider system where API keys are configured once and shared between transcription and LLM features: Hyprvoice uses a unified provider system where API keys are configured once and shared between transcription and LLM features: