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.
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, CSV and HF formats, and the optional Mozilla Data Collective import |
| docs/finetune-amd.md | Fine-tuning Whisper on AMD GPU via ROCm + Podman, merging, and inference testing |
| 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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file listenr-0.2.0.tar.gz.
File metadata
- Download URL: listenr-0.2.0.tar.gz
- Upload date:
- Size: 412.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d0394b78e5a5b6abaabb92812c95e675dead73e85e1d710de49120e1affc656b
|
|
| MD5 |
636fa00a41690444ea42e08c5b932aaf
|
|
| BLAKE2b-256 |
763987586104d9c882bccab115ac8bcb842d3acc1f3b212f5c2833260815c0ef
|
Provenance
The following attestation bundles were made for listenr-0.2.0.tar.gz:
Publisher:
release.yml on Rebreda/listenr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
listenr-0.2.0.tar.gz -
Subject digest:
d0394b78e5a5b6abaabb92812c95e675dead73e85e1d710de49120e1affc656b - Sigstore transparency entry: 2579436169
- Sigstore integration time:
-
Permalink:
Rebreda/listenr@9a7c5f0d2ad18f982aa6ebd11eedce3615a4e1bb -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Rebreda
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9a7c5f0d2ad18f982aa6ebd11eedce3615a4e1bb -
Trigger Event:
push
-
Statement type:
File details
Details for the file listenr-0.2.0-py3-none-any.whl.
File metadata
- Download URL: listenr-0.2.0-py3-none-any.whl
- Upload date:
- Size: 79.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
433f0ab3cb4b774a601f045a1b7617ec1e3cdc481640a616ead456438031d07b
|
|
| MD5 |
07dce4851fefe12d289e7b2f1ee21add
|
|
| BLAKE2b-256 |
f37bac6e52bd04187354623df8b3e3ff269b11ba10cbcf099680612b82aba299
|
Provenance
The following attestation bundles were made for listenr-0.2.0-py3-none-any.whl:
Publisher:
release.yml on Rebreda/listenr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
listenr-0.2.0-py3-none-any.whl -
Subject digest:
433f0ab3cb4b774a601f045a1b7617ec1e3cdc481640a616ead456438031d07b - Sigstore transparency entry: 2579436194
- Sigstore integration time:
-
Permalink:
Rebreda/listenr@9a7c5f0d2ad18f982aa6ebd11eedce3615a4e1bb -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Rebreda
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9a7c5f0d2ad18f982aa6ebd11eedce3615a4e1bb -
Trigger Event:
push
-
Statement type: