← 返回 Siami 首頁

16.9 MB 就能聽懂你說話:Cactus Whistle 把語音辨識塞進 CPU 就能跑的小模型

▲ 580 💬 130
16.9 MB 就能聽懂你說話:Cactus Whistle 把語音辨識塞進 CPU 就能跑的小模型

編按:本文綜合整理自 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 只有五步:

  1. 音訊前端:16 kHz 單聲道,25 ms 視窗、10 ms hop,切成 80 個 log-mel 頻帶(250-3500 Hz)。30 秒 = 3,000 幀。
  2. 卷積莖:128 通道、kernel 9,三次降頻取樣,變成 375 幀(每幀 80 毫秒)。
  3. 編碼器:8 個 Simple Attention block,4 條 mHC 殘差通道,Monarch Hadamard MLP 取代 FFN——直接共用 Needle 的 block,不是複製貼上。
  4. 解碼器:8 個 Laddered Simple Attention block,寬度 512,GQA 8q:2kv,3-tap 因果卷積,engram 查找在第 3 層跟第 7 層。
  5. 束搜尋 ×5:長度正規化對數機率,Aho-Corasick 自動機做關鍵字偏置。

關鍵工程巧思:編碼器的 K/V 每段音訊只算一次,5 個 beam 共用。 這代表 5 個 beam 的成本是「5 段短文字快取」,不是「5 次音訊編碼」。

解碼器是「階梯式」的——從 2 層到 8 層每個深度都單獨訓練成模型,載入時用 --audio-depth 選擇深度,在精度跟延遲間取捨。


跑分對決:Whistle vs Whisper base vs Moonshine

eesel AI 整理的完整 WER(詞錯誤率,越低越好)對照表:

測試集音訊類型WhistleWhisper 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 完全碾壓:

指標WhistleWhisper baseMoonshine tiny v2
檔案大小16.9 MB145.3 MB41.9 MB
首字延遲(10 秒音訊, M4 Pro)11.1 ms73.2 ms22.8 ms
解碼速度1,319 tokens/s266 tokens/s262 tokens/s
精度2-4 bitfp32int8

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 完全開源:


參考來源

網友熱門留言 (3)

#1 zimpenfish (Hacker News) ▲ 184
Tried it on a random TV episode and it seems to get stuck sometimes where it just outputs "Thank you." as a default - at one point emitting that for 60s of dialogue
#2 theturtletalks (Hacker News) ▲ 142
It might not be as good as parakeet, but it gets you 80% of the way there.
#3 r/LocalLLaMA 網友 ▲ 96
Whistle is 55m params (36m active) and CQ2bit quantised, amounting to a 16.9MB file that scores 4.31 WER on LibriSpeech test-clean and 10.49 on test-other.