Il 2 ottobre 2026 Cactus Compute ha rilasciato 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. 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 il confronto è con Whisper base e con Moonshine tiny v2 di Useful Sensors. 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, engine e cartelle piattaforma in Cactus-Compute/needle3. Licenza Apache-2.0. Il repo cactus-compute/needle è intorno alle 13.200 stelle.
Autori del post: Jakub Mroz e Henry Ndubuaku. La citation del model card aggiunge Karen Mosoyan, Noah Cylich, Satyajit Kumar, Parkirat Sandhu, Roman Shemet e Justin H. Lee, per Cactus Compute, Inc.
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
Testo: assistito da AI · revisionato da Carlos H. P. Ross





