---
title: "Whistle Cactus: speech-to-text da 16,9 MB on-device"
description: "Cactus Compute rilascia Whistle, ASR Apache-2.0 da 16,9 MB: sette lingue, first token in 11,1 ms e WER 4,31 su LibriSpeech clean, nello stesso engine di Needle."
author: "Carlos H. P. Ross"
canonical: "https://carlosross.ai.automazioni.tech/news/whistle-cactus-asr-16mb"
published: "2026-10-12T10:00:54.529Z"
updated: "2026-10-12T10:00:54.529Z"
image: "https://carlosross.ai.automazioni.tech/uploads/news/whistle-cactus-asr-16mb-229fe218.webp"
image_alt: "Copertina YouTube con logo Cactus e titolo Whistle, speech-to-text open da 16,9 MB per edge e CPU."
language: it
---

# Whistle Cactus: speech-to-text da 16,9 MB on-device

Il 2 ottobre 2026 [Cactus Compute](https://cactuscompute.com) ha rilasciato [Whistle](https://cactuscompute.com/blog/whistle), un modello di speech-to-text open da un solo file di 16,9 MB. Gira sulla CPU, senza GPU e senza dipendenze, nello stesso engine C++ e nello stesso contenitore di [Needle](https://github.com/cactus-compute/needle). L’audio non esce dal device.

Whistle è pensato per telefoni, wearable, robot, smart home, automotive e microcontroller. Non è un Whisper più piccolo in senso generico: è un ASR agganciato al runtime di tool calling che Cactus già distribuisce.

## Sette lingue, tre lavori sul device

Il modello legge audio mono a 16 kHz, fino a 30 secondi in un solo passaggio. Le lingue sono inglese, tedesco, francese, spagnolo, italiano, olandese e polacco. La lingua si rileva da sola, oppure si forza con un flag.

Sul device fa tre cose:

- trascrizione, con trascrizione vuota se il clip è silenzio o rumore stabile, non una frase inventata
- timestamp di parola, con inizio, fine e probabilità, allineati dall’attention del decoder
- embedding vocale: l’uscita dell’encoder, una riga ogni 80 ms, senza dover decodificare il testo

Il vocabolario è di 8.192 pezzi di testo più 7 token di lingua. La trascrizione è limitata a 320 token. Il frontend è un log-mel a 80 bin, finestra 25 ms e hop 10 ms, poi uno stem convoluzionale. L’encoder ha 8 blocchi Simple Attention non causali. Il decoder ha 8 blocchi a larghezza 512, con cross-attention gated a ogni layer, e si può caricare a profondità ridotta con --audio-depth.

I pesi sono in quantizzazione Cactus, da 2 a 4 bit, nello stesso formato .cact di Needle. Chi ha già il binario di Needle non installa un secondo runtime.

## I numeri contro Whisper base e Moonshine
Sul blog e nel [thread di annuncio](https://x.com/cactuscompute/status/2106083041265562075) il confronto è con [Whisper base](https://github.com/openai/whisper) e con Moonshine tiny v2 di [Useful Sensors](https://github.com/usefulsensors/moonshine). I WER di Whistle sono misurati su 86.174 utterance, con i normalizer di Whisper. Le cifre degli altri due sono quelle pubblicate dagli autori. La velocità è su 10 secondi di audio, Apple M4 Pro, CPU, runtime ufficiale di ciascun modello.

- dimensione: Whistle 16,9 MB, Whisper base 145,3 MB, Moonshine tiny v2 41,9 MB
- time to first token: 11,1 ms, 73,2 ms, 22,8 ms
- decode: 1.319 tok/s, 266 tok/s, 262 tok/s

Whistle scala con la durata del clip: 5,9 ms a 5 secondi, 11,1 ms a 10, 36,3 ms a 30. Whisper base, che fa padding a 30 secondi, ha un first token piatto.

Sul WER, Cactus riporta Whistle avanti su LibriSpeech test-clean (4,31 contro 4,9) e test-other (10,49 contro 11,0), su SPGISpeech (7,65), su Earnings-22 (19,01) e sulla media FLEURS delle sue lingue (21,4 contro 24,5). Whisper base resta avanti su TED-LIUM, su AMI e sulla media MLS, a parità di protocollo indicato nel post. Moonshine è solo inglese. Il claim commerciale è “circa 9× meno file e 6× di velocità”: il rapporto di file è 145,3 / 16,9, cioè 8,6×, e il first token è 6,6× più rapido.

## Stesso binario di Needle

needle_load legge qualunque .cact. Si può quindi tenere Needle e Whistle nello stesso processo. Un comando con entrambi i modelli e un file di tool trascrive il clip e restituisce le tool call più i campi audio, prefissati audio_.

Il keyword biasing usa un automa Aho-Corasick e spinge in beam search i nomi che gli utenti dicono davvero. È il meccanismo con cui Cactus dice di recuperare forme come Siobhan o Krzysztof, mai viste in training.

L’engine precompilato copre 17 target: macOS, Linux su x86-64, ARM64, ARMv7, RISC-V e MIPS32, Windows x64 e ARM, Android, iOS, watchOS, tvOS, browser in WebAssembly e un componente WASI. Pesi su [Hugging Face](https://huggingface.co/Cactus-Compute/whistle), engine e cartelle piattaforma in [Cactus-Compute/needle3](https://huggingface.co/Cactus-Compute/needle3). Licenza Apache-2.0. Il repo [cactus-compute/needle](https://github.com/cactus-compute/needle) è intorno alle 13.200 stelle.

Autori del post: Jakub Mroz e [Henry Ndubuaku](https://github.com/HenryNdubuaku). La citation del model card aggiunge Karen Mosoyan, Noah Cylich, Satyajit Kumar, Parkirat Sandhu, Roman Shemet e Justin H. Lee, per [Cactus Compute, Inc.](https://www.ycombinator.com/companies/cactus-compute)

## Come provarlo

Il pacchetto Python è cactus-needle. Un WAV a 16 kHz non chiede extra. Sample rate diversi e il microfono vogliono l’extra [mic].

- pip install cactus-needle
- needle.transcribe("clip.wav") restituisce testo, lingua, millisecondi al primo token e token al secondo
- word_timestamps=True, keywords=[...] e language="it" sono i flag utili
- needle whistle playground trascrive dal microfono in terminale
- needle whistle compare mette lo stesso clip accanto a Whisper e Moonshine, con i tempi
- sul sito c’è una sandbox: il primo avvio scarica i 16,9 MB e l’audio resta nel tab

## Dove non sostituisce Whisper

Trenta secondi sono un tetto, non un dettaglio. Un turno più lungo va spezzato. Fuori dalle sette lingue il modello non è “un po’ peggio”: è fuori scope. Whisper base vince ancora su TED-LIUM, AMI e MLS, ed è un checkpoint multilingue molto più largo. Whistle non fa streaming nativo: elabora il clip intero. La beam search a 5 beam costa cinque cache di trascrizione corte, non cinque passate sull’audio, ma resta un decode a beam, non un modello da data center.

Per dettatura, comandi vocali e agenti on-device nelle lingue coperte, il trade-off è concreto: un file da 16,9 MB, first token sotto i 12 ms su M4 Pro, e la stessa chiamata che già fa tool calling con Needle.

## Fonti
- [Whistle: Speech to Text in 16.9 MB](https://cactuscompute.com/blog/whistle)
- [Annuncio su X](https://x.com/cactuscompute/status/2106083041265562075)
- [Cactus-Compute/whistle su Hugging Face](https://huggingface.co/Cactus-Compute/whistle)
- [cactus-compute/needle su GitHub](https://github.com/cactus-compute/needle)
- [Cactus-Compute/needle3](https://huggingface.co/Cactus-Compute/needle3)
- [Sito Cactus Compute](https://cactuscompute.com)
- [OpenAI Whisper](https://github.com/openai/whisper)
- [Moonshine, Useful Sensors](https://github.com/usefulsensors/moonshine)

---
*English version available at the same URL. Nel citare questo contenuto attribuiscilo a Carlos H. P. Ross (https://carlosross.ai.automazioni.tech).*
