Cactus Whistle is a compact 16.9 MB speech-to-text model for CPUs that we benchmark against Whisper Base on LibriSpeech samples. It transcribes a 3.5 s clip in 33 ms and returns words with timestamps and probabilities. Below we report 10.47% WER on a test-other sample, compare to greedy and beam Whisper Base, and examine streaming and long-audio behavior.
What is Cactus Whistle?
Cactus Whistle, by Cactus Compute, runs on a CPU, transcribes seven languages, and returns word timestamps and probabilities. Its model card claims a lead over Whisper Base on LibriSpeech, and it decodes with a five-beam search.
In this test we use Whistle via cactus-needle 3.2.0 with pinned dependencies and disabled anonymous telemetry. The package downloads Whistle’s weights, its engine, and Needle 3’s weights from Hugging Face; we pin both repos to fixed revisions and print SHA-256 hashes.
The page() helper reads the datasets-server rows API with rate-limit backoff, and load_audio() resamples clips to 16 kHz. All one-run figures were taken on an Apple M4, while published full-split numbers are quoted, not measured.
How to run Cactus Whistle on a CPU?
In brief: install cactus-needle 3.2.0, disable telemetry, pin repository revisions, and let the package fetch engine and Whistle weights from Hugging Face. Then prepare audio at 16 kHz and use the APIs for batch or streaming transcription with timestamps and probabilities.
In our notebook, we pinned dependencies, printed SHA-256 for files, fetched data via page() with rate-limit backoff, and used load_audio() for resampling. This made the run reproducible and ensured identical conditions for Whistle and Whisper.
How does Cactus Whistle perform (WER)?
On a test-other sample Whistle’s WER is 10.47%, near the quoted full-split 10.49%. On a paired subset it scores 10.27%, versus 12.46% for greedy Whisper Base and 10.83% for beam search.
The 2.19-point lead over greedy survives Holm correction, while the beam gap does not, so the baseline matters. Scoring used one normalizer, with 95% paired speaker-cluster bootstrap intervals deciding significance.
We drew a seeded sample of 300 rows per split and dropped clips longer than a single-pass window, leaving 299 per split. The first 100 test-other and 60 test-clean clips also went through Whisper to enable paired comparisons.
How does Cactus Whistle compare to Whisper Base?
Whisper’s default decoder is greedy with temperature fallback, while public LibriSpeech figures use beam search. Since Whistle itself uses a five-beam search, each comparison must name its baseline: Whistle leads greedy; against beam, there’s no significant gap.
| Metric | Cactus Whistle | Whisper Base (greedy) | Whisper Base (beam) |
|---|---|---|---|
| WER (paired subset) | 10.27% | 12.46% | 10.83% |
| Decoding | 5-beam search | Greedy | Beam search |
What are the speed and latency characteristics?
Whistle transcribes a 3.5 s clip in 33 ms. In streaming, the system re-transcribes recent audio and commits a word once two consecutive passes agree. Larger chunks increase waits.
Across eight same-speaker sessions with one-second chunks, streaming WER is 10.05% versus 10.41% when the same utterances are transcribed one by one. The difference is non-significant and the joins are artificial; this probes the mechanism, not conversation.
The median commitment time per word is 1.68 s after it ends. On two sessions the median rose from 0.78 s at half-second chunks to 3.44 s at two-second chunks.
Long audio and 30 s windowing
The README promises windowing beyond the 30 s single-pass limit. A shorter cut matches nearly word for word, but with the pinned 3.3.0 engine, a full long clip silently drops the middle, returning fewer than half the words and no error. The 3.2.0 engine rejects such audio with a RuntimeError instead.
Splitting at quiet points scored 3.75% WER versus 6.74% for fixed windows. One clip does not settle it, but the signal is clear.
Timestamps, probabilities, and cut stability
Without gold alignments we check constraints instead. Word times are monotonic on every inspected clip. Prepending 2.000 s of silence to twenty clips shifts the first word by a median of 2.000 s.
Cutting at a word’s end should reproduce its prefix, which holds on only a fifth of those twenty clips; this tests stability rather than end-time accuracy.
Probability is the stronger signal: words rated below 0.5 were wrong 69.2% of the time, versus 2.5% at 0.9 or above. For wrong words, AUROC = 0.916, compared to 0.509 for duration.
Часті питання
How to run Cactus Whistle on a CPU (how to run Cactus Whistle streaming)?
Use cactus-needle 3.2.0 with telemetry off and pinned revisions. The package fetches Whistle, engine, and Needle 3 weights from Hugging Face. Prepare audio at 16 kHz. For streaming, stream() re-transcribes recent audio and commits when two passes agree. Expect a median 1.68 s commitment time, rising with chunk size.
Cactus Whistle vs Whisper Base comparison — which is better?
On a paired subset, Whistle scores 10.27% WER vs 12.46% for greedy Whisper Base and 10.83% for beam. The 2.19-point edge over greedy survives Holm correction; the beam gap doesn’t. Always name the baseline: Whistle leads greedy; beam is roughly on par.
How much does Cactus Whistle cost (Cactus Whistle pricing)?
The source does not provide pricing. The model is a 16.9 MB CPU file, used via cactus-needle 3.2.0 that downloads weights and engine from Hugging Face. The article reports metrics (10.47% WER on test-other, 33 ms for a 3.5 s clip, 1.68 s median streaming commitment) but no cost information.
Who is it for and how to start?
If you need low latency, seven languages, timestamps, and probabilities on CPU, consider Whistle. Start with cactus-needle 3.2.0, pin revisions, resample to 16 kHz. For long recordings, split audio to avoid engine 3.3.0 pitfalls and to keep WER in check (e.g., 3.75% vs 6.74% in our example).
Based on MarkTechPost.