transcription.engine in ~/.whisper/config.toml, the macOS Settings app, the menu bar, or wh engine <name>.
Engines are registered in src/whisper_voice/engines/__init__.py. Non-selected engines must stay lazy and must not load weights at startup.
Parakeet-TDT v3
Parakeet-TDT v3 is the default. It runs in-process through MLX, uses themlx-community/parakeet-tdt-0.6b-v3 checkpoint, supports English plus 24 European languages, and handles long audio with overlapping chunks.
Qwen3-ASR
Qwen3-ASR runs in-process through a community-maintained MLX conversion and runtime, not Qwen’s official PyTorch stack. It uses model-side language detection and supports long audio through a large internal chunk duration. Themlx-community/Qwen3-ASR-1.7B-bf16 variant is the higher-quality default. Choose mlx-community/Qwen3-ASR-0.6B-bf16 when lower memory use and latency matter more than maximum recognition quality. Settings and wh config expose both variants; the selected snapshot downloads before the engine switches and then runs locally.
Both catalog models declare contextual-prompting support. When Vocabulary and
qwen3_asr.use_vocabulary are enabled, Local Whisper builds a prompt from each
non-empty spoken-to-preferred replacement rule and passes it to Qwen as context
and hotwords. The prompt stays in process and is capped at 4,096 characters per
request. Custom Qwen model IDs do not receive Vocabulary context unless they
are added to the validated model catalog.
WhisperKit
WhisperKit uses a local server atlocalhost:50060.
Install it separately:
brew install whisperkit-cli.
Settings also exposes WhisperKit presets for
large-v3-v20240930_turbo_632MB, large-v3-v20240930_turbo, large-v3-v20240930, small, and base, plus a custom model field.
Apple SpeechTranscriber
apple_speech uses Apple’s SpeechAnalyzer session API with its on-device SpeechTranscriber module. It requires macOS 26, supported Apple hardware, and an explicit locale. The same shared Swift core is used by the iOS app on supported iOS 26 devices.
Apple manages language assets through AssetInventory. Local Whisper reports whether the locale is unsupported, available, downloading, or installed; it does not infer readiness from a private file path. Switching prepares the asset before unloading the current engine. Removing the model releases Local Whisper’s reservation and leaves final storage reclamation to the operating system.
Adding an engine
- Implement
TranscriptionEngineinsrc/whisper_voice/engines/. - Add an
ENGINE_REGISTRYentry insrc/whisper_voice/engines/__init__.py. - Declare optional capabilities in the registry and implement their explicit engine protocol. Never pass feature-specific data to an undeclared engine.
- Add config schema/defaults if needed.
- Verify menu bar, CLI, Settings, startup, capability isolation, and lazy loading.