Skip to main content

Local, offline voice dictation for Linux, macOS, and Windows — hold a key, speak, release

Project description

NovaVoice

Local, offline voice dictation for Linux, macOS, and Windows. Hold a key, speak, release — the transcribed text appears in whatever app is focused. No cloud, no GPU.

Tests PyPI Apache 2.0

Hold the dictation key (>0.5s) → speak → release → text appears

Powered by faster-whisper (CPU/int8). Works in browsers, terminals, IDEs, chat apps — anywhere the OS lets keystrokes reach the focused window.


Supported platforms

OS Hotkey default Install Status
Linux Space apt / snap / PPA / pipx / .deb / installer Stable
macOS Right Option .dmg (Homebrew Cask coming) Developer preview (unsigned)
Windows Right Ctrl .exe installer (winget coming) Developer preview (unsigned)

Why Right Ctrl on Windows, not Right Alt? On many international layouts Right Alt acts as AltGr — used to type @, , {}, [], \, ~, etc. Hijacking it would break normal typing. Right Ctrl is rarely used for typing, so it's the safer default. Every platform's hotkey is configurable in config.toml.


Quick install

One-line install on every major OS:

# macOS  — via Homebrew tap
brew tap novafabric/novavoice && brew install --cask novavoice

# Windows  — via winget (pending PR review at microsoft/winget-pkgs#371427)
winget install NovaFabric.NovaVoice

# Linux  — via the apt repo
bash <(curl -fsSL https://raw.githubusercontent.com/novafabric/novavoice/main/install.sh)

# Cross-platform fallback — pip
pipx install novavoice

After install:

OS What's left
macOS Right-click → Open the first time (unsigned dev preview); grant Accessibility + Microphone when prompted; hold Right Option to dictate.
Windows If SmartScreen warns, click More info → Run anyway (unsigned dev preview); hold Right Ctrl to dictate.
Linux sudo usermod -aG input "$USER" then re-login; systemctl --user enable --now novavoice.service; hold Space to dictate.

Full per-OS guides: docs/macos-install.md, docs/windows-install.md. Status of every distribution channel lives in docs/distribution-status.md.

Other channels

If a one-liner above doesn't fit your environment, pick from the platform sections below.

macOS — alternatives

# Direct .dmg download (no Homebrew needed)
# https://github.com/novafabric/novavoice/releases/latest
# Open the .dmg, drag NovaVoice.app into /Applications, right-click → Open the first time.

Windows — alternatives

# Direct .exe download
# https://github.com/novafabric/novavoice/releases/latest
# Click "More info → Run anyway" if SmartScreen warns.

Linux — alternatives

# APT repo (Debian/Ubuntu)
curl -fsSL https://novafabric.github.io/novavoice/apt/KEY.gpg \
  | sudo gpg --dearmor --yes -o /usr/share/keyrings/novavoice.gpg
echo "deb [signed-by=/usr/share/keyrings/novavoice.gpg] https://novafabric.github.io/novavoice/apt ./" \
  | sudo tee /etc/apt/sources.list.d/novavoice.list
sudo apt update && sudo apt install novavoice

# Launchpad PPA (Ubuntu)
sudo add-apt-repository ppa:novafabric/novavoice
sudo apt update && sudo apt install novavoice

# Snap (works on most distros after `snapd` is installed)
sudo snap install novavoice --classic

# AUR (Arch / Manjaro / EndeavourOS)
yay -S novavoice          # any AUR helper

# .deb download
# https://github.com/novafabric/novavoice/releases/latest
sudo apt install ./novavoice_*.deb

# pipx (any Linux)
sudo apt install libportaudio2 xdotool xclip pipx
pipx install novavoice

Usage

NovaVoice runs silently in the background. The same CLI works on every platform.

Command What it does
Hold the hotkey, speak, release Transcribe and inject text into focused app
novavoice status Daemon state, model, hotkey, backend, uptime
novavoice start / stop Manage the daemon
novavoice doctor Per-platform prerequisite check
novavoice inject "hello" Type text without recording (debug)

On macOS and Windows the NovaVoice tray icon changes color to reflect state (idle / recording / transcribing / error).


Configuration

config.toml lives in the platform's standard config dir:

OS Path
Linux ~/.config/novavoice/config.toml
macOS ~/Library/Application Support/novavoice/config.toml
Windows %APPDATA%\novavoice\config.toml
[stt]
model = "tiny.en"   # tiny.en (fast) | base.en (more accurate, slower)

[hotkey]
# "auto" → Space (Linux) / right_option (macOS) / right_ctrl (Windows).
# Or pick: "right_ctrl", "right_alt", "right_option", "right_shift",
#          "left_ctrl", "left_alt", "left_option", "space", ...
key = "auto"
hold_threshold_ms = 500

[audio]
sample_rate = 16000
max_record_seconds = 90

[tray]
enabled = "auto"   # default true on macOS/Windows, false on Linux v0

[general]
log_level = "INFO"

How it works

┌──────────────┐   ┌──────────────┐   ┌──────────────────┐   ┌─────────────────┐
│ Hotkey hook  │──▶│ Audio (16kHz │──▶│ faster-whisper   │──▶│ Text injector   │
│ (per-OS API) │   │  via         │   │ (CPU / int8)     │   │ (per-OS API)    │
│              │   │  PortAudio)  │   │                  │   │                 │
└──────────────┘   └──────────────┘   └──────────────────┘   └─────────────────┘
       │                                                              ▲
       └─────────── daemon process ──────────────────────────────────┘
                          ▲
              JSON-RPC over Unix socket / named pipe
                          │
                ┌─────────┴─────────┐
                │     CLI / tray    │
                └───────────────────┘

Every platform-specific surface (keyboard hook, text injection, autostart, IPC, paths, permissions, tray) lives behind a single Protocol-based abstraction in src/novavoice/platform/. Adding a fifth platform is a matter of writing one more sub-package.


Build from source

git clone https://github.com/novafabric/novavoice
cd novavoice
uv sync
uv run pytest tests/ -v

Platform-specific installers:

# macOS — produces dist/NovaVoice-<v>.dmg
./scripts/build-macos.sh

# Windows — produces dist/NovaVoice-<v>-windows-x64.exe
./scripts/build-windows.ps1

# Linux .deb
./scripts/build-deb.sh

CI builds the unsigned .dmg and .exe on every PR that touches the relevant code paths.


Troubleshooting

  • novavoice doctor — first stop. Tells you what's missing on the current OS.
  • macOS: see docs/macos-install.md for Gatekeeper / Accessibility / Microphone.
  • Windows: see docs/windows-install.md for SmartScreen / antivirus / privacy.
  • Linux: confirm you're in the input group; check journalctl --user -u novavoice.service -f.

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

novavoice-0.2.4.tar.gz (137.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

novavoice-0.2.4-py3-none-any.whl (62.2 kB view details)

Uploaded Python 3

File details

Details for the file novavoice-0.2.4.tar.gz.

File metadata

  • Download URL: novavoice-0.2.4.tar.gz
  • Upload date:
  • Size: 137.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for novavoice-0.2.4.tar.gz
Algorithm Hash digest
SHA256 7e0f6cdb5273228da6ac2acda28176576b9289ca8e3b5fb7b388ce19f4dfc13b
MD5 ed04ecbe7e5cd6e068f8e2b9e09269dd
BLAKE2b-256 6da6aef14a79ddd461fb3ddf1171fa6b84b2da12fe03e45238b7e46d01d687b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for novavoice-0.2.4.tar.gz:

Publisher: release.yml on novafabric/novavoice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file novavoice-0.2.4-py3-none-any.whl.

File metadata

  • Download URL: novavoice-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 62.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for novavoice-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 c16c7bd7afd26a32b24f3b7280be9a6b094b04d5d7f0e5576e41e7ff802668fa
MD5 c9e80fb3bfb3e318fe93dc2005cb8d6f
BLAKE2b-256 9e2169ea9cbdedea47bf966ad1b2d05e80eac2df87cb795c1d37cdd8513bc649

See more details on using hashes here.

Provenance

The following attestation bundles were made for novavoice-0.2.4-py3-none-any.whl:

Publisher: release.yml on novafabric/novavoice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page