Local voice-to-text for Windows.
Hold a hotkey or just start talking; the transcript gets pasted where your cursor is.
- Push-to-talk hotkey (default
F9) that works in any app - Voice activation mode (Silero VAD) if you don't want to hold a key
- Pick a specific microphone, or let the OS default route
- Whisper runs locally via whisper.cpp — audio stays on your machine
- CUDA acceleration if you have an NVIDIA GPU, CPU fallback otherwise
- Five Whisper model sizes:
tiny,base,small,medium,large-v3-turbo, plus a local Models library to delete/swap them - Optional DeepL translation into a target language of your choice
- Find & replace rules + an initial prompt passed to Whisper, applied to every transcript
- Hands-free paste — pin a target window and Echo focuses it, pastes, and returns you to whatever you were on. Works even when the target is minimized
- Auto-submit — press Enter after paste, handy for Claude / ChatGPT / Discord
- Rolling transcription history with copy-to-clipboard
- Built-in auto-updater: new releases download in the background and install with one click
- Lives in the system tray; can start at login
Download the latest installer from the Releases page and run it.
On first launch Echo downloads the selected Whisper model (base by default) and, if you have an NVIDIA GPU and pick the CUDA backend, the matching whisper.cpp binary. From v2.2.0 onward, Echo checks for its own updates on launch and installs them from a single Restart & install button in the About tab.
Push-to-talk (default):
- Hold
F9(or whatever hotkey you set). - Speak.
- Release. Transcript is pasted into the focused text field.
Voice activation:
In Settings → Hands-free, toggle Voice activation on. Echo then listens continuously and transcribes each utterance as you speak. The mic stays live; the hotkey is disabled while this is on.
Hands-free paste into a specific window:
In Settings → Hands-free, pick a Target window. Every transcript after that goes to that window — Echo focuses it, pastes, and returns focus to whatever you were actually on. Minimized targets are un-minimized for the paste then re-minimized afterward. The pin is keyed by process ID so title changes (Chrome tab switches, Notepad edits) don't break it, and is cleared only when the pinned process actually dies. The pin is intentionally volatile across app restarts — pick it again next session.
Enable Auto-submit alongside it to send Enter after the paste, so voice-driving a chat app is literally hands-free.
Organised into six tabs in the Settings window (tray → Settings).
| Setting | Default | Notes |
|---|---|---|
| Push-to-talk hotkey | F9 |
Any key or modifier combo |
| Exit shortcut | Ctrl+Alt+Q |
Global quit |
| Microphone | System default | Pick a specific input device; falls back to default if unplugged |
| Start at login | Off |
| Setting | Default | Notes |
|---|---|---|
| Whisper model size | base |
tiny / base / small / medium / large-v3-turbo |
| Language | Auto-detect | Pin one for a small speedup and to enable the translate-skip optimisation |
| Compute backend | Auto | CPU or CUDA; auto-selected based on hardware |
| Downloaded models | — | List, delete, and re-download cached models |
| Setting | Default | Notes |
|---|---|---|
| Initial prompt | — | Biases Whisper's style (custom vocabulary, punctuation, tone) |
| Translate to | Off | Sends the transcript to DeepL for translation |
| DeepL API key | — | Only needed when a translation target is set. Free keys end in :fx |
| Find & Replace | — | Case-insensitive rules applied last; supports \n / \t |
| Setting | Default | Notes |
|---|---|---|
| Target window | None | Pin a specific window for all transcripts (by PID, volatile across restarts) |
| Voice activation | Off | Always-on mic; disables the push-to-talk hotkey |
| Auto-paste transcript | On | Off = copy to clipboard only |
| Auto-submit | Off | Press Enter after paste; requires auto-paste |
Rolling last 50 transcripts, persisted to %APPDATA%\Echo\history.json. Copy each back to the clipboard, delete individually, or clear all. Toggle off to stop saving without wiping existing entries.
Current version, platform and GPU badges, Check for updates button, and a "What's new" list of recent releases linking to the GitHub compare view for each version.
Requires Node.js 20+ on Windows.
git clone https://github.com/Kenshiin13/echo.git
cd echo/electron
npm install --legacy-peer-deps
npm run devPackage an installer:
npm run dist:winPushing a v* tag runs the release workflow and publishes a GitHub Release with the built artifacts (installer, latest.yml, blockmap — electron-updater needs all three).
- Electron 33, React 18, Vite 6, Mantine
- whisper.cpp via nodejs-whisper for transcription (model kept resident in a local
whisper-serversubprocess) - Silero VAD via @ricky0123/vad-web for voice activation
- DeepL API (optional) for translation
- koffi for
GetAsyncKeyState-based hotkey polling and theSetForegroundWindow+AttachThreadInputfocus dance that powers the Hands-free paste - Electron's
desktopCapturer+ @nut-tree-fork/nut-js for window enumeration and keystroke simulation - electron-updater for the built-in updater
- electron-store for settings, electron-builder for packaging
This project is licensed under the GNU GPL v3.0 - see the LICENSE file for details.

