Whistle: speech to text in 16.9 MB
Whistle fits speech to text in 16.9 MB, DeepSeek 4.1 Flash runs all day for a dollar, and Opus 5.5 draws Invisible Cities
On Thursday's HN front page, Cactus Compute released Whistle, an open speech recognition model for phones, watches, robots and microcontrollers. It is one file of under seventeen megabytes, runs on the CPU with no dependencies, and transcribes seven languages: English, German, French, Spanish, Italian, Dutch and Polish.
An eighth the size of Whisper base
Whistle is an eighth the size of Whisper base and starts six times sooner
Model size · MB
First token · ms
Cactus timed ten seconds of audio on an Apple M4 Pro CPU. OpenAI's Whisper base is 145 megabytes, Moonshine tiny is 42, and Whistle is under 17. Whistle's first word comes out in 11 milliseconds, against 73 for Whisper base, which pads every clip to thirty seconds. On accuracy they split: Whistle makes fewer mistakes on audiobooks and earnings calls, and Whisper base makes fewer on TED talks and recorded meetings.
From a clip to a function call
One binary turns a spoken command into a function call
needle --model needle3.cact --model whistle.cact \
--tools tools.json --audio clip.wav
{"function_calls": [{"name": "set_lights",
"arguments": {"room": "kitchen", "on": false}}],
"audio_text": "turn off the kitchen lights"}
Whistle loads into the same C++ engine as Needle, the small tool-calling model Cactus already ships. Give that engine both models, a list of tools and an audio clip, and it transcribes the clip, matches the words against your tools, and returns one JSON object with the call. Your code never handles the transcript. The engine comes prebuilt for seventeen targets, from iOS and watchOS to RISC-V and the browser.
An Echo Show that never calls Amazon
Limited to a fixed set of commands, Whistle went from 70 right to 164 out of 170
Commands understood, of 170 · skolos’s Echo Show
In the thread, skolos describes taking over an Amazon Echo Show so that it never calls Amazon and does all its listening on its own CPU. Out of 170 spoken commands, Qwen's 1.7 billion parameter speech model, running on an RTX 5080, got 168 right. Whistle, transcribing freely, got 70. So skolos trained a tiny network to map Whistle's output onto a fixed list of command templates, and Whistle reached 164, spoken with what skolos calls a heavy accent.
DeepSeek 4.1 Flash for under a dollar
DeepSeek 4.1 Flash runs an all-day coding session for under a dollar
“DeepSeek 4.1 Flash uses 10× more tokens than GPT-6.1 Sol for an equivalent task”
Jono, who writes the blog Jono's Corner, has used DeepSeek 4.1 Flash heavily for a month across a dozen projects, and in the middle of a session can't tell it from Opus. On a ten dollar a month OpenCode Go plan it is close to unlimited, and a session rarely costs more than a dollar. The post credits the cache: DeepSeek's is roughly 437 times smaller than in its first model, and holding that cache in GPU memory is one of the big costs of a long session. In the thread, xzjis argues the cheap price is misleading, because Flash spends ten times the tokens of GPT-6.1 Sol on the same task and does it worse. Others add that the big labs' flat-rate subscriptions already buy more tokens than their API prices would.
Opus 5.5 and Invisible Cities
Given six hours to draw Invisible Cities, Opus 5.5 stopped after 85 minutes
In the city where every bridge is different, three of the model’s bridges cross nothing
Piotr Migdał gave two models the same prompt: a three.js visualization of all 55 cities in Italo Calvino's Invisible Cities, in one shot, with six hours to make it a masterpiece. GPT-6 Astra finished in 53 minutes, for about ten dollars of API tokens. Opus 5.5 ran six subagents in parallel, said it had used about half the time, and actually stopped at an hour and 25 minutes, for about 74 dollars. Migdał calls the result mesmerizing. Readers of the book were cooler. SiempreViernes opened a city known for bridges that are each different, and found three bridges sitting in the river, crossing nothing at all.
A kernel in Embedded Swift
A Swift kernel boots in QEMU once it writes its own putchar
Swift kernel ready. > hello kernel hello kernel
Antonin wrote a minimal kernel in Embedded Swift, the subset of Swift for machines with no operating system, and boots it on QEMU's ARM virt machine. With no C library underneath, the linker could not find putchar or memmove, so the post writes both in Swift, and putchar stores each byte straight into the emulated serial port's register. The kernel now echoes whatever you type, checking the port in a busy loop. In the thread, Narishma calls it more of a hello world than a kernel, and the post ends on its to-do list: interrupts, backspace and a command parser.


















