Listenr
Build better speech-to-text and ASR models entirely on your machine.
Record your voice. Clean it up with local AI. Fine-tune Whisper or Moonshine. Deploy something that's actually yours.
Walkthrough | Setup | Configuration | Recording | Dataset | Troubleshooting
How it works
- Create good data - Use Listenr to record and collect natural speech with domain-specific vocabulary that generic models miss.
- Process & improve - Pipe it through Lemonade or any OpenAI-compatible provider to transcribe with Whisper and automatically correct grammar, punctuation, and homophones using a local LLM.
- Fine-tune & deploy - Use Listenr to build train/dev/test splits and fine-tune Whisper or Moonshine with LoRA. Merge the adapter into a self-contained model you can deploy.
Everything stays local - no audio, text, or weights ever leave on your machine.
Get started
Install Lemonade and pull models:
Lemonade guide: lemonade-server.ai/docs/guide/install
# after installing locally, download default models
lemonade pull Whisper-Base
lemonade pull gpt-oss-20b-mxfp4-GGUF
Install Listenr and start recording:
uv tool install listenr # or: pipx install listenr
listenr record # start recording
On PyPI. Python 3.11 or newer. The core install covers recording, transcription and dataset building; fine-tuning and the dataset importers live behind extras, listed in docs/setup.md.
On an AMD GPU, install a ROCm torch before the finetune extra, or pip will
resolve a CUDA wheel that cannot see your card. See
docs/setup.md.
Working on Listenr itself? Clone the repo and uv pip install -e ".[dev]" instead.
Once you have recordings, process & fine-tune:
# Build train/dev/test splits from your manifest
listenr build-dataset --format hf
# Fine-tune Whisper or Moonshine (see docs/finetune-amd.md for AMD GPUs)
podman compose run --rm finetune
# Merge the LoRA adapter into a standalone model
podman compose run --rm merge
# Evaluate it on the held-out test split
listenr eval --compare-base --keyword YourDomainWord
See docs/setup.md for full installation details.
If you want to mix in an external ASR dataset, use the optional importers to
write a separate Listenr-compatible manifest: listenr import-mdc <dataset-id>
(Mozilla Data Collective) or listenr import-hf <dataset-id> (Hugging Face): then pass that manifest to listenr build-dataset alongside your normal one.
See docs/dataset.md for details.
Under the hood
Recording & transcription - Listenr streams your microphone to Lemonade's /realtime WebSocket in ~85 ms chunks (16 kHz). Lemonade's voice activity detection segments speech, runs Whisper.cpp, and streams back transcripts.
Auto-correction - A local LLM cleans up punctuation, grammar, and homophones, producing a higher-quality training corpus than raw Whisper output alone.
Dataset & fine-tuning - Listenr saves each utterance as a .wav clip and a line in manifest.jsonl. One command builds train/dev/test splits in HuggingFace format. Another command fine-tunes any openai/whisper-* or UsefulSensors/moonshine-* model using LoRA (works on AMD and NVIDIA GPUs via Podman). Moonshine is the smaller, English-only, edge-oriented option; Whisper is the multilingual all-rounder.
Deployment - listenr merge folds the LoRA adapter into a self-contained model that loads with plain transformers. No PEFT dependency. Run inference locally or deploy it anywhere.
Commands
| Command | What it does | Needs |
|---|---|---|
listenr record |
Record from the microphone with live transcription | core |
listenr asr |
Transcribe an audio file | core |
listenr retranscribe |
Re-run Whisper on saved clips | core |
listenr build-dataset |
Build train/dev/test splits from recordings | core |
listenr categorize |
Filter a manifest to clips matching topics | categorize |
listenr import-mdc |
Import a Mozilla Data Collective dataset | mdc |
listenr import-hf |
Import a Hugging Face dataset | hf |
listenr finetune |
Fine-tune Whisper or Moonshine with LoRA | finetune |
listenr merge |
Merge a LoRA adapter into a standalone model | finetune |
listenr eval |
Evaluate the merged model on the test split | finetune |
Extras install with uv pip install "listenr[finetune]". Running a command
without its extra prints the install line you need.
Documentation
| Guide | Description |
|---|---|
| docs/setup.md | Installation, Lemonade Server, microphone setup |
| docs/configuration.md | Full config.toml reference, VAD tuning, available models |
| docs/recording.md | CLI usage, how recording works, batch transcription |
| docs/dataset.md | Building train/dev/test splits, importing public corpora, and filtering by topic |
| docs/finetune-amd.md | Fine-tuning on an AMD GPU via ROCm and Podman, merging, and evaluation |
| docs/troubleshooting.md | Common errors and fixes |
Acknowledgments
- Lemonade Server - unified local inference API
- whisper.cpp - fast local ASR
- llama.cpp - fast local LLMs
License
Mozilla Public License Version 2.0 - see LICENSE.
Metadata
Release files for listenr 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| listenr-0.2.1.tar.gz | 413.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| listenr-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 493.9 kB
Release files / listenr-0.2.1.tar.gz
| Download URL | listenr-0.2.1.tar.gz |
|---|---|
| Size | 413.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e248a5169f7ef59d7a09f1288e2a8c6acdbe22f1732b0f491e93bffa36ee2d5c
|
|
BLAKE2b-256 checksum How to use checksums |
ea02894322ebc438ca6eefdb6c58a299bd005ac59c863eb18ba1af5362e41292
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 24, 2026.
Transparency logRelease files / listenr-0.2.1-py3-none-any.whl
| Download URL | listenr-0.2.1-py3-none-any.whl |
|---|---|
| Size | 80.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c51c4807ed8664959397742d058e1437e7018b307ba09e1cdaf58a86bdb0ba58
|
|
BLAKE2b-256 checksum How to use checksums |
f07d23456ab7d4ac039d84ea1fcc00c64dce84b07388e4b3b52b90752763199b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 24, 2026.
Transparency log