Cactus-Compute/whistle

Hugging Face Models Trending Models

Summary

Cactus-Compute 发布 Whistle,一个仅 16.9 MB 的端侧语音转文字模型,支持转录、词级时间戳和语音嵌入,可在手机、可穿戴设备、机器人及微控制器上无 GPU 运行,并在多项基准上与 Whisper 和 Moonshine 竞争。

Task: automatic-speech-recognition Tags: cactus-needle, whistle, speech-recognition, speech-to-text, on-device, edge, quantization, webassembly, automatic-speech-recognition, en, de, fr, es, it, nl, pl, license:apache-2.0, region:us
Original Article
View Cached Full Text

Cached at: 10/08/26, 12:31 PM

Cactus-Compute/whistle · Hugging Face

Source: https://huggingface.co/Cactus-Compute/whistle Cactus Whistle

A speech-to-text model for mobiles, wearables, robots, smart home, automotive and microcontrollers. The whole model is a single 16.9 MB file, and it runs on the same CPU engine asNeedle, from the same container and the same quantisation, with no dependencies and no GPU.

Whistle does three jobs, all of them on the device:

  • Transcription: 16 kHz mono audio, up to 30 seconds in one pass, in English, German, French, Spanish, Italian, Dutch and Polish. The language is detected unless you name it, and silence returns an empty transcript rather than an invented sentence.
  • Word timestamps: every word with its start, end and probability, aligned from the decoder’s own attention, so an app can highlight, seek or cut on a word.
  • Speech embedding: the encoder output, one row per 80 ms frame, for matching and retrieval without decoding a transcript at all.

Keyword biasing takes the names, places and product words your users actually say and favours them during the search, so the ones that matter survive.

https://huggingface.co/Cactus-Compute/whistle#modelModel

Whistle at a glance

Whistle is a log-mel front end and a convolutional stem feeding an audio encoder, read by a Needle-shaped decoder through gated cross attention at every layer. It reuses Needle’s\.cactcontainer, Cactus Quants, SIMD kernels and KV cache, so a device that already runs Needle runs Whistle in the same binary with no second runtime. The decoder is laddered the way Needle’s is: every depth from 2 layers up is a deployable model, picked at load time with\-\-audio\-depth. This repo holdswhistle\.cact; the engine and its platform folders are inCactus-Compute/needle3.

https://huggingface.co/Cactus-Compute/whistle#benchmarksBenchmarks

Word error rate on the full test splits, scored with the Whisper normalizers. Whisper and Moonshine figures are the ones their authors published.

Whistle against Whisper and Moonshine

  • Speed: 10 s of audio on an Apple M4 Pro, each model on its official runtime at its defaults: Whistle’s C++ engine at 5 beams,openai\-whisper, andmoonshine\-voicenon-streaming over whole audio. Time to first token is audio in to first token. Decode is tokens divided by the wall time after it, so the encoder is not counted twice.
  • Precision: Whistle 2 to 4 bit, Whisper fp32 in memory on the CPU, Moonshine int8.
  • WER: Whistle measured over 86,174 utterances. Whisper and Moonshine as published (Whisper paper Tables 9, 10 and 13, Moonshine paper Table 3). The Whisper row is the multilingual checkpoint, notbase\.en.
  • A missing barmeans that model’s authors never published that benchmark. Moonshine is English only; Whisper reports no SPGISpeech, Earnings-22 or AMI cleaned.
  • AMIincludes empty references, per the Open ASR Leaderboard convention. Whisper’s figure is AMI-IHM.TED-LIUMexcludes the corpus’signore\_time\_segment\_in\_scoringregions, as its scoring protocol specifies.
  • FLEURS and MLSare averaged over Whistle’s seven languages (MLS over six, no English), the same set for every model.
  • No test audio appears in Whistle’s training or validation data, verified by comparing audio checksums and speaker IDs across every reported test set.

https://huggingface.co/Cactus-Compute/whistle#get-startedGet started

pip install cactus-needle

The Python package and the source are onGitHub. A 16 kHz WAV or raw samples need nothing beyond the base install; other sample rates and microphone capture need the\[mic\]extra.

import needle

print(needle.transcribe("clip.wav")["text"])
# turn off the kitchen lights

Every call returns the text, the language, the milliseconds to the first token and the decoder’s tokens per second after it.word\_timestamps=Trueadds each word with its start, end and probability,keywords=\[\.\.\.\]favours the names your users say, andlanguage="de"forces the language instead of detecting it. The engine and the weights are fetched once and cached.needle\.Whistle\(\)is the same model as an object, forembed\(audio\)or to hold one tuned\.cact.needle whistle playgroundtranscribes from the microphone, andneedle whistle compareputs Whistle next to Whisper and Moonshine on the same clip.

https://huggingface.co/Cactus-Compute/whistle#with-needleWith Needle

One engine, three ways to load it

One engine runs both models.needle\_loadreads whichever model a\.cactcarries, so the same binary transcribes on its own, answers text on its own, or does both at once: it transcribes the clip, answers the transcript against your tools, and returns one JSON object with the tool calls and the speech fields, the speech ones prefixedaudio\_. The transcription stays inside the engine, so audio in and tool calls out is one call.

needle --model whistle.cact --audio clip.wav

needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav

https://huggingface.co/Cactus-Compute/whistle#deployDeploy

The engine and its platform folders live inCactus-Compute/needle3; every folder holds aneedlebinary,libneedle\.aandneedle\.h, and loads any\.cactyou hand it, this model or Needle or both.

One engine per platform folder

needle download macos-arm64
needle download whistle
./macos-arm64/needle --model whistle.cact --audio clip.wav --audio-word-timestamps

needle\_load,needle\_transcribeandneedle\_embedare the whole speech C API, declared inneedle\.hbeside Needle’s own, andneedle\_completetakes the clip directly and does the transcription for you. The engine reads no environment variables: every behaviour is a compiled default or an explicit flag, so every run of the same blob scores the same.

Thedevices guidecovers the runner flags, the C API, the WASI component and air-gapped setup.

https://huggingface.co/Cactus-Compute/whistle#citationCitation

Whistle is built by the Cactus Compute team. If you use it in your work, please cite:

@misc{whistle_2026,
  title        = {Whistle: Speech Recognition for Tiny Devices},
  author       = {Mroz, Jakub and Ndubuaku, Henry and Mosoyan, Karen and Cylich, Noah and
                  Kumar, Satyajit and Sandhu, Parkirat and Shemet, Roman and Lee, Justin H.},
  year         = {2026},
  organization = {Cactus Compute, Inc.},
  howpublished = {\url{https://github.com/cactus-compute/needle}}
}

Reach out on[email protected]for partnerships, collaborations, synergies and deploying Whistle in your product.

Similar Articles

@yibie: https://x.com/yibie/status/2109079699104399623

X AI KOLs Timeline

Cactus Compute releases Whistle: a 16.9 MB speech recognition model that runs on pure CPU, supporting seven European languages. Measured first-token latency of 5-8 ms and decoding speed of ~1300 tokens/sec. However, for unsupported languages (such as Chinese and Japanese), it does not throw errors — instead it silently outputs fake words, posing a risk of silent data corruption in production environments.

Whistle: Speech to Text in 16.9 MB (6 minute read)

TLDR AI

Cactus Compute releases Whistle, a 16.9 MB open speech recognition model running dependency-free on CPU across mobile, wearables, robotics, automotive and microcontrollers. It transcribes seven languages with word timestamps and speech embeddings, reaching first token in 11 ms, and shares Needle's C++ engine and quantisation.

Cactus-Compute/needle3

Hugging Face Models Trending

Needle 3 is a compact AI foundation model optimized for edge devices like mobiles and wearables, offering tool calling, structured extraction, and text embedding in a single 8-29 MB file.

@FakeMaidenMaker: Explosive! This open-source project converts text to human-like voice for free, can clone anyone's voice, and adjust timbre with text! GitHub has garnered 30K stars, from Mianbao Intelligent OpenBMB, VoxCPM previously topped both GitHub and HuggingFace charts. Do...

X AI KOLs Timeline

VoxCPM2 is an open-source speech synthesis model from OpenBMB, using a tokenizer-free diffusion autoregressive architecture, supporting 30 languages, voice design, and controllable voice cloning. It can clone a voice with just one sentence, or create a brand new voice using text, outputting 48kHz high-quality audio, and is commercially usable.