Local speech-to-text powered by whisper.cpp. No cloud APIs, no costs, complete privacy.
This Lingo 2.0 project contains both a Web App and a GTK app, both of which use Whisper, but are separate apps. The web app is in folder web-app and the GTK app is in the gtk-app folder.
The Web App is almost identical to the original Lingo, under this same Github account (by Clay Ferguson), except the oridinal Lingo uses browser-based Speech API (for Voice Input) rather than Whisper.
For browser-based Speech I do recomment Lingo, rather than Lingo 2.0, just because, if you're already in a browser, there's no reason to use Whisper.
This mono-repo contains two applications that provide different ways to use whisper.cpp for voice input:
| Project | Description |
|---|---|
| web-app | Browser-based TTS/STT with a FastAPI backend. Access via http://localhost:8009 |
| gtk-app | Linux desktop app for system-wide voice typing. Speaks into any focused application |
Both projects share the same whisper.cpp engine located in whisper-model/.
One-time setup that:
- Clones the whisper.cpp repository
- Builds the whisper-cli binary using cmake
- Downloads the
base.enmodel (~150MB)
This project uses the base.en model by default, which offers a good balance of speed and accuracy. If you need better accuracy (at the cost of speed) or faster performance (at the cost of accuracy), you can switch to a different model.
| Model | Size | Speed | Accuracy | Best For |
|---|---|---|---|---|
tiny.en |
~75MB | Fastest | Decent | Quick testing, low-powered devices |
base.en |
~150MB | Fast | Good | ⭐ Default - good balance |
small.en |
~500MB | Medium | Better | Improved accuracy without too much slowdown |
medium.en |
~1.5GB | Slower | Great | High accuracy needs |
large |
~3GB | Slowest | Best | Maximum accuracy, multilingual |
Note: The
.ensuffix means English-only models, which are smaller and faster. Thelargemodel is multilingual (no.envariant).
You need to edit two files:
Change the model name in the download command:
# Change from:
./models/download-ggml-model.sh base.en
# To (for example, small.en):
./models/download-ggml-model.sh small.enBoth the 'gtk-app' and the 'web-app' have this same variable definition which tells it which whisper model to use.
# Change from:
WHISPER_MODEL = WHISPER_DIR / "whisper.cpp" / "models" / "ggml-base.en.bin"
# To (for example, small.en):
WHISPER_MODEL = WHISPER_DIR / "whisper.cpp" / "models" / "ggml-small.en.bin"# Download the new model
./setup-whisper.shNext you can restart the app.
Tip: You can have multiple models downloaded. Just change
whisper_server.pyto switch between them without re-downloading.
-
Build whisper.cpp and download the model:
./setup-whisper.sh
-
Run whichever app you prefer:
# Web app (browser-based) cd web-app && ./run.sh # GTK app (Linux desktop) cd gtk-app && ./run.sh
- Linux (Ubuntu/Debian tested) or macOS
- Python 3 with venv support
- ffmpeg
- Build tools (cmake, git, build-essential)
See each project's README for additional dependencies.

