Speech to Text no longer needs the cloud: 16.9 MB and any CPU are enough

Written by Jason Miller

Whistle has arrived October 2 and focuses everything on compactness: a 16.9 MB filerunning on the CPU, zero external dependencies. Cactus targets it for smartphones, wearables, robots, home automation, automotive and microcontrollers, and loads it into the same C++ engine as Needle, from the same container and with the same quantization.

Three tasks, all done locally. Transcription accepts mono audio a 16kHz until 30 seconds for passage in English, German, French, Spanish, Italian, Dutch and Polish, with the language recognized on its own if it is not imposed. The are added timestamp for single word (start, end and probability, aligned by the decoder’s attention) and speech embedding, i.e. outputting the encoder at one line every 80 ms, without producing any text.

The front end frames the signal with a 25 ms window and 10 ms step up 80 bin log-mellimited to the 250-3500 Hz band and normalized per channel. Thirty seconds equals 3,000 frames, which a 128-channel convolutional stem with 9 kernels halves three times: 375one every 80 ms. From then on everything works at that frequency.

The encoder stacks eight Simple Attention blocks with four residual mHC lanes and a Monarch Hadamard MLP in place of the feed-forward network, with non-causal attention. The decoder uses eight more, laddered, width 512, 8 query heads versus 2 key-values, and engram searches at levels 3 and 7 on 18,432 slots. The only specific addition for speech is a cross attention with gate per level, calculated only once when the clip arrives and then kept in cache: five beams cost five transcription caches, not five audio readings.

High speed, partial record on precision

In terms of timing, the gap is evident. Whistle reaches the first token in 11.1 ms against 73.2 ms of basic Whisper and 22.8 ms of Moonshine tiny v2, and decodes at 1,319 tokens per second against 266 and 262. The behavior when varying the duration also matters: Whisper always fills the input up to 30 seconds, so it has a flat latency, while Whistle follows the clip and goes from 5.9 ms at 5 seconds up to 36.3 ms at 30 seconds.

As for accuracy, the picture is more nuanced, and it is worth saying this without enthusiasm. Whistle leads on LibriSpeech test-clean and test-other, SPGISpeech, Earnings-22 and on the FLEURS average, but Whisper base remains ahead on TED-LIUM, AMI and the MLS averagedespite taking with it 145.3 MB against 16.9. The error rates of the Cactus model are measured on 86,174 utterances with Whisper’s normalizers, while for the competitors the data published by the authors was taken.

The engine arrives pre-compiled for seventeen targetsfrom macOS and Linux up to Android, iOS, watchOS, Windows on ARM, RISC-V, MIPS, browser and WASI component, and each folder contains binary, static library and header. The C API for speech stops at three functions, does not read environment variables and only allows compiled defaults or explicit flags: the weights and code are on Hugging Face and GitHub.

The interesting point is the unification: the same binary transcribes a clip, interprets it against the declared tools and returns a single JSON object with the calls and speech fields, without the text ever passing through the calling code. Such a tight architecture makes life easier for integrators, but it also ties the voice pipeline to the choices of a single proprietary engine.

Jason Miller

I'm Jason Miller, and I've been passionate about technology and storytelling for over a decade. As a lead writer at Herald Editorials, I strive to bring clarity and creativity to complex tech topics. When I'm not writing, you'll find me exploring the latest gadgets or hiking in the great outdoors.