按鍵說話,文字直接落在游標處。
輕巧的 macOS 選單列語音輸入,給整天中英混講的人用。 出來是台灣繁體中文,英文技術詞拼字不會爛掉。
100% 本機辨識 · 免 API key · 聲音不離開你的 Mac
cube control → kubectl
terra form → Terraform
p ninety five → p95
左邊是辨識常聽成的樣子,右邊是你本來要講的。這幾條 SayKey 內建就修掉了,連同 CloudWatch、PagerDuty、Datadog、CI/CD、5xx 一共 32 條。哪個詞它老是聽錯,你自己加一條,下一句就生效。
一般的 Mac 語音輸入不是假設你只講一種語言,就是把聲音送上雲端。SayKey 兩件都不做。中英混著講不用切輸入法,辨識用 whisper.cpp 跑在你自己的 Mac 上,不接 OpenAI API、不靠 Siri,飛航模式一樣能用。輸出一律轉成台灣繁體,软件變軟體、打印變列印。
跟 superwhisper、Wispr Flow 的差別:那些多是雲端辨識、英文優先;SayKey 是 100% 本機 whisper.cpp 辨識、輸出繁體中文、開源。想邊講邊看字浮出來的人可能會不習慣,SayKey 是講完一段才出字。
brew install --cask gary0413/tap/saykey這行會裝好 whisper-cpp 和 opencc、把語音和 VAD 模型抓進 ~/.saykey/models、安裝 App 並拿掉下載隔離,不會被 Gatekeeper 擋。裝完在「應用程式」打開 SayKey。
語音模型約 570MB。辨識整顆在本機跑,模型得先住在你的 Mac 上,所以第一次裝要多等幾分鐘。系統需要 macOS 13 以上,建議 Apple Silicon。
要改程式的話自己 build:
git clone https://github.com/gary0413/SayKey.git
cd SayKey
./scripts/bootstrap.sh
open dist/SayKey.appbootstrap.sh 會裝依賴、下載模型、建立本機簽章、編譯出 dist/SayKey.app。這條路要先有 Homebrew 和 Xcode Command Line Tools(xcode-select --install)。
打開後選單列會出現一顆麥克風圖示,第一次錄音時 macOS 會請求麥克風權限。
- 游標放在任何能打字的地方,Slack、瀏覽器表單、VS Code、終端機都行。
- 按 ⌥S 開始,說話,再按一次停止。螢幕下方會浮出錄音提示,完成時有音效。中途想放棄按 Esc。
- 文字進剪貼簿,⌘V 貼上。
第一句會慢一點,模型和 Metal 要暖機,之後就順了。
預設只走剪貼簿,這條路一個額外權限都不用給。想讓它自動幫你貼,到選單勾「自動貼上(需 Accessibility)」,macOS 會請你到「輔助使用」把 SayKey 打開,一台機器給一次就好。
辨識結果會留在選單「上一句:…」。忘記貼、或剪貼簿被別的操作蓋掉,點「重貼上一句」就好,不用重錄。
選單還可以開「登入時啟動」,頂部顯示目前版本;第一次啟動出現的簡短教學,之後隨時能從「使用教學…」重看。Homebrew 裝的人用 brew upgrade --cask saykey 更新。
whisper 偶爾會把某個詞聽成別的。這時候點選單「上一句聽錯了?加進字典…」,它會把剛剛那句抄進字典視窗的「錯詞」欄,游標直接停在「正確詞」。你把錯詞修剪成聽錯的那一段、填上正確的字,游標離開欄位就存好了,下一句立刻生效。
想自己整理整份對照表,開選單「字典…」,那是一張表格,不用碰 JSON。
準確度還有兩個地方能動。一是換模型,預設的 large-v3-turbo 準度和速度最划算,large-v3 更準但更慢也更吃資源。二是加你自己的詞彙:每次辨識前 SayKey 會先餵 whisper 一段術語提示,內容偏 SRE / DevOps,那是我自己每天在講的話。換個領域也能用,把服務名、產品名、內部縮寫放進 contextualTerms 就會接在那段提示後面一起送出,想整段換掉就自己寫 prompt。
用 Cursor、Claude Code 這類工具,最花力氣的通常不是 AI 寫程式碼,是把需求講清楚。按一次快捷鍵講完,剪貼簿裡就是一段拼字正確的繁中 prompt,貼進輸入框就好,kubectl、p95、Terraform 不會被聽爛。
prompt 裡難免帶到公司內部的服務名和架構。辨識全程在這台 Mac 上跑,聲音和文字都不會外流。
SayKey 不是用嘴寫 code,寫 code 的還是 AI,它只負責把腦袋裡的想法變成文字。
- 按 ⌥S 開始錄音,16 kHz 單聲道,再按一次停止。
- Silero VAD 先切掉靜音和雜訊,免得沒講話也生出字。
- whisper.cpp 用 large-v3-turbo 在本機辨識。
- OpenCC
s2twp轉成台灣繁體,再套一次術語修正表,標點和中英之間的空格一起整理好。 - 結果進剪貼簿;開了自動貼上就直接落在游標處。
多數人不用改,裝好就能用。要調的話選單列有視窗可以點,不必碰設定檔:「字典…」管你自訂的錯詞對照,「設定…」錄新的全域快捷鍵、開關自動貼上,兩邊都是改完即存。
手動改的話設定檔在 ~/.saykey/config.json,選單「開啟設定檔…」會建立一份範本,大致長這樣:
{
"whisperBinaryPath": "/opt/homebrew/bin/whisper-cli",
"modelPath": "~/.saykey/models/ggml-large-v3-turbo-q5_0.bin",
"language": "zh",
"hotkey": "option-s",
"autoPaste": false,
"convertToTraditional": true,
"enableVAD": true,
"soundFeedback": true,
"useServer": true,
"restoreClipboard": true,
"punctuation": "half",
"autoSpacing": true,
"contextualTerms": ["SRE", "AWS", "CloudWatch", "kubectl", "your-service-name"],
"termReplacements": {}
}| 設定 | 預設 | 作用 |
|---|---|---|
hotkey |
option-s |
全域快捷鍵。建議用選單「設定…」按一下錄新鍵,即時生效;手改這欄要重開 App。 |
autoPaste |
false |
開了會自動送 ⌘V,需要 Accessibility 權限。 |
language |
zh |
適合中文為主的混講,也可以改 auto 或 en。 |
modelPath |
turbo q5_0 | whisper 模型檔。越大越準,也越慢。 |
termReplacements |
內建 32 條 | 辨識後的固定修正,選單「字典…」有表格可以改。 |
contextualTerms |
SRE 詞庫 | 餵給 whisper 的術語。範本裡 your- 開頭的佔位詞不會真的送進辨識,記得換成自己的。 |
punctuation |
half |
標點策略,預設把中文全形標點轉半形。 |
autoSpacing |
true |
中文和英文、數字之間自動補空格:看CloudWatch的p95 會變成 看 CloudWatch 的 p95。 |
手寫 hotkey 至少要一個修飾鍵加一個鍵,例如 command-slash 就是 ⌘/。主鍵可以是 a–z、0–9、space、return、tab,或 slash comma period semicolon quote backslash minus equal grave leftbracket rightbracket 這些符號鍵。被系統占走的組合(像切輸入法的 ⌃⌥Space)在錄製器裡錄不到,錄不到時按「恢復預設快捷鍵」。這欄寫錯、解析不出來,SayKey 會直接用預設值啟動。
punctuation 三種:half 把中文全形標點轉半形,技術場景讀起來比較順;full 把貼著中文的半形標點轉全形,Hello, k8s、v0.12.0 這種純英文片段不會被誤動;keep 保留 whisper 原本的輸出。
其餘 12 個設定,多數人用不到
| 設定 | 預設 | 作用 |
|---|---|---|
convertToTraditional |
true |
用 OpenCC s2twp 把簡體轉台灣繁體,沒裝 opencc 會自動跳過。 |
enableVAD |
true |
Silero VAD 切掉靜音和雜訊,模型檔不在就跳過。 |
useServer |
true |
常駐 whisper-server,模型只載一次、不必每句重載,失敗自動退回 CLI。 |
soundFeedback |
true |
辨識完成播一聲短音效。 |
restoreClipboard |
true |
自動貼上後把你原本的剪貼簿內容還原。 |
whisperBinaryPath |
/opt/homebrew/bin/whisper-cli |
whisper-cli 路徑。 |
whisperServerBinaryPath |
/opt/homebrew/bin/whisper-server |
whisper-server 路徑。 |
openCCBinaryPath |
/opt/homebrew/bin/opencc |
opencc 路徑。 |
openCCConfig |
s2twp.json |
簡轉繁的用字風格。 |
vadModelPath |
~/.saykey/models/ggml-silero-v6.2.0.bin |
VAD 模型檔路徑。 |
extraTerms |
無 | 額外個人詞彙,和 contextualTerms 合併後餵給 whisper。 |
prompt |
自動組合 | 直接覆蓋整段 whisper prompt,會取代上面兩個 terms 的組合結果。 |
也可以用環境變數覆蓋,例如 SAYKEY_MODEL_PATH、SAYKEY_LANGUAGE、SAYKEY_AUTO_PASTE、SAYKEY_HOTKEY、SAYKEY_TERMS。
按了快捷鍵沒反應? 選單列有沒有麥克風圖示?沒有就是 App 沒開。第一次用要允許麥克風權限,選單「麥克風權限設定…」可以直接跳到那一頁。快捷鍵也可能被別的 App 佔走了,這種時候 SayKey 會自動退回預設鍵並浮出提示,也可以在「設定…」錄一組新的。
第一句特別慢? 正常,模型和 Metal 第一次要暖機。之後有常駐服務接手,每句都快。
開了自動貼上卻沒貼? 先確認 Accessibility 權限有勾,選單「輔助使用權限設定…」可以直接跳過去。另一種情況是錄音期間切換過視窗,SayKey 為了不貼進錯的 App 會改留在剪貼簿並浮出提示,手動 ⌘V 就好。
辨識出簡體字?
convertToTraditional 預設就會轉台灣繁體。曾經改成 false 的話改回 true,前提是機器上有裝 opencc。
我之前用 ⌃⌥Space,更新後會被改掉嗎? 不會,舊設定會保留。新安裝的預設是 ⌥S,因為 ⌃⌥Space 是 macOS 切輸入來源的鍵,會打架。想換到選單「設定…」按一下錄新鍵,即時生效。
怎麼完整移除?
brew uninstall --cask saykey # Homebrew 裝的(自己 build 的直接刪 dist/SayKey.app)
rm -rf ~/.saykey # 設定與模型(約 570MB)自己 build 產生的簽章憑證,在「鑰匙圈存取」搜尋 SayKey Local Signing 刪掉即可。
你的聲音會錄成暫存 wav,放在只有你自己讀得到的資料夾(0700),辨識完就刪掉,crash 殘留的下次啟動也會清。辨識全程在你的 Mac 上完成,不會上傳到任何外部伺服器,飛航模式照樣能用。剪貼簿會留著最後一段辨識結果,那就是你貼上的來源。
為了讓模型常駐、每句省掉一次載入,SayKey 會在你電腦裡開一個 whisper-server,音訊透過 127.0.0.1 交給它,這條連線走不出這台 Mac。不想開本機服務就設 useServer: false,改用 CLI 一句一句跑。
macOS 把 Accessibility 授權綁在 App 的程式碼簽章身分上。Ad-hoc 簽章的身分是每次編譯都會變的雜湊(cdhash),所以一重新編譯授權就失效。SayKey 改用本機專用的穩定自簽憑證(scripts/setup_signing.sh),把身分綁在憑證上,授權一次就一直有效,你改完程式重編也不用重給。私鑰只存在你的登入鑰匙圈、不會進 git,每台機器各自產一張。細節寫在 scripts/setup_signing.sh 和 scripts/build_app.sh 的註解裡。
MIT © 2026 Gary Yu
Built on whisper.cpp and OpenCC.
English speaker? SayKey is a local, privacy-first push-to-talk dictation tool for macOS, optimised for mixed Chinese–English ("code-switching") speech with Traditional Chinese output. Same install steps above.