編按:本文綜合整理自 Cactus Compute 工程部落格、HuggingFace 模型卡、eesel AI 評測、Hacker News 討論串 與 r/LocalLLaMA 討論,並加入 Siami 編輯部觀點與分析。
舊金山新創 Cactus Compute 10 月 2 日開源了 Whistle——一個只用 16.9 MB 單一檔案、純 CPU 跑、不需要 GPU 的語音辨識模型。在 Apple M4 Pro 上,第一個字延遲 11.1 毫秒,解碼速度 1,319 tokens/秒,支援英、德、法、西、義、荷、波蘭七國語言。發布當週在 Hacker News 衝到 580 分、130 則留言,HuggingFace 首月下載 2,594 次,Apache 2.0 全開源。
Whistle 是什麼?
Whistle 是 Cactus Compute 為「沒有 GPU 的裝置」設計的語音辨識模型——手機、穿戴式裝置、機器人、智慧家庭、車用、微控制器都算它的目標。整個模型壓縮成一個 16.9 MB 的檔案,跑在同一顆 CPU 上,沒有任何外部相依。
關鍵設計哲學:與 Cactus 自家的文字模型 Needle 共用同一個 C++ 引擎、同一個容器、同一個量化格式。把音訊丟進同一個 binary,輸出直接是函式呼叫。
Cactus 的核心 demo 是這樣的:
needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav
輸出:
{
"function_calls": [{"name": "set_lights", "arguments": {"room": "kitchen", "on": false}}],
"confidence": 0.94,
"audio_text": "turn off the kitchen lights",
"audio_language": "en"
}
沒有 API key、沒有雲端往返、沒有 token 計費。語音進、文字+動作出,都在一台沒連網的裝置上完成。
三大功能:轉錄、時間戳、語音嵌入
Whistle 在裝置端做三件事:
| 功能 | 說明 |
|---|---|
| 轉錄 | 16 kHz 單聲道,單次最多 30 秒,英/德/法/西/義/荷/波蘭七語,自動偵測語言 |
| 字級時間戳 | 每個字附開始、結束、機率,從解碼器的注意力直接對齊 |
| 語音嵌入 | 編碼器原始輸出,每 80 毫秒一列,可不產文字直接做搜尋/比對 |
另外兩個小功能比看起來更實用:
- 關鍵字偏置(Keyword Biasing):可以傳入「Siobhan」「Krzysztof」這種罕見人名或產品名,搜尋會被拉向這些詞。
- 靜音處理:Whistle 遇到純靜音會回空字串,不會像 Whisper 風格的模型那樣憑空生出「Thank you.」這種鬼話。
Hacker News 實測用戶 zimpenfish 馬上吐槽:「我拿一集隨機電視節目跑,結果它在某些段落卡住,直接輸出 ‘Thank you.’——有一段甚至 60 秒對話全部吐這句。」
→ 靜音會處理,但長而混亂、超過 30 秒的音訊還是會掉進 filler 陷阱。
技術架構:語音前端 + Needle 文字解碼器
Whistle 的整個 pipeline 只有五步:
- 音訊前端:16 kHz 單聲道,25 ms 視窗、10 ms hop,切成 80 個 log-mel 頻帶(250-3500 Hz)。30 秒 = 3,000 幀。
- 卷積莖:128 通道、kernel 9,三次降頻取樣,變成 375 幀(每幀 80 毫秒)。
- 編碼器:8 個 Simple Attention block,4 條 mHC 殘差通道,Monarch Hadamard MLP 取代 FFN——直接共用 Needle 的 block,不是複製貼上。
- 解碼器:8 個 Laddered Simple Attention block,寬度 512,GQA 8q:2kv,3-tap 因果卷積,engram 查找在第 3 層跟第 7 層。
- 束搜尋 ×5:長度正規化對數機率,Aho-Corasick 自動機做關鍵字偏置。
關鍵工程巧思:編碼器的 K/V 每段音訊只算一次,5 個 beam 共用。 這代表 5 個 beam 的成本是「5 段短文字快取」,不是「5 次音訊編碼」。
解碼器是「階梯式」的——從 2 層到 8 層每個深度都單獨訓練成模型,載入時用 --audio-depth 選擇深度,在精度跟延遲間取捨。
跑分對決:Whistle vs Whisper base vs Moonshine
eesel AI 整理的完整 WER(詞錯誤率,越低越好)對照表:
| 測試集 | 音訊類型 | Whistle | Whisper base | 領先者 |
|---|---|---|---|---|
| LibriSpeech test-clean | 乾淨有聲書朗讀 | 4.31% | 4.9% | Whistle |
| LibriSpeech test-other | 困難有聲書朗讀 | 10.49% | 11.0% | Whistle |
| SPGISpeech | 金融電話會議 | 7.65% | (未公布) | Whistle(vs Moonshine) |
| Earnings-22 | 電話會議 + 口音 | 19.01% | (未公布) | Whistle(vs Moonshine) |
| FLEURS(7 國平均) | 多語讀稿 | 21.4% | 24.5% | Whistle |
| TED-LIUM | 錄音演講 | 7.61% | 更低 | Whisper base |
| AMI | 會議錄音 | 26.07% | 更低 | Whisper base |
| MLS(6 國平均) | 非英語有聲書 | 24.9% | 更低 | Whisper base |
照音訊類型讀這張表,模式很清楚:Whistle 在乾淨、單一講者、讀稿場景最強;在多人會議、講者重疊場景最弱。 AMI 會議錄音 26% 錯誤率代表每四個字就錯一個。
速度跟體積是另一個故事,這裡 Whistle 完全碾壓:
| 指標 | Whistle | Whisper base | Moonshine tiny v2 |
|---|---|---|---|
| 檔案大小 | 16.9 MB | 145.3 MB | 41.9 MB |
| 首字延遲(10 秒音訊, M4 Pro) | 11.1 ms | 73.2 ms | 22.8 ms |
| 解碼速度 | 1,319 tokens/s | 266 tokens/s | 262 tokens/s |
| 精度 | 2-4 bit | fp32 | int8 |
Cactus 的 headline 說「9x 體積、6x 速度」,eesel AI 算過:體積差距 8.6x、首字延遲差距 6.6x、解碼約 5x。差不多公平。
Whistle 的首字延遲會跟著音訊長度線性成長(5 秒 5.9 ms、30 秒 36.3 ms),而 Whisper 不管音訊多短都墊到 30 秒——這在短指令場景(智慧家庭、語音助手)差距會拉到最大。
為什麼這件事重要
Whistle 不是 SOTA 屠榜——它 7 國 WER 平均輸 Whisper base,會議錄音輸更多。但它的出現代表三個訊號:
1.「語音模型」跟「語言模型」會合併成同一個 binary。 Cactus 直接把 Whisper 風格的音訊前端,接到自家 Needle 文字模型,共用量化解碼器。未來一個 20-30 MB 的檔案可能同時做 ASR + 工具呼叫,不再需要串接雲端 LLM。 對 Apple Intelligence、Android AICore 這類系統級 AI 框架是直接威脅——你不再需要每年燒幾十億美元跑 inference。
2.「即時性優先」的端側應用找到了真正能用的解。 11.1 毫秒首字延遲,在沒網路、沒 GPU 的 50 美元 Android 上跑得起來。這不是 demo,是可量產的工程——Cactus 公開了完整 model card 跟 cactus run CLI,任何開發者今天就能 pip install cactus-needle 跑起來。
3.「小模型開源」這條路線被驗證可行。 Cactus 上一次爆紅是 5 月開源 Needle(26M 參數、蒸餾自 Gemini tool calling),這次 Whistle 沿用同一套架構,參數量翻倍到 55M(36M 啟用,MoE 風格),量化後還是塞在 17 MB 內。蒸餾 + 量化 + 共用引擎,這三件事組合起來,把「小而美」的邊界又往外推了一步。
Hacker News 上一句精準總結:
「It might not be as good as parakeet, but it gets you 80% of the way there.」 — theturtletalks, Hacker News(142 分)
Whistle 不是要取代 Whisper,而是把「可接受品質」的 STT 從雲端拉回裝置——這對隱私敏感、離線、嵌入式場景才是真正的 killer use case。
數據解讀與質疑
eesel AI 的實測數據有幾個值得拿出來檢視的地方:
- 「70/170 指令準確率」是怎麼來的? 一位 HN 測試者把 Whistle 跑在自由語音指令上,170 條只對 70 條;但把候選詞限制在固定清單(命令詞表),立刻跳到 164/170。這不是「模型不好」,而是 Whisper 風格的 ASR 本來就不該背自由語音命令——自由指令是 LLM 的事,Whistle 該做的是語音觸發跟文字萃取。
- 「11 ms 首字延遲」在 30 秒音訊會退化到 36 ms。 這是固定成本,跟 beam 數無關。如果你的場景是「按鈕按下 → 立刻聽寫」,OK;如果是「會議全程背景轉錄」,36 ms 累積起來不是問題,但 26% 會議 WER 才是。
- 「9x 體積」是跟 Whisper base 比。 跟 NVIDIA Parakeet(同等大小但 3-5% WER)、OpenAI Whisper large v3(差 10x 體積但 WER 接近人類)比,Whistle 的甜蜜點在「沒有 GPU、可接受品質、極小體積」這個交集。不是全方位贏家。
🚨 一個常被忽略的限制:Whistle 單次最長 30 秒。超過 30 秒的音訊需要串接(overlap 切割 + 結果合併),這部分 Cactus 沒給官方實作,開發者得自己接。
怎麼自己跑
# 1. 安裝 Cactus 引擎
pip install cactus-needle
# 2. 跑內建 sandbox
cactus run Cactus-Compute/whistle
# → 開瀏覽器,按麥克風講話,即時轉錄
# 3. 整合 Needle 做工具呼叫
needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav
# 4. 跟 Whisper/Moonshine 對照評測
cactus compare --audio clip.wav
# → 同時跑三個模型,給出 timing + WER
Weights 跟 model card 完全開源:
- HuggingFace: https://huggingface.co/Cactus-Compute/whistle
- GitHub: https://github.com/cactus-compute/cactus
- 原始 blog: https://cactuscompute.com/blog/whistle
網友熱門留言 (3)