linux 6 min read

How I Built a Privacy-First Offline Speech-to-Text Tool That I Use Every Single Day

Introducing Vocalinux, an open-source, 100% offline voice dictation tool for Linux using Whisper or VOSK, with its architecture, features and install guide.

For years, macOS and Windows users have enjoyed built-in voice dictation. Just speak, and your words appear on screen — no cloud services, no subscriptions, just pure productivity. Linux users? We were left behind.

Until now.

I’m excited to announce Vocalinux v0.5.0-beta, a voice dictation system for Linux that’s 100% offline, privacy-first, and actually works. I’ve been using this tool daily, and it’s transformed how I interact with my computer.

Updated March 2026 — now at v0.9.0-beta.

See the latest features on GitHub!


Finally, Voice Dictation That Works on Linux!

Finally, Voice Dictation That Works on Linux!


The Problem

Voice dictation on Linux has historically been a fragmented experience:

  • Janky solutions: Some tools only work in specific apps or require complex setup
  • Cloud dependence: Many services send your voice data to servers, raising privacy concerns
  • Poor integration: Desktop shortcuts and system tray integration were often missing
  • Limited offline support: Most solutions required an active internet connection

As someone who spends hours typing every day, I wanted something better. Something that worked everywhere: terminals, browsers, IDEs, email clients, anywhere I could type, I wanted to dictate.


What Makes Vocalinux Great

1. True 100% Offline Operation

All speech recognition happens on your machine. Your voice data never leaves your computer. No cloud services, no internet required after installation, complete privacy guaranteed.

This isn’t just a privacy feature, it means Vocalinux works even when you’re offline. Perfect for coffee shops, flights, or any situation where internet connectivity is spotty.

2. Universal App Support

Vocalinux works with any text input field on your Linux system. Whether you’re typing in:

  • Terminal or shell
  • Web browsers (Chrome, Firefox)
  • IDEs and code editors (VSCode, Neovim, JetBrains)
  • Email clients
  • Office applications
  • Chat apps (Discord, Slack, Telegram)

Just double-tap Ctrl, and start dictating. The text appears exactly where you would have typed it.

3. Multiple Speech Recognition Engines

Vocalinux supports two powerful engines, each with different strengths:

Whisper AI (Default)

  • OpenAI’s state-of-the-art model
  • Highest accuracy available
  • Multiple model sizes (75MB to 3GB)
  • Excellent multi-language support (99+ languages)
  • Best for clear, accurate transcription

VOSK

  • Lightweight and fast
  • ~50MB model size
  • Low memory footprint
  • Perfect for lower-powered systems
  • Great for real-time streaming

You can switch engines on the fly via settings or command line.

4. Modern Native Linux Integration

Vocalinux isn’t just a web app wrapped in Electron. It’s built with:

  • GTK 3 for the native desktop UI
  • System tray icon for quick access
  • GNOME HIG-compliant settings dialog with modern styling
  • Native keyboard shortcuts using double-tap Ctrl (customizable)
  • X11 and Wayland support — we’ve got you covered regardless of your display server

5. Smart Installation

Installing Vocalinux is incredibly simple:

curl -fsSL raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh \
  -o /tmp/vl.sh && bash /tmp/vl.sh --interactive

That’s it.

The installer:

  • Detects your Linux distribution
  • Installs system dependencies
  • Downloads the appropriate speech recognition models
  • Sets up desktop integration
  • Adds Vocalinux to your PATH

The interactive mode even detects your GPU and suggests the optimal Whisper model size based on your hardware.


Under the Hood: Technical Architecture

Vocalinux is built with a sophisticated multi-threaded architecture that balances performance, reliability, and cross-platform compatibility.

High-Level System Design

┌──────────────────────────────────────────────────────────────────────────┐
│                          VOCALINUX APPLICATION                           │
├──────────────────────────────────────────────────────────────────────────┤
│                                                                          │
│   ┌──────────────┐          ┌──────────────────┐          ┌────────────┐ │
│   │   GTK 3 UI   │◄────────►│   Main Process   │◄────────►│   Config   │ │
│   │              │          │                  │          │   Manager  │ │
│   │ ┌──────────┐ │          │ ┌──────────────┐ │          │            │ │
│   │ │   Tray   │ │          │ │ Recog        │ │          │ ┌────────┐ │ │
│   │ │   Icon   │ │          │ │ Manager      │ │          │ │  YAML  │ │ │
│   │ └──────────┘ │          │ └──────┬───────┘ │          │ │ Config │ │ │
│   │              │          │        │         │          │ └────────┘ │ │
│   │ ┌──────────┐ │          │ ┌──────▼───────┐ │          └────────────┘ │
│   │ │ Settings │ │          │ │ Action       │ │                         │
│   │ │ Dialog   │ │          │ │ Handler      │ │                         │
│   │ └──────────┘ │          │ └──────┬───────┘ │                         │
│   │              │          │        │         │                         │
│   │ ┌──────────┐ │          │ ┌──────▼───────┐ │                         │
│   │ │  Audio   │ │          │ │ Text         │ │                         │
│   │ │ Feedback │ │          │ │ Injector     │ │                         │
│   │ └──────────┘ │          │ └──────┬───────┘ │                         │
│   └──────────────┘          │        │         │                         │
│                             │ ┌──────▼───────┐ │                         │
│                             │ │ Keyboard     │ │                         │
│                             │ │ Shortcut Mgr │ │                         │
│                             │ └──────────────┘ │                         │
│                             └────────┬─────────┘                         │
│                                      │                                   │
└──────────────────────────────────────┼───────────────────────────────────┘
                                       │
                                       ▼
                     ┌───────────────────────────────────┐
                     │       EXTERNAL DEPENDENCIES       │
                     │  - PyAudio/PortAudio (Audio)      │
                     │  - Whisper/VOSK (Speech)          │
                     │  - X11/XTest/Xdotool              │
                     │  - Wayland/wtype                  │
                     │  - evdev/pynput (Keyboard)        │
                     └───────────────────────────────────┘

Core Components

1. Recognition Manager

  • Multi-threaded audio capture (PyAudio/PortAudio)
  • Voice Activity Detection (VAD) for efficient processing
  • Dual engine support: Whisper AI (accuracy) and VOSK (speed)
  • Real-time transcription with minimal latency
  • Automatic model loading and management

2. Text Injection Layer

  • Cross-platform text injection supporting both X11 and Wayland
  • X11 Backend: Uses XTest extension for native keyboard simulation
  • Wayland Backend: Leverages wtype (Wayland native) with xdotool fallback for XWayland
  • Runtime compositor support detection
  • Focus-aware injection into active window

3. Keyboard Shortcut System

  • evdev Backend: Direct /dev/input/event* device access (works on Wayland)
  • pynput Backend: Cross-platform X11 event monitoring
  • Configurable double-tap shortcuts (default: ctrl+ctrl)
  • Time window detection (500ms configurable)
  • Automatic backend selection based on environment

4. GTK 3 Native UI

  • System tray integration with AppIndicator
  • GNOME HIG-compliant settings dialog
  • Modern, accessible interface components
  • Real-time configuration changes
  • Logging viewer for debugging

Threading Model

Main Thread (GTK Event Loop)
│
├─ Audio Capture Thread (Continuous)
│  ├─ PyAudio stream management
│  ├─ Audio buffer (FIFO queue)
│  └─ Voice Activity Detection
│
├─ Recognition Thread (On-demand)
│  ├─ Whisper/VOSK inference
│  ├─ Result post-processing
│  └─ Text injection queue
│
└─ Keyboard Monitoring Thread (Continuous)
   ├─ evdev/pynput event loop
   └─ Double-tap detection logic

This multi-threaded architecture ensures:

  • Low latency: Audio capture and recognition run in parallel
  • Responsiveness: UI never blocks on speech processing
  • Reliability: Isolated threads prevent cascading failures

Data Flow: End-to-End

User                  Keyboard                  Main                   Audio                Recognition                Text
 │                    Backend                 Process                 Capture                 Engine                 Injector
 │                       │                       │                       │                       │                       │
 │   Double-tap Ctrl     │                       │                       │                       │                       │
 │──────────────────────>│                       │                       │                       │                       │
 │                       │  Signal: Start Rec    │                       │                       │                       │
 │                       │──────────────────────>│                       │                       │                       │
 │                       │                       │                       │                       │                       │
 │                       │                       │   Play "Start" Sound  │                       │                       │
 │<──────────────────────────────────────────────│                       │                       │                       │
 │                       │                       │ Start Capture Stream  │                       │                       │
 │                       │                       │──────────────────────>│                       │                       │
 │                       │                       │                       │───┐                   │                       │
 │                       │                       │                       │   │ Read Mic          │                       │
 │                       │                       │                       │<──┘                   │                       │
 │                       │                       │                       │                       │                       │
 │                       │                       │                       │   [If Speech Detected]│                       │
 │                       │                       │                       │──────────────────────>│                       │
 │                       │                       │                       │      Audio Chunk      │                       │
 │                       │                       │                       │                       │───┐                   │
 │                       │                       │                       │                       │   │ Inference         │
 │                       │                       │                       │                       │<──┘ (Whisper/VOSK)    │
 │                       │                       │                       │                       │                       │
 │                       │                       │                       │                       │───┐                   │
 │                       │                       │                       │                       │   │ Post-process      │
 │                       │                       │                       │                       │<──┘                   │
 │                       │                       │                       │                       │                       │
 │                       │                       │   Transcribed Text    │                       │                       │
 │                       │                       │<──────────────────────────────────────────────│                       │
 │                       │                       │                       │                       │                       │
 │                       │                       │      Inject Text      │                       │                       │
 │                       │                       │──────────────────────────────────────────────────────────────────────>│
 │                       │                       │                       │                       │                       │
 │  Simulate Keystrokes  │                       │                       │                       │                       │
 │<──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
 │                       │                       │                       │                       │                       │
 │   Double-tap Ctrl     │                       │                       │                       │                       │
 │──────────────────────>│                       │                       │                       │                       │
 │                       │   Signal: Stop Rec    │                       │                       │                       │
 │                       │──────────────────────>│                       │                       │                       │
 │                       │                       │ Stop Capture Stream   │                       │                       │
 │                       │                       │──────────────────────>│                       │                       │
 │                       │                       │                       │                       │                       │
 │                       │                       │   Play "Stop" Sound   │                       │                       │
 │<──────────────────────────────────────────────│                       │                       │                       │
 │                       │                       │                       │                       │                       │

Performance Optimizations

  1. Voice Activity Detection: Only processes audio when speech is detected
  2. Model Caching: Speech recognition models loaded once at startup
  3. Buffered I/O: Efficient audio stream handling with thread-safe queues
  4. Lazy Loading: GTK components loaded only after dependency checks
  5. GPU Acceleration: Whisper supports CUDA for NVIDIA GPUs

Security & Privacy

┌─────────────────────────────────────────────────────────────┐
│                   PRIVACY ARCHITECTURE                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ✓ 100% Offline Speech Recognition                          │
│  ✓ No Cloud API Calls                                       │
│  ✓ No Telemetry/Analytics                                   │
│  ✓ Local Model Storage (~50MB to 3GB)                       │
│  ✓ No Network Access Required (post-install)                │
│  ✓ Open Source (GPL-3.0) - Full Code Transparency           │
│  ✓ User-Controlled Configuration                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

For detailed technical documentation and UML diagrams, see the full system architecture: https://github.com/jatinkrmalik/vocalinux/blob/main/README.md


v0.5.0-beta: What’s New

This release represents a massive leap forward:

➕18,252 lines of code added

➖ 4,867 lines of code removed

📂 103 files changed

🟰 Net improvement of 13,385 lines of refined code

Key Features

🎨 Modern GNOME HIG Settings Dialog: Intuitive controls, beautiful styling

🔊 Pleasant Audio Feedback: Smooth gliding tones for recording states

⌨️ Customizable Keyboard Shortcuts: Set your own activation method

🔧 Interactive Installer: Smart GPU detection and hardware optimization

🌐 Better Wayland Support: Native keyboard shortcuts via evdev

🐛 Critical Bug Fixes: Text escaping, stop sound transcription, punctuation spacing

📈 80%+ Test Coverage: Rock-solid reliability

The New Settings Dialog

The settings dialog has been completely redesigned following GNOME Human Interface Guidelines:

  • Clear, organized sections for all configuration options
  • Real-time preview of settings
  • Apply/Cancel for safe configuration changes
  • Recognition progress indicator
  • Responsive design that works across different screen sizes

Why Open Source?

Vocalinux is released under GPL-3.0. Why?

  1. Transparency: You can see exactly what the code does
  2. Privacy: No hidden telemetry or data collection
  3. Community: Anyone can contribute, fork, or improve the project
  4. Sustainability: Open source projects don’t disappear when companies lose interest

I believe voice dictation should be a fundamental tool available to everyone, not a feature locked behind expensive software subscriptions.


The Numbers Don’t Lie

This isn’t vaporware. Here’s the current state of the project:

  • 4,867 lines of code removed (we clean up after ourselves)
  • 80%+ test coverage across core functionality
  • Support for 99+ languages (via Whisper)
  • Works on major distros: Ubuntu, Fedora, Arch, Debian, and more

The project has attracted contributions from multiple developers, including community members fixing bugs and improving Debian compatibility.


I Need Your Help

Beta testing is crucial for making Vocalinux robust across different Linux distributions and desktop environments. I’d love for you to:

  1. Try it on your distro: Ubuntu, Fedora, Arch, Debian, Mint, Pop!_OS, report what works (and what doesn’t)
  2. Test your DE: GNOME, KDE, Xfce, Cinnamon, i3, etc., let me know how keyboard shortcuts behave
  3. Report bugs: If something breaks, file an issue on GitHub
  4. Share feedback: What features would make this better for you?

This isn’t just another side project, it’s a tool I rely on daily, and I’m committed to making voice dictation on Linux finally work the way it should.


Getting Started

Quick Install

curl -fsSL raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh \
  -o /tmp/vl.sh && bash /tmp/vl.sh --interactive

After Installation

Launch Vocalinux from your terminal or application menu:

vocalinux

Double-tap Ctrl to start dictating. Double-tap again to stop. That’s it.

Documentation

Full documentation is available at github.com/jatinkrmalik/vocalinux, including:

  • Advanced configuration options
  • Troubleshooting guides
  • FAQ
  • Contributing guidelines

Demo

See Vocalinux in action:


What’s Next?

Here’s what I’m working on for future releases:

  • Enhanced punctuation commands: Better voice control over formatting
  • Additional language models: Optimized models for specific languages
  • Voice commands for system actions: Launch apps, control volume, etc.
  • Plugin system: Extensible architecture for third-party features
  • Better accessibility: Integration with screen readers and assistive technologies

Join the Community


Voice dictation has the potential to be transformative — for accessibility, for productivity, for reducing repetitive strain injuries. Linux users deserve a voice dictation solution that’s private, reliable, and works everywhere.

Vocalinux is my attempt to build exactly that. It’s not perfect, but it’s functional, it’s open source, and it’s getting better every day.

Try it out. Break it. Improve it. Let’s make Linux voice dictation amazing together. 🤝


Install Vocalinux today:

curl -fsSL raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh \
  -o /tmp/vl.sh && bash /tmp/vl.sh --interactive
VocaHQ/vocalinux Free, open-source and fully offline voice dictation for Linux. Speak and it types anywhere, on X11 and Wayland, using whisper.cpp, Whisper or VOSK, with GPU acceleration. Python GPL-3.0 ★ 1,015 View on GitHub →

2 commentsfrom Medium

Carried over from the original post and read-only. Add a new comment below.

  1. Levente Csikor

    Thanks for this nice piece of software! I am a big privacy enthusiast and I love everything that can run locally. After finding this yesterday, i spent a bit of a time to make it run on my Debian 13, and it works flawlessly (after some manual labor, which is worth doing).

    Let me also make publicity for your tool! I wrote my epxerience in a blog post:

    https://medium.com/@cslev/talking-to-my-linux-box-without-talking-to-the-cloud-vocalinux-on-debian-without-the-tears-10bf053ea21b

    Thank you so much for your work

    1. Jatin K Malik Author

      Thank you!! Please feel free to contribute to the project either by reporting bugs or contributing pull requests. Happy to review them.

Leave a comment

Keep reading