In this categoryLocal AI · 59
- How to Run Indra OCR Locally: a 1M-Parameter CPU Model That Hits 49 Pages a Second
- How to Run AuroraIMG-6M Locally: AuroraAI-Research's 6.82M-Parameter Text-to-Image Model
- How to Run Maya-1 Locally: a 3.3B-Parameter Text-to-Speech Model with Voice Design
- How to Run Sopro V2 Turbo Locally: a 120M-Parameter Voice Cloning TTS Model
- How to Run Kova TTS 1 Locally: a 1.25B-Parameter Voice Cloning Model for Narration
- How to Run Whistle Locally: Cactus's 16.9MB On-Device Speech Recognition Model
- How to Run Antalia-2 Mini Locally: a 7.6M-Parameter Turkish TTS Model
- How to Run Supra2-IMG Locally: SupraLabs' 104M-Parameter Text-to-Image Model
- How to Run VisionHOPE Locally: PSRben's Self-Modifying Vision Backbone
- Fish Audio S1-Mini: What It Is and How to Actually Try It
- How to Run SupraTTS-0.1-Beta Locally: A Tiny Glow-TTS Voice Model
- How to Run Nemotron 3 Diarization Locally: Streaming Speaker Tagging in 99M Parameters
- How to Run Freya-TTS Locally: A 183M-Parameter Turkish Text-to-Speech Model
- How to Run Audio8 ASR Infinite Locally: Streaming Speech Recognition That Never Stops
- How to Run TeleOCR Locally: One Model for Scanned and Photographed Documents
- How to Run Xing4.0-29B-A4B Locally: A 256K-Context MoE Model for Agent Tasks
- How to Run IndicF5 Locally: Voice Cloning for 11 Indian Languages
- How to Run Fish Audio S2 Pro Locally: Multilingual TTS with Inline Emotion Control
- How to Run ZDTaichu5.0-9B Locally: A 9.79B Vision-Language Model Built for Spatial Reasoning
- How to Run Qwen3-TTS-12Hz-1.7B-VoiceDesign Locally: Voice Design From a Text Description
- How to Run YuE2-3B Locally: Open Source Music Generation That Beats Suno v5 on Benchmarks
- MiniCPM5-2B: Install and Run OpenBMB's 2B Model That Outscores 4B Rivals
- BERT Base Uncased: Specs, How to Run It, and Why It's Still Trending in 2026
- How to Run tencent/AuK Locally: Zero-Shot TTS, Voice Cloning and Speech Editing
- Stable Diffusion 3.5 Medium: What's Different From SDXL and Flux
- Qwen-Image-2512: The Text-to-Image Model That Renders Real Text
- How to Run Irodori-TTS Anime Locally: Japanese Voice Cloning and Voice Design
- How to Run Breeze TTS 2 Locally: Voice Clone, Voice Design and Voice Direction
- How to Run Kokoro-82M Locally: the Fastest Open-Weight TTS Model
- How to Install Ollama on macOSStart
- How to Install Ollama on Windows
- How to Run Llama 3 Locally with Ollama
- How to Pick the Right Local AI Model for Your Hardware
- Best GGUF Models to Run by VRAM Tier (8GB, 12GB, 16GB, 24GB, 48GB)
- Run LLMs in Your Browser With WebGPU: No Install, No Server (WebLLM)
- How to Use Ollama as a Drop-In OpenAI API
- GGUF vs MLX vs NVFP4: Local AI Quantization Formats Explained
- Best GPU for Running AI Locally in 2026Start
- How Much RAM Do You Need for Local AI?
- Mac vs PC for Local AI: Which Should You Choose?
- How to Build a Local AI Workstation on Any Budget
- How to Set Up Local AI on 8GB of VRAM
- How to Set Up Local AI on 12GB of VRAM
- Best Local LLM for 16 GB VRAM: Setup, Quantization and Real Speed
- How to Set Up Local AI on 24GB of VRAM
- Best Local LLM on Mac M4 16 GB: Setup, MLX vs GGUF and Real Speed
- Best Local LLM on Mac M4 Pro 48GB: Setup, Quantization and Real Speed
How to Run Whistle Locally: Cactus's 16.9MB On-Device Speech Recognition Model
Whistle is a speech-to-text model from Cactus Compute that ships as a single 16.9 megabyte file and runs on CPU with no GPU and no internet connection. It transcribes seven languages, times every word, and shares its runtime with Cactus's Needle text model. Here is what it does and how to install it.
Whistle is an open-weight speech-to-text model from Cactus Compute built for phones, wearables, robots, smart home hardware and microcontrollers rather than servers. The entire model fits in a single 16.9 megabyte file, needs no GPU, and runs through the same CPU engine and quantization scheme as Cactus's Needle text model, so a device that already runs one can run both from one binary.
Written by Priya Raghunathan, local-AI hardware reviewer. I check parameter counts and hardware requirements against the primary source before recommending an install path.
A new top-20 entrant on Hugging Face's trending list
Whistle entered the top 20 of Hugging Face's overall trending list. At time of writing it has 267 likes and 5,558 downloads on the Cactus-Compute/whistle model page, and the cactus-compute/needle GitHub repo that runs it has 13,886 stars. The top linked community Space is tardellirs/model-pulse (199 likes).
Specs at a glance
| Field | Value |
|---|---|
| Publisher | Cactus Compute |
| Pipeline | Automatic speech recognition |
| Model file size | 16.9 MB (single .cact file) |
| Languages | English, German, French, Spanish, Italian, Dutch, Polish |
| Input | 16 kHz mono audio, any length (windowed beyond 30 seconds) |
| Architecture | Log-mel front end and convolutional stem feeding an audio encoder, read by a Needle-shaped decoder through gated cross attention |
| Runtime | Shared with Needle: same .cact container, Cactus Quants, SIMD kernels and KV cache |
| License | Apache 2.0 |
| Release date | September 30, 2026 |
| GitHub stars | 13,886 (cactus-compute/needle) |
What it actually does
Whistle handles three jobs on the device, with nothing sent to a server. Transcription turns 16 kHz mono audio into text in any of its seven languages, detecting the language automatically unless you name one, and it returns an empty transcript for silence instead of guessing at words that were never said. Word timestamps attach a start time, end time and probability to every word, pulled from the decoder's own attention rather than a separate alignment pass, which is what lets an app highlight or seek to a specific word. Speech embedding skips transcription entirely and returns the encoder's raw output, one row per 80 millisecond frame, for matching or retrieval tasks that do not need readable text.
Hardware: no GPU, one shared runtime
At 16.9 MB, Whistle is built to run on the same CPU budget as the rest of a device's firmware, not a dedicated accelerator. It reuses Needle's .cact container and quantization, so if a device is already running Needle for text, Whistle adds speech recognition without a second runtime, a second set of kernels or a second model format to manage. The decoder is also laddered the way Needle's is: every depth from 2 layers up is a separate deployable model, selected at load time with the --audio-depth flag, so a constrained microcontroller and a phone can both run Whistle at a depth that fits their budget from the same download.
Cactus benchmarked speed against OpenAI's Whisper and Useful Sensors' Moonshine by running 10 seconds of audio on an Apple M4 Pro, each model on its own official runtime at default settings: Whistle's C++ engine at 5 beams, openai-whisper, and moonshine-voice running non-streaming over the whole clip. Precision differed by design across the three: Whistle ran at 2 to 4 bit, Whisper at fp32 in memory, and Moonshine at int8. Word error rate was scored with the Whisper normalizers over 86,174 utterances for Whistle, against the figures Whisper and Moonshine published themselves, so treat the comparison as directional rather than a single controlled benchmark run on identical hardware and precision.
One engine, text and speech together
Because Whistle and Needle share a runtime, needle_load reads whichever model a given .cact file carries and the same binary can transcribe on its own, answer text on its own, or do both in one call. Handing the engine both a text model and Whistle at once means it transcribes an audio clip, runs the transcript against your tool definitions, and returns one JSON object containing both the tool calls and the speech fields, the audio-specific ones prefixed audio_. The audio never leaves the engine as a separate transcription step.
Install it
The Python package covers transcription, word timestamps and embeddings. A 16 kHz WAV file or raw samples work out of the box; microphone capture and other sample rates need the optional mic extra.
import needle
print(needle.transcribe("clip.wav")["text"])
# turn off the kitchen lightsEvery call returns the text, the detected language, the milliseconds to the first token and the decoder's tokens per second after that. Set word_timestamps=True to get per-word timing, pass keywords=[...] to bias toward specific vocabulary, or force the language with language="de" instead of letting it auto-detect. The engine and weights download once and are cached after that.
For deployment outside Python, the engine and its platform builds live in the companion Needle repo. Each platform folder ships a needle binary plus the C library and header, and loads any .cact file you point it at, Whistle, Needle, or both.
FAQ
What is Whistle?
Whistle is an open-weight speech-to-text model from Cactus Compute that ships as a single 16.9 MB file and runs entirely on-device, with no GPU, for transcription, word-level timestamps and speech embeddings.
Which languages does it support?
Seven: English, German, French, Spanish, Italian, Dutch and Polish. It detects the language automatically unless you pass one explicitly.
Do I need a GPU to run it?
No. Whistle runs on CPU through the same engine as Cactus's Needle text model, and is built specifically for phones, wearables and other devices that do not have one.
Can it run alongside a text model in one call?
Yes. Loading a text model and Whistle into the same Needle engine lets one call transcribe audio and reason over the transcript against your tool definitions, returning both results in a single JSON object.
What license is it under?
Apache 2.0.
Where to go from here
- Need speaker labels instead of just a transcript? Run Nemotron 3 Diarization locally covers a CPU-friendly model that tags who spoke when.
- Comparing it to another streaming speech model? Run Audio8 ASR Infinite locally covers a larger, GPU-oriented alternative built for 24/7 transcription.
- Browse other speech and audio models: the local AI model directory lets you compare specs side by side.
Local models run better with more VRAM. CompareRTX GPUs on Amazonbefore you upgrade.(affiliate link. We may earn a commission at no extra cost. Disclosure)
Watch related tutorials
9:42
10:30
11:05
9:50
13:30
16:45Weekly local AI drops
New models, what runs on your hardware, and the guides to set them up. One email a week, unsubscribe any time.