* feat: add language selector UI with auto-detection support This commit implements a comprehensive language selector for the GUI, extending support from 4 to 10 languages and adding Whisper auto-detect. Changes: - Add SUPPORTED_LANGUAGES constant with 10 languages (auto, en-us, hi, es, fr, de, it, pt, ru, zh) - Each language includes display name, Whisper code, VOSK model name, and optional warning - Extend VOSK_MODEL_INFO to include Hindi, Spanish, Italian, Portuguese, and Chinese models - Add language dropdown in Settings dialog with status indicators (✓ downloaded, ↓ needs download, ⚠ warning) - Add language warning label for auto-detect and engine compatibility messages - Update default language from "en-us" to "auto" for Whisper auto-detection - Handle "auto" language in Whisper (passes None for auto-detect) - Handle "auto" language in VOSK (falls back to "en-us" since VOSK doesn't support auto-detect) - Update CLI --language argument to include all supported languages Fixes the issue where Hindi speech was being transcribed as English because the language was hardcoded to "en-us" which Whisper interpreted as "force English transcription" rather than auto-detect. Related PRs: - #72 - Feature: Add language auto-detection and GUI selector (supersedes) - #71 - Feature: Add multi-language support for FR, DE, RU (builds upon) - #52 - Feature: 3 more languages for Whisper and VOSK (extends) - #68 - Comment out language parameter in transcribe call (addresses) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * style: format main.py with black * fix: use venv python and set GI_TYPELIB_PATH for verification * fix: create wrapper scripts that set GI_TYPELIB_PATH Problem: The symlinks in ~/.local/bin pointed to venv scripts that failed because PyGObject couldn't find the system typelib files (AppIndicator3 namespace not available). Solution: Create wrapper scripts in ~/.local/bin that: 1. Set GI_TYPELIB_PATH=/usr/lib/girepository-1.0 2. Execute the venv's vocalinux scripts This fixes the issue where vocalinux-gui would fail to start with: ValueError: Namespace AppIndicator3 not available * fix: set GI_TYPELIB_PATH in desktop entry Exec line When launching from the app drawer, the environment variables from the wrapper script weren't being inherited properly. By adding GI_TYPELIB_PATH directly in the desktop entry's Exec line, the app can now find the AppIndicator3 typelib files. * fix: always create wrapper scripts, not just for remote installs The wrapper scripts were only created when CLEANUP_ON_EXIT=yes, which is only set for remote (curl-based) installations. When running from a local repository, the wrapper scripts were never created, causing the desktop entry and launch commands to fail. * fix: prevent recursion in LoggingHandler when processing log records The custom LoggingHandler was triggering logging from within the logging system itself, causing infinite recursion when formatting log records. This could happen when the logging formatter or any operation during record processing triggered additional log messages. Fix: Add _emitting flag to prevent recursive calls to emit(). * fix: prevent infinite loop in settings dialog when changing language Add guard flags to prevent recursive event handler calls: - _populating_models: blocks _on_model_changed during model population - _processing_language_change: blocks recursive language change handling - _applying_settings: blocks recursive settings application These guards prevent the infinite loop that occurred when selecting a language whose VOSK model wasn't downloaded yet. Fixes issue where "Model small needs download" logged repeatedly. * fix: handle language parameter in reconfigure and improve UX - Fix reconfigure() to properly handle language parameter changes - Remove _processing_language_change check from _auto_apply_settings to allow settings to be applied when language changes - Hide unsupported languages in dropdown based on selected engine * VOSK: only show languages with available models (no "auto") * Whisper: show all supported languages including "auto" - Remove duplicate _auto_apply_settings call in _on_engine_changed - Set active language in combo after repopulating options This fixes: 1. Whisper continuing to use old language after switching (e.g., still transcribing in Hindi after switching to en-us) 2. Potential infinite loop when selecting languages for VOSK 3. User confusion by showing incompatible language options --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Vocalinux
Voice-to-text for Linux, finally done right!
A seamless free open-source private voice dictation system for Linux, comparable to the built-in solutions on macOS and Windows.
🎉 Alpha Release!
We're excited to share Vocalinux with the community. Try it out and let us know what you think!
✨ Features
- 🎤 Double-tap Ctrl to start/stop voice dictation
- ⚡ Real-time transcription with minimal latency
- 🌎 Universal compatibility across all Linux applications
- 🔒 Offline operation for privacy and reliability (with VOSK)
- 🤖 Optional Whisper AI support for enhanced accuracy
- 🎨 System tray integration with visual status indicators
- 🔊 Audio feedback for recording status
- ⚙️ Graphical settings dialog for easy configuration
🚀 Quick Install
One-liner Installation (Recommended)
curl -fsSL https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh | bash -s -- --tag=v0.4.0-alpha
Note
: Installs v0.4.0-alpha. For the most recent version, check GitHub Releases.
This will:
- Clone the repository to
~/.local/share/vocalinux-install - Install all system dependencies
- Set up a virtual environment in
~/.local/share/vocalinux/venv - Install both VOSK and Whisper AI speech engines:
- VOSK: installs the
voskPython package from PyPI - Whisper: installs the
openai-whisperpackage from PyPI, which also pulls in PyTorch (the ML framework Whisper requires)
- VOSK: installs the
- Create a symlink at
~/.local/bin/vocalinux - Download the default Whisper tiny speech model (~75MB)
⏱️ Note: Installation takes ~5-10 minutes due to Whisper AI dependencies (PyTorch with CUDA support, ~2.3GB).
Whisper with CPU-only PyTorch (no NVIDIA GPU needed):
curl -fsSL https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh | bash -s -- --tag=v0.4.0-alpha --whisper-cpu
This installs Whisper with CPU-only PyTorch (~200MB instead of ~2.3GB). Works great for systems without NVIDIA GPU.
For low-RAM systems (8GB or less) - VOSK only:
curl -fsSL https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh | bash -s -- --tag=v0.4.0-alpha --no-whisper
This skips Whisper installation entirely and configures VOSK as the default engine.
Alternative: Install from Source
# Clone the repository
git clone https://github.com/jatinkrmalik/vocalinux.git
cd vocalinux
# Run the installer (will prompt for Whisper)
./install.sh
# Or with Whisper support
./install.sh --with-whisper
The installer handles everything: system dependencies, Python environment, speech models, and desktop integration.
After Installation
# If ~/.local/bin is in your PATH (recommended):
vocalinux
# Or activate the virtual environment first:
source ~/.local/bin/activate-vocalinux.sh
vocalinux
# Or run directly:
~/.local/share/vocalinux/venv/bin/vocalinux
Or launch it from your application menu!
Uninstall
# If installed via curl:
curl -fsSL https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/uninstall.sh | bash
# If installed from source:
./uninstall.sh
📋 Requirements
- OS: Ubuntu 22.04+ (other Linux distros may work)
- Python: 3.8 or newer
- Display: X11 or Wayland
- Hardware: Microphone for voice input
🎙️ Usage
Voice Dictation
- Double-tap Ctrl to start recording
- Speak clearly into your microphone
- Double-tap Ctrl again (or pause speaking) to stop
Voice Commands
| Command | Action |
|---|---|
| "new line" | Inserts a line break |
| "period" / "full stop" | Types a period (.) |
| "comma" | Types a comma (,) |
| "question mark" | Types a question mark (?) |
| "exclamation mark" | Types an exclamation mark (!) |
| "delete that" | Deletes the last sentence |
| "capitalize" | Capitalizes the next word |
Command Line Options
vocalinux --help # Show all options
vocalinux --debug # Enable debug logging
vocalinux --engine whisper # Use Whisper AI engine
vocalinux --model medium # Use medium-sized model
vocalinux --wayland # Force Wayland mode
⚙️ Configuration
Configuration is stored in ~/.config/vocalinux/config.json:
{
"speech_recognition": {
"engine": "vosk",
"model_size": "small",
"vad_sensitivity": 3,
"silence_timeout": 2.0
}
}
You can also configure settings through the graphical Settings dialog (right-click the tray icon).
🔧 Development Setup
# Clone and install in dev mode
git clone https://github.com/jatinkrmalik/vocalinux.git
cd vocalinux
./install.sh --dev
# Activate environment
source venv/bin/activate
# Run tests
pytest
# Run from source with debug
python -m vocalinux.main --debug
📁 Project Structure
vocalinux/
├── src/vocalinux/ # Main application code
│ ├── speech_recognition/ # Speech recognition engines
│ ├── text_injection/ # Text injection (X11/Wayland)
│ ├── ui/ # GTK UI components
│ └── utils/ # Utility functions
├── tests/ # Test suite
├── resources/ # Icons and sounds
├── docs/ # Documentation
└── web/ # Website source
📖 Documentation
- Installation Guide - Detailed installation instructions
- Update Guide - How to update Vocalinux
- User Guide - Complete user documentation
- Contributing - Development setup and contribution guidelines
🗺️ Roadmap
Custom icon design✅Graphical settings dialog✅Whisper AI support✅Multi-language support (FR, DE, RU)✅- In-app update mechanism
- Application-specific commands
- Debian/Ubuntu package (.deb)
- Improved Wayland support
- Voice command customization
🤝 Contributing
We welcome contributions! Whether it's bug reports, feature requests, or code contributions, please check out our Contributing Guide.
Quick Links
⭐ Support
If you find Vocalinux useful, please consider:
- ⭐ Starring this repository
- 🐛 Reporting bugs you encounter
- 📖 Improving documentation
- 🔀 Contributing code
📜 License
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
Made with ❤️ for the Linux community