Skip to main content

WhisperX-powered global transcription and push-to-talk application

Project description

Witticism

CI PyPI version License Python GitHub release

๐ŸŽ™๏ธ One-command install. Zero configuration. Just works.

WhisperX-powered voice transcription tool that types text directly at your cursor position. Hold F9 to record, release to transcribe.

โœจ Features

  • ๐Ÿš€ One-Command Install - Automatic GPU detection and configuration
  • ๐ŸŽฎ True GPU Acceleration - Full CUDA support, even for older GPUs (GTX 10xx series)
  • โšก Instant Transcription - Press F9, speak, release. Text appears at cursor
  • ๐Ÿ”„ Continuous Dictation Mode - Toggle on for hands-free transcription
  • ๐ŸŽฏ System Tray Integration - Runs quietly in background, always ready
  • ๐Ÿ“ฆ No Configuration - Works out of the box with smart defaults
  • ๐Ÿ”ง Easy Updates - Re-run install script to upgrade to latest version

Why Witticism?

Built to solve real GPU acceleration issues with whisper.cpp. WhisperX provides:

  • Proper CUDA/GPU support for faster transcription (2-10x faster than CPU)
  • Word-level timestamps and alignment for accuracy
  • Better accuracy with less latency
  • Native Python integration that actually works

Installation

๐Ÿš€ Quick Install

Linux:

curl -sSL https://raw.githubusercontent.com/Aaronontheweb/witticism/master/install.sh | bash

Windows:

irm https://raw.githubusercontent.com/Aaronontheweb/witticism/master/install.ps1 | iex

For detailed Windows installation instructions, see INSTALL_WINDOWS.md

That's it! The installer will:

  • โœ… Install system dependencies automatically (asks for sudo only if needed)
  • โœ… Detect your GPU automatically (GTX 1080, RTX 3090, etc.)
  • โœ… Install the right CUDA/PyTorch versions
  • โœ… Create desktop launcher with custom icon
  • โœ… Set up auto-start on login
  • โœ… Configure the system tray icon
  • โœ… Handle all dependencies in an isolated environment

No Python knowledge required. No CUDA configuration. It just works.

Note: The installer will ask for your sudo password only if PortAudio needs to be installed. Witticism itself runs as your regular user.

Manual Installation

If you prefer to install manually:

Prerequisites

  • Linux (Ubuntu, Fedora, Debian, etc.)
  • Python 3.10-3.12 (pipx will handle this)
  • NVIDIA GPU (optional but recommended for faster transcription)
  1. Install system dependencies:
# Debian/Ubuntu
sudo apt-get install portaudio19-dev

# Fedora/RHEL
sudo dnf install portaudio-devel

# Arch Linux
sudo pacman -S portaudio
  1. Install pipx if needed:
python3 -m pip install --user pipx
python3 -m pipx ensurepath
  1. Install Witticism:
# For CPU-only
pipx install witticism

# For GPU with CUDA 11.8+
pipx install witticism --pip-args="--index-url https://download.pytorch.org/whl/cu118 --extra-index-url https://pypi.org/simple"

# For GPU with CUDA 12.1+
pipx install witticism --pip-args="--index-url https://download.pytorch.org/whl/cu121 --extra-index-url https://pypi.org/simple"
  1. Set up auto-start (optional):
mkdir -p ~/.config/autostart
cat > ~/.config/autostart/witticism.desktop << EOF
[Desktop Entry]
Type=Application
Name=Witticism
Exec=$HOME/.local/bin/witticism
StartupNotify=false
Terminal=false
X-GNOME-Autostart-enabled=true
EOF

Desktop Integration

The quick installer automatically sets up desktop integration with launcher icon. If you installed manually, Witticism can still be launched from the terminal with the witticism command.

Upgrading

To upgrade to the latest version, simply re-run the install script:

curl -sSL https://raw.githubusercontent.com/Aaronontheweb/witticism/master/install.sh | bash

The install script is idempotent and will automatically upgrade existing installations to the latest version with all dependencies.

Usage

Basic Operation

  1. The app runs in your system tray (green "W" icon)
  2. Hold F9 to start recording
  3. Release F9 to stop and transcribe
  4. Text appears instantly at your cursor position

Or use Continuous Mode:

  • Toggle continuous dictation from the tray menu
  • Speak naturally - transcription happens automatically
  • Perfect for long-form writing

System Tray Menu

  • Status: Shows current state (Ready/Recording/Transcribing)
  • Model: Choose transcription model
    • tiny/tiny.en: Fastest, less accurate
    • base/base.en: Good balance (default)
    • small/medium/large-v3: More accurate, slower
  • Audio Device: Select input microphone
  • Quit: Exit application

Command Line Options

witticism --model base --log-level INFO

Options:

  • --model: Choose model (tiny, base, small, medium, large-v3)
  • --log-level: Set logging verbosity (DEBUG, INFO, WARNING, ERROR)
  • --reset-config: Reset settings to defaults
  • --version: Show version information

Configuration

Config file location: ~/.config/witticism/config.json

Key settings:

{
  "model": {
    "size": "base",
    "device": "auto"
  },
  "hotkeys": {
    "push_to_talk": "f9"
  }
}

Performance

With GTX 1080 GPU:

  • tiny model: ~0.5s latency, 5-10x realtime
  • base model: ~1-2s latency, 2-5x realtime
  • large-v3: ~3-5s latency, 1-2x realtime

CPU-only fallback available but slower.

Troubleshooting

No audio input

  • Check microphone permissions
  • Try selecting a different audio device from tray menu

CUDA not detected

python -c "import torch; print(torch.cuda.is_available())"

Should return True if CUDA is available.

CUDA errors after suspend/resume

If you experience CUDA crashes after suspending and resuming your system, the installer (v0.6.0+) automatically configures NVIDIA to preserve GPU memory across suspend cycles. If you installed Witticism before this fix was added, you can either:

  1. Re-run the installer (recommended):

    curl -sSL https://raw.githubusercontent.com/aaronstannard/witticism/main/install.sh | bash
    

    The installer is idempotent and will apply the fix without reinstalling Witticism.

  2. Apply the fix manually:

    # Configure NVIDIA to preserve memory across suspend
    echo "options nvidia NVreg_PreserveVideoMemoryAllocations=1" | sudo tee /etc/modprobe.d/nvidia-power-management.conf
    echo "options nvidia NVreg_TemporaryFilePath=/tmp" | sudo tee -a /etc/modprobe.d/nvidia-power-management.conf
    sudo update-initramfs -u
    
    # Enable NVIDIA suspend services (if available)
    sudo systemctl enable nvidia-suspend.service
    sudo systemctl enable nvidia-resume.service
    
    # Reboot for changes to take effect
    sudo reboot
    

This fix prevents the nvidia_uvm kernel module from becoming corrupted during suspend/resume cycles, which is the root cause of "CUDA unspecified launch failure" errors.

Models not loading

First run downloads models (~150MB for base). Ensure stable internet connection.

Debug logging

Log file locations:

  • Linux: ~/.local/share/witticism/debug.log
  • Windows: %LOCALAPPDATA%\witticism\debug.log (e.g., C:\Users\YourName\AppData\Local\witticism\debug.log)

To enable debug logging, either:

  • Run with --log-level DEBUG
  • Edit the config file and set "logging": {"level": "DEBUG", "file": "<path-to-log-file>"}
    • Linux config: ~/.config/witticism/config.json
    • Windows config: %APPDATA%\witticism\config.json

Common issues visible in debug logs:

  • "No active speech found in audio" - Check microphone connection/volume
  • CUDA context errors - Restart after suspend/resume
  • Model loading failures - Check GPU memory with nvidia-smi

Force Reinstall

If you need to force a complete reinstallation (e.g., to fix corrupted dependencies or reset settings):

Linux:

# Force reinstall with the installer
curl -sSL https://raw.githubusercontent.com/Aaronontheweb/witticism/master/install.sh | bash -s -- --force

Windows:

# Force reinstall with all dependencies
irm https://raw.githubusercontent.com/Aaronontheweb/witticism/master/install.ps1 | iex -ForceReinstall

# Additional options can be combined:
# Force CPU-only reinstall without auto-start
$script = irm https://raw.githubusercontent.com/Aaronontheweb/witticism/master/install.ps1
& ([scriptblock]::Create($script)) -ForceReinstall -CPUOnly -SkipAutoStart

The force reinstall option will:

  • Remove existing Witticism installation
  • Clear the pipx/pip cache
  • Reinstall all dependencies fresh
  • Preserve your configuration files (unless you use --reset-config)

Development

Project Structure

src/witticism/
โ”œโ”€โ”€ core/           # Core functionality
โ”‚   โ”œโ”€โ”€ whisperx_engine.py
โ”‚   โ”œโ”€โ”€ audio_capture.py
โ”‚   โ”œโ”€โ”€ hotkey_manager.py
โ”‚   โ””โ”€โ”€ transcription_pipeline.py
โ”œโ”€โ”€ ui/             # User interface
โ”‚   โ””โ”€โ”€ system_tray.py
โ”œโ”€โ”€ utils/          # Utilities
โ”‚   โ”œโ”€โ”€ output_manager.py
โ”‚   โ”œโ”€โ”€ config_manager.py
โ”‚   โ””โ”€โ”€ logging_config.py
โ””โ”€โ”€ main.py         # Entry point

Author

Created by Aaron Stannard

License

Apache-2.0

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

witticism-0.8.1.tar.gz (265.4 kB view details)

Uploaded Source

Built Distribution

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

witticism-0.8.1-py3-none-any.whl (142.3 kB view details)

Uploaded Python 3

File details

Details for the file witticism-0.8.1.tar.gz.

File metadata

  • Download URL: witticism-0.8.1.tar.gz
  • Upload date:
  • Size: 265.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for witticism-0.8.1.tar.gz
Algorithm Hash digest
SHA256 885090982fc7ae07ef6a620197d46b3e77a6d84b72707e8673bb270902480878
MD5 bae3e945864d9a2cd6c7317638dd42e8
BLAKE2b-256 fb58b1e7ec236adeca1b98f3f1e594e29f77b3f2c14893fa2d705a8af1d2a4b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for witticism-0.8.1.tar.gz:

Publisher: release.yml on Aaronontheweb/witticism

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

File details

Details for the file witticism-0.8.1-py3-none-any.whl.

File metadata

  • Download URL: witticism-0.8.1-py3-none-any.whl
  • Upload date:
  • Size: 142.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for witticism-0.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5b6ae644614a34bd7ab2df90b86588f7a3b57accedf3d673138fa47e7c2e0d70
MD5 ca1d10ec020dd90170b4ffbe2006a3a8
BLAKE2b-256 6ebad723414cb4360d9aa2678ace99f0a732c1aeda4aeac43b5cb2c0318b0d2d

See more details on using hashes here.

Provenance

The following attestation bundles were made for witticism-0.8.1-py3-none-any.whl:

Publisher: release.yml on Aaronontheweb/witticism

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