Skip to main content

Maivi - My AI Voice Input: Real-time voice-to-text with hotkey support

Project description

Maivi - My AI Voice Input ๐ŸŽค

Real-time voice-to-text transcription with hotkey support

Maivi (My AI Voice Input) is a cross-platform desktop application that turns your voice into text using state-of-the-art AI models. Simply press Alt+Q (Option+Q on macOS) to start recording, and press again to stop. Your transcription appears in real-time and is automatically copied to your clipboard.

License Python Platform

โœจ Features

  • ๐ŸŽค Hotkey Recording - Toggle recording with Alt+Q (Option+Q on macOS)
  • โšก Real-time Transcription - See text appear as you speak
  • ๐Ÿ“‹ Clipboard Integration - Automatic copy to clipboard
  • ๐ŸชŸ Floating Overlay - Live transcription in a sleek overlay window
  • ๐Ÿ”„ Smart Chunk Merging - Advanced overlap-based merging eliminates duplicates
  • ๐Ÿ’ป CPU-Only - No GPU required (though GPU acceleration is supported)
  • ๐ŸŒ High Accuracy - Powered by NVIDIA Parakeet TDT 0.6B model (~6-9% WER)
  • ๐Ÿš€ Fast - ~0.36x RTF (processes 7s audio in 2.5s on CPU)

๐Ÿš€ Quick Start

Installation

CPU-only (Recommended - much faster, 100MB vs 2GB+):

pip install maivi --extra-index-url https://download.pytorch.org/whl/cpu

Or with GPU support (if you have NVIDIA GPU):

pip install maivi --extra-index-url https://download.pytorch.org/whl/cu121

Standard install (may download large CUDA files):

pip install maivi

System Requirements

Linux:

sudo apt-get install portaudio19-dev python3-pyaudio

macOS: Grant Maivi microphone, Accessibility, and Input Monitoring permissions the first time you run it (System Settings โ†’ Privacy & Security). No additional Homebrew packages are required for audio capture.

Windows:

  • PortAudio is usually included with PyAudio

Usage

GUI Mode (Recommended):

maivi

Press Alt+Q (Option+Q on macOS) to start recording, press Alt+Q again to stop. The transcription will appear in a floating overlay and be copied to your clipboard.

CLI Mode:

# Basic CLI
maivi-cli

# With live terminal UI
maia-cli --show-ui

# Custom parameters
maia-cli --window 10 --slide 5 --show-ui

Controls:

  • Alt+Q (Option+Q on macOS) - Start/stop recording (toggle mode)
  • Esc - Exit application

๐Ÿ“– How It Works

Maia uses a sophisticated streaming architecture:

  1. Sliding Window Recording - Captures audio in overlapping 7-second chunks every 3 seconds
  2. Real-time Transcription - Each chunk is transcribed by the NVIDIA Parakeet model
  3. Smart Merging - Chunks are merged using overlap detection (4-second overlap)
  4. Live Updates - The UI updates in real-time as transcription progresses

Why Overlapping Chunks?

Chunk 1: "hello world how are you"
Chunk 2: "how are you doing today"
          ^^^^^^^^^^^^^^
          Overlap detected โ†’ merge!

Result: "hello world how are you doing today"

This approach ensures:

  • โœ… No words cut mid-syllable
  • โœ… Context preserved for better accuracy
  • โœ… Seamless merging without duplicates
  • โœ… Fast processing (no queue buildup)

โš™๏ธ Configuration

Chunk Parameters

maia-cli --window 7.0 --slide 3.0 --delay 2.0
  • --window: Chunk size in seconds (default: 7.0)
    • Larger = better quality, slower processing
  • --slide: Slide interval in seconds (default: 3.0)
    • Smaller = more overlap, higher CPU usage
    • Rule: Must be > window ร— 0.36 to avoid queue buildup
  • --delay: Processing start delay in seconds (default: 2.0)

Advanced Options

# Speed adjustment (experimental)
maia-cli --speed 1.5

# Custom UI width
maia-cli --show-ui --ui-width 50

# Disable pause detection
maia-cli --no-pause-breaks

# Stream to file (for voice commands)
maia-cli --output-file transcription.txt

๐Ÿ“ฆ Building Executables

Maivi can be packaged as standalone executables for easy distribution:

# Install build dependencies
pip install maivi[build]

# Build executable
pyinstaller --onefile --windowed \
  --name maivi \
  --add-data "src/maia:maia" \
  src/maia/__main__.py

Pre-built executables are available in Releases.

๐Ÿ—๏ธ Development

Setup Development Environment

# Clone repository
git clone https://github.com/MaximeRivest/maivi.git
cd maivi

# Install in development mode
pip install -e .[dev]

# Run tests
pytest

Project Structure

maia/
โ”œโ”€โ”€ src/maia/
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ __main__.py           # GUI entry point
โ”‚   โ”œโ”€โ”€ core/
โ”‚   โ”‚   โ”œโ”€โ”€ streaming_recorder.py
โ”‚   โ”‚   โ”œโ”€โ”€ chunk_merger.py
โ”‚   โ”‚   โ””โ”€โ”€ pause_detector.py
โ”‚   โ”œโ”€โ”€ gui/
โ”‚   โ”‚   โ””โ”€โ”€ qt_gui.py
โ”‚   โ”œโ”€โ”€ cli/
โ”‚   โ”‚   โ”œโ”€โ”€ cli.py
โ”‚   โ”‚   โ”œโ”€โ”€ server.py
โ”‚   โ”‚   โ””โ”€โ”€ terminal_ui.py
โ”‚   โ””โ”€โ”€ utils/
โ”œโ”€โ”€ tests/
โ”œโ”€โ”€ docs/
โ”œโ”€โ”€ pyproject.toml
โ”œโ”€โ”€ README.md
โ””โ”€โ”€ LICENSE

๐Ÿ› Troubleshooting

"No overlap found" warnings

This is expected behavior when there are long pauses (5+ seconds of silence). The system adds "..." gap markers to indicate the pause.

Queue buildup (transcription continues after stopping)

Check that processing time < slide interval:

  • Processing: window_seconds ร— 0.36 (RTF)
  • Should be < slide_seconds
  • Default: 7 ร— 0.36 = 2.52s < 3s โœ…

Model download issues

The first run downloads the NVIDIA Parakeet model (~600MB) from HuggingFace. If download fails:

  • Check internet connection
  • Verify HuggingFace is accessible
  • Clear cache: rm -rf ~/.cache/huggingface/

Qt/GUI crashes

If the GUI crashes on Linux:

# Check Qt installation
python -c "from PySide6 import QtWidgets; print('Qt OK')"

# Fall back to CLI mode
maia-cli --show-ui

๐Ÿ“Š Performance

Memory:

  • Model: ~2GB RAM
  • Audio buffer: ~1MB
  • Total: ~2.5GB RAM

CPU:

  • Idle: <5% CPU
  • Recording: 30-40% of 1 core
  • Transcription: 100% of 1 core (during processing)

Latency:

  • First transcription: 2s (start delay)
  • Updates: Every 3s (slide interval)
  • Completion: 1-3s after recording stops

Accuracy:

  • Model WER: ~5-8%
  • Overlap merging: <1% word loss
  • Total effective WER: ~6-9%

๐Ÿ—บ๏ธ Roadmap

v0.2 - Platform Support:

  • Test and verify macOS support
  • Test and verify Windows support
  • Platform-specific installers (.app, .exe)

v0.3 - Features:

  • Configurable hotkeys via GUI
  • Multi-language support
  • Custom model selection
  • Voice commands support

v0.4 - Optimization:

  • GPU acceleration (CUDA)
  • Export formats (JSON, SRT)
  • Text editor integration
  • Plugin system

๐Ÿ“„ License

MIT License - see LICENSE file for details.

๐Ÿ™ Acknowledgments

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ’ฌ Support


Made with โค๏ธ by Maxime Rivest

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

maivi-0.4.0.tar.gz (31.2 kB view details)

Uploaded Source

Built Distribution

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

maivi-0.4.0-py3-none-any.whl (32.2 kB view details)

Uploaded Python 3

File details

Details for the file maivi-0.4.0.tar.gz.

File metadata

  • Download URL: maivi-0.4.0.tar.gz
  • Upload date:
  • Size: 31.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for maivi-0.4.0.tar.gz
Algorithm Hash digest
SHA256 c2da3986f26414317d4f24565d459e5b2d381942f2b1e98779a909276fb60454
MD5 90a0b73112aac8145d5bec7cd117747d
BLAKE2b-256 ca05401319b89ff32d0f8b7ca297791c9bdd0fdfebf58736ecd3dd3296e96821

See more details on using hashes here.

File details

Details for the file maivi-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: maivi-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 32.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for maivi-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 020ebc25bc19a59e1aa6c5efc90b4083cb23eb9101b0fe5fc69f255029e79929
MD5 7e09b9cd21cc9145a6ed38a86f749502
BLAKE2b-256 0857cf822554b8cbc9b7bbeedc4a833ba7750033a322490c4709fddc3dab3b88

See more details on using hashes here.

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