Local AI transcription that runs on your machine. Dictate into any app,
transcribe audio files, and keep every word offline.
SpeakEasy is a desktop app and a local backend. The backend records your microphone, runs a speech model on your hardware, and serves results over HTTP and WebSocket. The Electron app gives you a global hotkey, a recording overlay with live captions, a searchable history, and batch transcription of audio files.
Nothing is sent to a cloud service. The only network call is the one-time model download.
| Batch transcription | Statistics |
|---|---|
![]() |
![]() |
| Requirement | Notes |
|---|---|
| Windows 10/11, macOS, or Linux | Windows and Linux get GPU acceleration when an NVIDIA GPU is present |
| Python 3.12 | Installed automatically by the setup script through uv |
| Node.js 18 or newer | For the desktop app |
FFmpeg on PATH |
Needed for audio and video file transcription; optional for live dictation |
| NVIDIA GPU | Optional. CUDA speeds up transcription; CPU works for every model |
Windows:
install.batmacOS and Linux:
./install.shThe script installs uv and Python 3.12 if needed, creates the backend environment, installs
backend and desktop dependencies, checks FFmpeg, and then offers to start the app.
start.bat and start.sh are aliases for the same script with launch enabled.
On first launch the backend downloads the default speech model (about 2 GB for Parakeet). Later launches start offline.
# Backend
cd backend
uv venv --python 3.12
uv pip install --python .venv/Scripts/python.exe -e ".[cuda]" # Windows, NVIDIA GPU
uv pip install --python .venv/bin/python -e ".[cuda]" # macOS/Linux
uv pip install --python .venv/bin/python -e . # CPU only
# Desktop app
cd ../gui
npm install
npm run devDictate anywhere. Press the global hotkey (default Ctrl+Shift+Space, or F8 in the
example settings) and speak. The recording overlay appears above your windows with a timer and
live captions. Press the hotkey again to stop. The transcript is copied to your clipboard and
pasted into the active window.
Two hotkey modes are supported:
- Toggle: press to start, press again to stop.
- Push-to-talk: hold to record, release to stop. Holding for 60 seconds locks recording so you can release the keys; press the combination again to stop.
Live captions. While recording, the backend re-transcribes the audio every 1 to 10 seconds and pushes the growing transcript to the overlay. The interval and the feature itself are in Settings, Behavior.
History. Every finished transcription is stored in a local SQLite database. The Dashboard lists and searches it, and supports export to TXT, JSON, CSV, SRT, and VTT, plus JSON import.
Batch transcription. The Batch page queues local audio or video files and transcribes them one at a time with progress. FFmpeg must be installed.
Statistics. The Stats page summarizes counts and durations from the history database.
System tray. The tray icon shows ready or recording, and offers Open Dashboard, Settings, and Quit.
| Type | Default model | Engine | Notes |
|---|---|---|---|
| Parakeet | nvidia/parakeet-tdt-0.6b-v3 |
NVIDIA NeMo | Default. Fast and accurate for English |
| Whisper | large-v3, medium, small, base, tiny |
faster-whisper (CTranslate2) | Broad language support, sizes from 39 MB to 1.5 GB |
| Canary | nvidia/canary-1b-v2 |
NVIDIA NeMo | Speech translation and transcription |
| Voxtral | mistralai/Voxtral-Mini-3B-2507 |
transformers | Requires the voxtral extra and a large GPU |
The model can be changed in Settings, Model. Downloads show progress and are cached under the Hugging Face cache, so they happen once.
Settings live in ~/.speakeasy/settings.json. The app writes them when you change something in
Settings. The backend reads the file at startup.
Common settings:
| Setting | Default | Meaning |
|---|---|---|
model_type, model_name |
parakeet, nvidia/parakeet-tdt-0.6b-v3 |
Which model to load |
device |
cuda |
cuda or cpu |
hotkey, hotkey_mode |
ctrl+shift+space, toggle |
Global hotkey and its mode |
auto_paste |
true |
Paste results into the active window |
enable_text_cleanup |
true |
Remove filler words and capitalize sentences |
live_transcription |
false |
Stream captions while recording |
live_chunk_seconds |
3.0 |
Live update interval, 1 to 10 seconds |
See docs/configuration.md for the full list.
- Install: setup in detail, including a clean reinstall
- Usage: dictation, live captions, history, batch, stats
- Configuration: every setting and where it lives
- Troubleshooting: model downloads, audio devices, GPU, ports
- Development: repo layout, tests, lint, typecheck, builds
- Architecture: how the app, backend, and models fit together
- HTTP and WebSocket API: the real endpoint surface
cd backend
.venv/Scripts/python.exe -m pytest tests/ -q # Windows
.venv/bin/python -m pytest tests/ -q # macOS/Linux
cd ../gui
npm run lint
npm run typecheck
npm testCI runs the backend suite and the frontend lint, typecheck and tests on every push to main.
To refresh the screenshots above, close the app and run npm run showcase from gui/
(capture at DPR 4, composite to 3840px wide; see
.opencode/skills/showcase-screenshots/SKILL.md).
- First launch seems stuck. It is downloading the speech model. Progress appears in Settings, Model.
- No audio is recorded. Check Settings, Audio, and confirm the input device works in the system settings.
- FFmpeg missing. Install it and reopen the terminal. Batch and file transcription need it.
- CUDA errors. Set the device to
cpuin Settings, Model, or reinstall withpython install.py --reinstall --cpu.
More in docs/troubleshooting.md.
- Speech is transcribed on your machine by local models.
- No telemetry, no accounts, no API keys.
- The app reaches the network once per model to download weights. After that it runs offline.
- History and settings stay in
~/.speakeasy/.
See CONTRIBUTING.md. The short version: fork, branch, run the checks in Development, and open a pull request.
MIT. See LICENSE.


