HNT/LOG/WHISTLE-SPEECHREVISION 2026.10.09STATUS: PUBLISHED
← Zurück zum Build Log agent // build-log

Speech Recognition in 16.9 MB: Why Whistle Matters for Agents on a Cheap Phone

Cactus shipped Whistle on October 2: speech recognition as a single 16.9 MB file, seven languages, first token in 11 milliseconds, CPU only, no cloud. I read the official report and set its numbers against my agent deck on a used Pixel 6a: 854 MiB of free RAM, five OOM kills in a week, and a browser sandbox as the first test path.

Speech Recognition in 16.9 MB: Why Whistle Matters for Agents on a Cheap Phone
SYSTEM NOTE // CURRENT BUILD● LIVE ARCHIVE
DEVICEGOOGLE PIXEL 6A
INPUTRII K06
ROOT ACCESSNONE
RUNTIMETERMUX / HERMES
READ THIS AS FIELD NOTES

Kein fertiges Produkt und keine Hochglanz-Rückschau: Dieser Eintrag hält fest, was gebaut, getestet, verworfen und als Nächstes überprüft wird.

On paper my agent running on a used Pixel 6a can do almost everything: plan, type, fire cron jobs, verify data through readbacks. What it cannot do is talk. Dictation routes through Android Voice Access, and the voice track ends up in the cloud, because a Whisper class model in the 800 MB range never fits the RAM budget. On October 2, 2026, Cactus addressed exactly that gap and shipped Whistle, a speech recognition model packaged as a single 16.9 MB file: no cloud, no dependencies, no GPU. On Hacker News the report went straight to the frontpage with 646 points by October 8. I read the official model report, took its measurements at face value, and set them against my own deck reality: 854 MiB of free RAM in the October 5 snapshot, five out-of-memory kills in seven days, a gateway alive 99 percent of the time. The question is simple. Is one 16.9 MB file enough to lift speech input into a pocket agent that lives on a 45 euro phone? The official report says yes. My deck numbers say the conditions fit, and the first test is smaller than you would think.

What Whistle is

What Whistle is can be said in one sentence: three jobs, one file. The first job is transcription: 16 kHz mono, up to 30 seconds in one pass, in English, German, French, Spanish, Italian, Dutch and Polish; the language is detected automatically unless you name it. The second job is word timestamps: every word with its start, its end and a probability, taken straight from the decoder's attention. The third job is speech embeddings: one row per 80 millisecond frame, produced without running a decoder at all, which is exactly what you need when an agent should classify audio rather than write it down. The engine is the same C++ binary that also carries the Needle language model; the two models load side by side, and pip install cactus-needle brings the entry point into a terminal. Cactus ships prebuilt builds for seventeen targets: macOS, Linux, Android, iOS, watchOS, Windows on ARM, RISC-V, MIPS, the browser and a WASI component, among others. The weights sit on Hugging Face, the source code on GitHub. Best of all, the announcement page carries its own sandbox: press the microphone, the model downloads into your browser tab on the first press, and per the documentation the audio never leaves the device.

16.9 MBWhistle as one file; Whisper base: 145.3 MB, Moonshine tiny v2: 41.9 MB
11.1 msTime to first token; Whisper base: 73.2 ms
1,319/sDecode tokens per second; Whisper base: 266/s
7Languages including English, with automatic detection
30 sMaximum clip length per pass
375Frames the engine squeezes 30 seconds of audio into
8 + 8Encoder and decoder blocks; a ladder from two layers up
86,174Utterances in the official word error rate measurement

The architecture, without the jargon

The architecture earns a look because it explains how the model stays this small. The front end is textbook: 16 kHz mono goes into 80 log-mel bins, framed with a 25 millisecond window and a 10 millisecond hop, band limited between 250 and 3,500 Hertz. Thirty seconds of audio become 3,000 frames; a convolutional stem halves that count three times, and everything downstream runs at 375 frames, one per 80 milliseconds. The encoder is eight simple attention blocks with four mHC lanes; a Monarch Hadamard MLP takes the place of the classic feed forward network. The decoder is a ladder of eight further blocks with grouped query attention, 8 query heads against 2 KV heads. On every rung the decoder reads the encoder through gated cross attention; the projections for that run once per clip and stay resident for the whole decode. That is why five beams cost five short cache slices instead of five passes over the audio. The odd duck is the ladder itself: every depth from two layers up was trained as a model of its own, and the parameter --audio-depth picks one at load time; the encoder always runs all eight blocks. The vocabulary holds 8,192 text pieces plus seven language tokens, and the detected language leaves the decoder as a token rather than as out-of-band metadata. Before decoding, the engine measures the clip's loudness range; below the threshold it returns an empty transcript and never starts the beam search at all.

The numbers, and how they were measured

Cactus ran its measurement series on an Apple M4 Pro with a ten second clip, every model in its official runtime: Whistle in the house C++ engine at five beams, Whisper through openai-whisper, Moonshine through moonshine-voice, all non streaming. The head to head numbers: 16.9 MB against 145.3 MB for Whisper base and 41.9 MB for Moonshine tiny v2. First token in 11.1 milliseconds, while Whisper needs 73.2 and Moonshine 22.8. Decoding runs at 1,319 tokens per second against 266 and 262. The first token value tracks the clip length: 5.9 ms at five seconds, 11.1 at ten, 36.3 at thirty; Whisper pads every input to 30 seconds, so its number stays flat no matter the clip. On accuracy Whistle leads, per its own measurement, on LibriSpeech test-clean and test-other, on SPGISpeech, on Earnings-22 and on the FLEURS average, while Whisper base stays ahead on TED-LIUM, on AMI and on the MLS average, at 8.6 times the file size. Scoring used the Whisper normalizers over 86,174 utterances, and the authors verified, through audio checksums and speaker IDs, that no test audio leaked into the training or validation set. All of these are official Cactus numbers measured on their hardware, not on my Snapdragon 730G. The transfer to an old phone is exactly why this stays an open test in my operation.

  1. September 2022

    OpenAI releases Whisper and starts the open source wave for on-device speech recognition; the base model weighs 145.3 MB according to the Cactus comparison.

  2. 28.08.2026

    OOM storm on the deck: five gateway deaths, Android wins; hardening follows, then the 88-hour record until September 1.

  3. 02.10.2026

    Cactus ships Whistle with the model report, benchmarks and a browser sandbox.

  4. 05.10.2026

    My position snapshot: 99 percent gateway aliveness over seven days (305 of 306 checks), 5 OOM kills, 854 MiB free.

  5. 07.10. to 08.10.2026

    The report reaches the HN frontpage; on October 8 I note 646 points and an active comment fight.

  6. 09.10.2026

    Review for this post; planned deck test: the model in a Chromium tab, measured next to the running gateway.

Why this matters on a 45 euro phone

My deck reality looks like this: the October 5 snapshot shows 854 MiB of free RAM on the Pixel 6a, the gateway held 99 percent aliveness over seven days, and five OOM kills in the same window tell you how tight it is. A Whisper class model in the 800 MB range never fits that budget, which is why my voice track runs through Android Voice Access and into the cloud. Whistle belongs to a different class: 16.9 MB fits fifty times over, and the architecture is built to share one engine with a small language model. Needle and Whistle load side by side in a single binary, and the Cactus example code turns audio straight into tool calls, JSON with a confidence value included. That pattern is familiar from the Desert Ant series: small specialist models carry the workload, large models come in only for exceptions. On the deck the benefit is concrete. The voice track never leaves the device, which is a privacy win, and word timestamps open a road to spoken command words, because keyword biasing walks an Aho-Corasick automaton right inside the beam search. The path I picked for the first test is the browser: the sandbox runs in a tab, the model loads with one microphone press, and I can measure transcription rate and RAM delta next to the live gateway without touching the operation itself.

The limits, honestly

The honest limits come first: 30 seconds per pass and no longer clips, seven languages and not one more; if you need Russian or Arabic, you wait. On three benchmarks Whisper base stays ahead, so the tiny file buys size and pays accuracy points there. All measurements come from Cactus' M4 Pro series, not from my deck, and a Cortex-A76 in a Snapdragon 730G is a different world, so the transfer stays a hypothesis until the measured test lands. The tool call snippet is a vendor demo, not my measurement. Integration also runs deeper than the file: the bridge into the terminal on the Android side still has to be built before speech reaches my operation, and that is the real work. What is realistic today is the browser path: a Chromium tab loads the model, it transcribes, and the gateway keeps running separately. Until the library stands in the terminal context, the voice track remains a sandbox matter, not a production one. Keyword biasing is tempting for wake words, but it is not part of my operation either.

Related posts

Related: Desert Ant Labs: 18 on-device models for audio, vision and text ↗

Related: Qwen 3.8 Flash Next locally with Strata on consumer GPUs ↗

Related: Agents need documentation, not memory ↗

Frequently asked questions

FAQ
What is Whistle?

An open source speech recognition model from Cactus, released on October 2, 2026. It ships as a single 16.9 MB file, runs on the CPU with no dependencies and shares its engine with the small language model Needle. It transcribes seven languages, produces word timestamps and speech embeddings.

How does Whistle compare to Whisper and Moonshine?

In Cactus' official series, Whistle weighs 16.9 MB, Whisper base 145.3 MB and Moonshine tiny v2 41.9 MB. First token arrives after 11.1 ms, against 73.2 ms for Whisper base and 22.8 ms for Moonshine. Decoding runs at 1,319 tokens per second for Whistle, 266 for Whisper base and 262 for Moonshine, measured on an Apple M4 Pro with a ten second clip.

Which languages does Whistle support?

English, German, French, Spanish, Italian, Dutch and Polish. The language is detected automatically or can be forced with a parameter. For a German speaking agent operation this means the voice track can stay on the device without a cloud detour.

Can I test Whistle without installing anything?

Yes. The Cactus announcement page carries a sandbox that runs in the browser tab; the model downloads on the first microphone press, and per the documentation the audio never leaves the device. That is the test path I have picked for the Pixel deck.

What does Whistle mean for agents on old phones?

It turns speech input into a local channel: 16.9 MB fits into a RAM budget where 800 MB models fail, and the shared engine with Needle shows how audio becomes tool calls directly. Limits remain the 30 second clip cap, the seven languages and the error rate, which trails Whisper base on three benchmarks.

About the author

About the author: I am Marcel, a graphic designer, and I run the HUNTER cyberdeck on a used Google Pixel 6a. I orchestrate my agent family with Hermes, pi and herdr and write these posts from live operation. Last fact-checked on October 9, 2026.

Sources

Sources: Cactus, Whistle: Speech to Text in 16.9 MB, official model report with architecture, benchmarks and sandbox, published October 2, 2026, retrieved October 9, 2026. Hugging Face, Cactus-Compute/whistle, model card, retrieved October 9, 2026. GitHub, Cactus-Compute needle, engine source code, retrieved October 9, 2026. Cactus, Simple Attention Networks, architecture report, retrieved October 9, 2026. Hacker News, frontpage observation of 646 points on October 8, 2026, my own observation.

Cactus: Whistle: Speech to Text in 16.9 MB (official report) ↗

Hugging Face: Cactus-Compute/whistle (model card) ↗

GitHub: Cactus-Compute, needle (source code) ↗

Cactus: Simple Attention Networks (architecture report) ↗

Community Signal

Nachgebaut oder getestet?

Teile deine Erfahrung mit genau diesem Build-Log. Reviews werden vor der Veröffentlichung moderiert.

Noch keine Reviews für diesen Eintrag.

GitHub Discussions

Fragen, Reaktionen und Verbesserungen werden direkt über GitHub Discussions eingebettet.

GitHub-Bereich öffnen ↗
Dein Testbericht

Erfahrung zurückmelden