A macOS menu bar app for system-wide voice-to-text. Press a hotkey, speak, and the transcribed text is pasted into whatever app you're using. All processing happens on-device using Whisper models -- no data leaves your Mac.
- Menu bar app -- lives in your menu bar, works system-wide with no dock icon
- Two input modes -- toggle recording (press to start, press to stop) or push-to-talk (hold to record, release to transcribe)
- Hardware-accelerated transcription -- on-device whisper.cpp inference with Metal GPU acceleration, CPU + Accelerate, and optional CoreML encoder for ANE
- Multiple model sizes -- from tiny to large-v3, downloaded automatically on first use
- Language selection -- choose a transcription language or use auto-detect with multilingual models
- Automatic text insertion -- transcribed text is pasted directly into the frontmost app (full clipboard save/restore)
- Configurable hotkeys -- set your own keyboard shortcuts for toggle and push-to-talk
- Recording safety -- automatic stop after 5 minutes to prevent runaway recordings
- Fully offline -- models run locally, no network required after initial download
| Menu bar popover | Settings — General | Settings — Permissions |
|---|---|---|
![]() |
![]() |
![]() |
- macOS 26.2+
- Apple Silicon (ARM64) recommended for best performance
- Xcode 26+ to build from source
-
Clone the repository with submodules:
git clone --recurse-submodules https://github.com/your-username/voicecom.git
-
Open
voicecom.xcodeprojin Xcode -
Build and run (Cmd+R)
-
Grant the requested permissions:
- Microphone -- prompted on first recording
- Accessibility -- needed to paste text into other apps (prompted at launch, or grant manually in System Settings > Privacy & Security > Accessibility)
| Action | Default Shortcut |
|---|---|
| Toggle recording | Option + Shift + R |
| Push-to-talk (hold) | Option + Shift + T (enabled by default) |
- Click the mic icon in the menu bar or press the toggle hotkey to start recording
- Speak
- Press the hotkey again (or release for push-to-talk) to stop and transcribe
- The transcribed text is automatically pasted at your cursor
Shortcuts can be changed in Settings (Cmd+,).
voicecom uses whisper.cpp for on-device transcription. The default model is ggml-small. Models are downloaded from HuggingFace on first use and cached in ~/Library/Application Support/voicecom/models/whispercpp/.
Hardware acceleration is layered for maximum performance:
- Metal GPU -- accelerates the decoder via the ggml Metal backend (enabled with flash attention)
- CoreML encoder -- downloaded alongside the model for ANE acceleration (falls back to CPU automatically)
- Accelerate -- used for CPU-side BLAS operations
- Performance cores only -- inference threads are pinned to P-cores to avoid latency from E-cores
You can select a transcription language in Settings (General tab). Use "Auto-detect" with multilingual models (e.g. ggml-small, ggml-large). English-only models (.en suffix) always transcribe in English regardless of this setting.
# Debug build
xcodebuild -scheme voicecom -configuration Debug -derivedDataPath build/DerivedData
# Release build
xcodebuild -scheme voicecom -configuration Release -derivedDataPath build/DerivedData
# Run tests
xcodebuild test -scheme voicecom -derivedDataPath build/DerivedDataThe Release .app bundle is output to build/DerivedData/Build/Products/Release/voicecom.app.
To package the app into a .dmg installer with a drag-to-Applications layout:
# 1. Build in Release mode
xcodebuild -scheme voicecom -configuration Release -derivedDataPath build/DerivedData
# 2. Create a staging directory
mkdir -p build/dmg_staging
cp -R build/DerivedData/Build/Products/Release/voicecom.app build/dmg_staging/
ln -s /Applications build/dmg_staging/Applications
# 3. Create the .dmg
hdiutil create -volname "voicecom" \
-srcfolder build/dmg_staging \
-ov -format UDZO \
build/voicecom.dmg
# 4. Clean up staging directory
rm -rf build/dmg_stagingThe resulting build/voicecom.dmg can be shared and opened on any compatible Mac. Users open the DMG and drag voicecom.app into the Applications folder to install.
Note: For distribution outside your own machines, sign with a Developer ID certificate and notarize:
codesign --force --deep --sign "Developer ID Application: Your Name (TEAM_ID)" build/DerivedData/Build/Products/Release/voicecom.app xcrun notarytool submit build/voicecom.dmg --apple-id YOUR_APPLE_ID --team-id TEAM_ID --password APP_SPECIFIC_PASSWORD --wait xcrun stapler staple build/voicecom.dmg
voicecom/
voicecomApp.swift # App entry point (MenuBarExtra + Settings scene)
AppState.swift # Central @Observable state, settings, service wiring
Services/
TranscriptionBackend.swift # Protocol for transcription backends
TranscriptionService.swift # Transcription service facade
WhisperCppBackend.swift # whisper.cpp (GGML) backend
AudioRecorder.swift # AVAudioRecorder-based recording
TextInsertionService.swift # Clipboard + CGEvent paste
HotkeyManager.swift # Global keyboard shortcut handling
PermissionManager.swift # Mic + Accessibility permission checks
Views/
MenuBarView.swift # Menu bar popover UI
SettingsView.swift # Settings window (General + Permissions tabs)
HotkeyRecorderView.swift # Keyboard shortcut capture widget
LocalWhisper/ # Local SPM package wrapping vendored whisper.cpp
include/ # Public C headers + module.modulemap
MetalObjC/ # Metal backend ObjC files (compiled without ARC)
vendor/ # whisper.cpp source (git submodule)
Package.swift # Builds whisper.cpp for Apple platforms (CPU + Metal + CoreML)


