Whistle is an open source model from Cactus Compute for transcribing audio to text locally: it takes up just a single 16.9 MB file, runs on CPU without GPU and understands Spanish. It’s roughly one eighth the size of Whisper base, which weighs 145.3 MB. It was released on October 2 under the Apache-2.0 license, according to its card on Hugging Face, and you can already install it with pip.
What is Whistle?
Whistle is an on-device speech to text model designed for hardware where Whisper doesn’t fit comfortably: Cactus mentions phones, wearables, robots, smart home devices, cars and microcontrollers. It runs inside the same C++ engine as Needle, the company’s small tool calling model. That engine lives in the cactus-compute/needle GitHub repository, which has 13.7k stars.
It does three things, all on the device:
- Transcription. Mono audio at 16 kHz, up to 30 seconds per pass, in English, German, French, Spanish, Italian, Dutch and Polish. It detects the language automatically, unless you tell it otherwise.
- Word-level timestamps. Each word comes with its start, end and probability.
- Voice embeddings. Returns the encoder output, one row every 80 ms, without generating a transcription. Useful for comparing and searching audio snippets.
It also supports keyword biasing: you pass it the names and product terms that your users actually say, and the decoder favors them. If the audio is silence, it returns an empty transcription instead of making up a sentence.
How do I transcribe audio to text with Whistle?
You need three steps: install the package, import it and call transcribe.
pip install cactus-needle
import needle
print(needle.transcribe("clip.wav")["text"])
The engine and weights download the first time and stay cached. A 16 kHz WAV doesn’t need anything beyond the base installation. For other sample rates or to capture from the microphone, add the [mic] extra, which installs soxr and sounddevice:
pip install "cactus-needle[mic]"
Useful options in the same call:
word_timestamps=Truereturns each word with its times and probability.keywords=[...]guides the decoder toward the terms you pass it.language=sets the language instead of detecting it.
Each call also reports milliseconds to the first token and decoding speed in tokens per second. From the terminal, needle whistle playground transcribes live what you say into the microphone.
Whistle or Whisper: which is more accurate?
It depends on the dataset, and the honest answer is a tie split. Cactus publishes all these figures: Whistle’s error rates were measured on 86,174 sentences, and those for Whisper and Moonshine are what the authors of those models published, not a new run done by Cactus.
Against Whisper base:
| Benchmark | Winner |
|---|---|
| LibriSpeech test-clean | Whistle |
| LibriSpeech test-other | Whistle |
| FLEURS (average, 7 languages) | Whistle |
| TED-LIUM | Whisper base |
| MLS (average, 6 languages, no English) | Whisper base |
| SPGISpeech, Earnings-22 | Whisper didn’t publish a figure |
| AMI | Not comparable (Whisper reports a different subset) |
Two nuances matter:
- Numerical precision isn’t the same. Whistle runs quantized to 2–4 bits; Whisper ran in fp32.
- Language coverage isn’t either. Whisper covers far more languages than Whistle’s seven. If you need one outside that list, Whistle isn’t an option.
Cactus claims that no test audio appears in Whistle’s training or validation data, and verified it by comparing audio checksums and speaker IDs.
The most useful command for any reader is needle whistle compare: run the same clip through Whistle, Whisper and Moonshine, side by side, with their times. Your audio, your accent and your microphone will tell you more than any chart.
Is Whistle faster than Whisper?
In Cactus’s benchmark, yes, and by a lot. The test used 10 seconds of audio on the CPU of an Apple M4 Pro, with each model in its official runtime and with the default configuration.
| Whistle | Whisper base | Moonshine tiny v2 | |
|---|---|---|---|
| Size | 16.9 MB | 145.3 MB | 41.9 MB |
| Time to first token | 11.1 ms | 73.2 ms | 22.8 ms |
| Decoding | 1,319 tok/s | 266 tok/s | 262 tok/s |
Whisper pads every input to 30 seconds, so its time to first token is the same regardless of clip duration. Whistle’s grows with the clip: 5.9 ms at 5 seconds and 36.3 ms at 30 seconds.
Does Whistle perform better than Whisper for Spanish?
Whistle transcribes Spanish and detects the language on its own, but in accuracy the result is mixed:
- Whistle wins on the FLEURS average, which includes Spanish.
- Whisper base wins on the MLS average, which doesn’t include English and also includes Spanish.
The published charts show averages, not the breakdown by language. Another reason to run compare with your own Spanish recordings before you decide.
Is Whistle free? Convert audio to text free and without the cloud
Yes. The weights and engine are licensed under Apache-2.0, according to the Hugging Face card and the GitHub repository. Inference runs on your machine, so there’s no cost per API minute.
One detail worth knowing: the cactus-needle package sends anonymous usage telemetry (function name, package version and operating system). Cactus assures it never collects prompts, outputs or data. You can turn it off with NEEDLE_TELEMETRY=0 or DO_NOT_TRACK=1.
Does Whistle work on Windows?
Yes. The engine is distributed with precompiled binaries in the Cactus-Compute/needle3 Hugging Face repository, with folders for these platforms:
- Windows:
windows-x86_64andwindows-arm64 - Linux: x86_64, ARM, RISC-V and MIPS
- macOS: Apple Silicon (
macos-arm64) - Mobile and wearables: Android, iOS, tvOS and watchOS
- Browser: WebAssembly
At the time of publishing this note, that list didn’t include a version for Mac with Intel processor.
To use the binary directly, without Python:
needle download macos-arm64
needle download whistle
./macos-arm64/needle --model whistle.cact --audio clip.wav --audio-word-timestamps
What limitations does Whistle have?
- 30 seconds per pass. Long recordings (meetings, interviews, podcasts) need to be divided into snippets first.
- Seven languages. English, German, French, Spanish, Italian, Dutch and Polish.
- Benchmarks published by the manufacturer itself. The figures for competitors are what their authors published, not a direct comparison under the same conditions.
- Mono input at 16 kHz in the base installation. Other formats need the
[mic]extra.
Can Whistle convert voice into tool calls?
Yes, if you load it alongside Needle. The same binary loads both models:
needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav
The engine transcribes the clip, matches the transcription against the tools you declared and returns a single JSON object with function calls, the transcribed text and the detected language. Audio goes in and structured action comes out, with no server in between. Together the two models total around 52 MB.
How about you? What do you use today to transcribe audio to text on your own machine?
- Whisper or another model locally
- A cloud service
- I don’t transcribe audio yet
- I prefer another option (tell us which)
Comment below or, if this article reached you by email, reply directly to the email: your reply will be published here.
