A macOS menu bar app for real-time speech-to-text using MLX Whisper
Press a hotkey, speak, and the transcribed text is automatically pasted into the active input field.
- ποΈ Menu Bar App β lives in the system tray, always accessible
- β¨οΈ Hotkey Triggered β configurable keyboard shortcut (default: Option+Tab)
- π Push-to-Talk or Toggle Mode β hold the hotkey or press to start/stop
- π On-Device Transcription β runs locally via MLX Whisper, no cloud API needed
- π Auto-Paste β transcribed text is automatically inserted into the focused input field
- π¬ Floating Bubble UI β visual feedback with waveform animation during recording
- π Multi-Language Support β optimized for Traditional Chinese with English code-switching
- β‘ Auto-Setup β automatically creates Python venv and installs dependencies on first launch
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β₯ Tab β
β ββββββ β
β β
β 1. Press Option+Tab βββ ποΈ Recording starts β
β βββββββββββββββββββββ β
β β β Recording... β β
β β ββββββββββββββ β β
β βββββββββββββββββββββ β
β β
β 2. Speak βββ π Audio captured locally β
β β
β 3. Release / Press βββ βοΈ MLX Whisper transcribes β
β (on-device, no cloud) β
β β
β 4. Done βββ π Text auto-pasted to cursor β
β (Cmd+V via CGEvent) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Download
WhisperEcho-v1.0.0.zipfrom Releases - Extract and move
WhisperEcho.appto/Applications - Launch WhisperEcho
# Install XcodeGen if not already installed
brew install xcodegen
# Clone the repository
git clone https://github.com/tsungtwu/whisper-echo.git
cd whisper-echo
# Build and install
make install| Command | Description |
|---|---|
make build |
Debug build |
make run |
Debug build + launch |
make release |
Release build + package zip to release/ |
make install |
Release build + reset permissions + copy to /Applications |
make clean |
Clean build artifacts |
make reset-permissions |
Reset app permissions only |
- Launch WhisperEcho β it appears in the menu bar
- Grant Microphone permission when prompted
- Grant Accessibility permission when prompted (required for auto-paste)
- Add WhisperEcho to Input Monitoring in System Settings > Privacy & Security (required for hotkey)
- The app will automatically create
~/.mlx-whisper-envand installmlx-whisper - Wait for the model to download (first time only)
Note: When updating to a new build,
make installautomatically resets permissions to avoid stale entries. You will need to re-grant permissions on first launch after update.
- Click the menu bar icon to see status and settings
- Press the hotkey (default: Option+Tab) to start recording
- Speak β the floating bubble shows a waveform animation
- Release (push-to-talk) or press again (toggle) to stop
- Text is transcribed and automatically pasted into the active input field
| Setting | Options | Default |
|---|---|---|
| Language | English, Traditional Chinese, Japanese, Korean, ... | Traditional Chinese |
| Model | whisper-large-v3-turbo, large-v3, medium, small, base, tiny | large-v3-turbo |
| Mode | Push-to-talk, Toggle | Toggle |
| Hotkey | Any modifier + key combo | Option+Tab |
| Launch at Login | On/Off | Off |
WhisperEcho/
βββ WhisperEchoApp.swift # App entry point (MenuBarExtra)
βββ AppCoordinator.swift # Central orchestrator
βββ AppState.swift # Observable state machine
βββ Audio/
β βββ AudioRecorder.swift # AVAudioEngine recording
β βββ AudioLevelMonitor.swift # Audio level tracking
βββ Transcription/
β βββ PythonBridge.swift # Python venv setup & PythonKit init
β βββ PythonThread.swift # Dedicated thread for Python GIL
β βββ WhisperEngine.swift # MLX Whisper transcription
βββ Hotkey/
β βββ HotkeyManager.swift # CGEvent tap for global hotkey
βββ UI/
β βββ MenuBarView.swift # Menu bar dropdown UI
β βββ BubbleWindow.swift # Floating bubble window
β βββ BubbleView.swift # Bubble content view
β βββ WaveformView.swift # Waveform animation
βββ Output/
β βββ TextOutputManager.swift # Clipboard + Cmd+V paste
βββ Settings/
β βββ Settings.swift # UserDefaults persistence
βββ Permissions/
β βββ PermissionChecker.swift # Permission checks & openers
βββ Resources/
βββ Info.plist
βββ WhisperEcho.entitlements
βββ Assets.xcassets/
- Language: Swift 5.9
- UI: SwiftUI + MenuBarExtra
- Audio: AVAudioEngine (16kHz mono float32)
- Transcription: MLX Whisper via PythonKit
- Hotkey: CGEvent tap
- Build: XcodeGen + xcodebuild
- macOS 14 (Sonoma) or later
- Apple Silicon Mac (M1/M2/M3/M4)
- Python 3.9+ installed (Homebrew or system)
- Xcode 15+ and XcodeGen (for building from source)
MIT License - see LICENSE for details.
tsungtwu - @tsungtwu
Built with assistance from Claude Code π€
β Star this repo if you find it useful!