Local, offline voice dictation daemon for Linux — hold Space, speak, release
Project description
NovaVoice
Local, offline voice dictation for Linux. Hold Space anywhere on your desktop, speak, release — the transcribed text appears in whatever app is focused. No cloud, no GPU required.
How it works
Hold Space (> 0.5s) → microphone opens → speak → release Space → text appears
Powered by faster-whisper (CPU/int8). Works in browsers, terminals, VS Code, and any other app.
Install
Option 1 — One-line installer (recommended)
bash <(curl -fsSL https://raw.githubusercontent.com/novafabric/novavoice/main/install.sh)
Installs system dependencies, sets up auto-start on login, and guides you through the one-time setup.
Option 2 — pipx
# System dependencies
sudo apt install libportaudio2 xdotool xclip pipx
# Keyboard access (requires logout)
sudo usermod -aG input $USER
logout
# Install
pipx install novavoice
pipx ensurepath
# Auto-start on login
mkdir -p ~/.config/systemd/user
curl -fsSL https://raw.githubusercontent.com/novafabric/novavoice/main/contrib/novavoice.service \
-o ~/.config/systemd/user/novavoice.service
systemctl --user enable --now novavoice.service
Option 3 — .deb package
Download the latest .deb from Releases, then:
sudo apt install ./novavoice_*.deb
# Keyboard access (requires logout)
sudo usermod -aG input $USER
logout
# Auto-start on login
systemctl --user enable --now novavoice.service
Usage
Once running, NovaVoice works silently in the background.
| Action | Result |
|---|---|
| Hold Space (0.5s+), speak, release | Text injected into focused app |
novavoice status |
Check if daemon is running |
novavoice stop |
Stop the daemon |
novavoice start |
Start the daemon |
novavoice doctor |
Check all prerequisites |
novavoice inject "hello" |
Test injection without recording |
Configuration
Copy the example config and customize:
mkdir -p ~/.config/novavoice
cp examples/config.example.toml ~/.config/novavoice/config.toml
Key settings:
[stt]
model = "tiny.en" # faster; try "base.en" for better accuracy
[hotkey]
hold_threshold_ms = 500 # how long to hold Space before recording starts
[audio]
max_record_seconds = 90
System requirements
| Requirement | Notes |
|---|---|
| Ubuntu 22.04+ (or any Linux with systemd) | X11 or Wayland |
| Python 3.11+ | |
libportaudio2 |
sudo apt install libportaudio2 |
xdotool (X11) or ydotool/wtype (Wayland) |
For text injection |
User in input group |
sudo usermod -aG input $USER then re-login |
Run novavoice doctor to check everything at once.
Troubleshooting
evdev access fails
sudo usermod -aG input $USER
# Log out and back in (required)
Nothing happens when holding Space
novavoice status # is it running?
novavoice doctor # check all prerequisites
journalctl --user -u novavoice.service -f # view daemon logs
Poor transcription quality
Set model = "base.en" in ~/.config/novavoice/config.toml. Slower but more accurate.
Wayland injection not working
Install ydotool and ensure ydotoold is running:
sudo apt install ydotool
sudo ydotoold &
License
Apache 2.0 — see LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file novavoice-0.1.0.tar.gz.
File metadata
- Download URL: novavoice-0.1.0.tar.gz
- Upload date:
- Size: 57.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c9041141b748cf4042f075aaf1dbe2e28cae15232efdd7633881c5b646d6b8dc
|
|
| MD5 |
11d51ab2be804c07d38b84505656922c
|
|
| BLAKE2b-256 |
2f2028500cda920cb4b0a90bcacfad009454949bd1876260b51e0418907770cc
|
Provenance
The following attestation bundles were made for novavoice-0.1.0.tar.gz:
Publisher:
release.yml on novafabric/novavoice
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
novavoice-0.1.0.tar.gz -
Subject digest:
c9041141b748cf4042f075aaf1dbe2e28cae15232efdd7633881c5b646d6b8dc - Sigstore transparency entry: 1464310467
- Sigstore integration time:
-
Permalink:
novafabric/novavoice@76ebfff43a8bc00cf2b03375fb39fa10cef02858 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/novafabric
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@76ebfff43a8bc00cf2b03375fb39fa10cef02858 -
Trigger Event:
push
-
Statement type:
File details
Details for the file novavoice-0.1.0-py3-none-any.whl.
File metadata
- Download URL: novavoice-0.1.0-py3-none-any.whl
- Upload date:
- Size: 18.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52ccf30402dffa0b523044587cccd5b64ab3602a8a5391f807f6d6328927771a
|
|
| MD5 |
614ebf57008eca2cc270c7c08ae03edc
|
|
| BLAKE2b-256 |
ef0e1bed9ee2486b9d02d163c14a2d45efa0c4df44afc906f0e6a8aa7f9da5a5
|
Provenance
The following attestation bundles were made for novavoice-0.1.0-py3-none-any.whl:
Publisher:
release.yml on novafabric/novavoice
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
novavoice-0.1.0-py3-none-any.whl -
Subject digest:
52ccf30402dffa0b523044587cccd5b64ab3602a8a5391f807f6d6328927771a - Sigstore transparency entry: 1464310688
- Sigstore integration time:
-
Permalink:
novafabric/novavoice@76ebfff43a8bc00cf2b03375fb39fa10cef02858 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/novafabric
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@76ebfff43a8bc00cf2b03375fb39fa10cef02858 -
Trigger Event:
push
-
Statement type: