Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

Speech-to-Markdown 把口說整理成 Markdown,標榜 100% 本機。實測 repo 與 App Store 列表發現 macOS 版要自架 whisper.cpp 與本地 LLM 伺服器,iPhone 版反而零設定。本文拆解兩個 App 的不對稱、無 LICENSE 的授權落差、未簽名 build 的 Gatekeeper 代價,以及與 Wispr Flow、Superwhisper 的反向定位。
用 AI 摘要這篇文章:
把口說直接整理成 Markdown 的工具,這兩年多數走雲端路線:你對著麥克風說話,音訊送到 OpenAI、Deepgram 或 Whisper API,再由 GPT-4o 或 Claude 把逐字稿順成結構化文件。Speech-to-Markdown 走反向:README 寫著「100% local」「Nothing leaves your Mac」,App Store 標籤是「Data Not Collected」。這三句口號是真的,但條件很實在:macOS 版的「在地化」是把你自己的 Mac 變成一座小型運算站,麥克風、whisper.cpp、本機 LLM 伺服器全要你自己張羅。有趣的是 iPhone 版反而什麼都不用裝。
這篇是把這個由獨立開發者 Igor Steblii(GitHub 帳號 xajik,新加坡)維護、三個多月大、目前只有十顆星星的早期工具,從授權、簽名、平台差異、實際依賴一路檢驗到定位。它與 TechMoon 先前介紹過的 OpenLess 開源語音輸入工具、FreeFlow macOS 語音聽寫工具、Input 0 本機轉錄 是同一條「地端聽寫」光譜上的不同取樣,而它的關鍵差異藏在兩個 App 的不對稱裡。
Speech-to-Markdown 同時是一個 macOS 選單列 App 與一個 iOS App,但兩者把「100% local」這個承諾放在不同的責任主體上。差別大到「同一個產品」這句話需要加但書。
| 面向 | macOS 13+ 選單列 App | iOS 26+ / iPadOS App |
|---|---|---|
| 語音轉文字 | whisper.cpp(要自己裝) | Apple SpeechAnalyzer(系統內建) |
| 格式化 LLM | 使用者自架的本機 OpenAI 兼容伺服器 | Apple Foundation Models(Apple Intelligence) |
| 相依套件 | whisper-cpp、ffmpeg、Xcode、本地 LLM 伺服器 | 無 |
| 設定動作 | brew、install.sh、自己簽署、給麥克風與輔助使用權限 | 下載、打開、按錄音 |
| 最低硬體 | 任何 macOS 13 以上機構(M 或 Intel 機都可build) | iPhone 15 Pro 以上、Apple Silicon iPad、需開啟 Apple Intelligence |
| 網路需求 | 全程本機 | 全程本機(飛航模式也可用) |
iOS 版的零設定並非作者特別呵護蘋果平台,而是 Apple 在 iOS 26 把 SpeechAnalyzer 與 Foundation Models 開出來之後,端側 LLM 第一次具備「下載即用、不用懂模型」的條件。它的代價是硬體門檻:必須是 iPhone 15 Pro 以後的 Apple Intelligence 機種,以及 iOS 26 以上。放在 2026 年中,這個條件把 Android、較舊的 iPhone、未升級系統的使用者直接排除在外。

macOS 版的設定負擔剛好倒過來。它的 README 與 install.sh 都假設你已經裝好 Homebrew 與 Xcode(不是 Command Line Tools,是完整的 Xcode),並且會用終端機。腳本會把 whisper-cpp、ffmpeg、xcodegen 一併裝好,再把 repo clone 進 ~/.stmd/src 跑 make install。Agent Mode 還需要你在背景跑一個 OpenAI 兼容的本機 LLM 伺服器(omlx、Ollama、LM Studio、llama.cpp 任選),預設端口是 http://127.0.0.1:8000/v1。換句話說,地端保證不是開箱即用,而是「你自己營運一座小型 LLM 基礎設施」。
語音-to-md.xajik0.workers.dev 官網掛著「Free & open source」徽章,README 也用「open-source build」形容未簽名的 macOS 版。但實際把 repo 翻開,github.com/xajik/voice-to-md 沒有任何 LICENSE 檔,GitHub API 回傳的 license 欄位是 null。在多數司法管轄區,沒有授權條款的程式碼預設是「保留一切權利」(all rights reserved):你可以下載、編譯、自己用,但不能主張你有權修改、重分發或商業利用。
這與「open source」的字面承諾有顯著落差。OSI(開放原始碼促進會)對 open source 的定義要求授權條款允許自由再散布與衍生;沒有 LICENSE 的 repo 法律上不構成 open source,頂多是 source available。如果你打算把 Speech-to-Markdown 包進自家產品、或拿原始碼改作,這個落差會直接咬到你。對單純使用者影響較小,但仍值得知道:作者口中的 open source 是工程師口語,不是法律意義。
把 macOS 版裝起來的路徑分兩段:先裝 whisper.cpp 與 ffmpeg 滿足聽打(Global Dictation),再裝一個本機 LLM 伺服器滿足 Agent Mode。README 提供單行安裝:
curl -fsSL https://raw.githubusercontent.com/xajik/voice-to-md/main/install.sh | bash
這條指令做四件事:把 repo clone 進 ~/.stmd/src、用 Homebrew 裝 whisper-cpp、ffmpeg 與 xcodegen、跑 make install 把 .app 丟進 /Applications。它假設你已有 Homebrew 與完整的 Xcode(不是 Command Line Tools),否則會直接 fail。第一次啟動 App 後還要手動授權麥克風與輔助使用權限(Accessibility),到 Settings 下載 Whisper 模型(Base 約 150 MB),Voicebox 開源語音工作室 之類的桌面錄音工具不會要你做這麼多動作。
Agent Mode 的 LLM 伺服器則是另一回事。作者推薦 omlx(Apple Silicon MLX,最快)、Ollama、LM Studio、llama.cpp 任選一個。每一個都是另一個獨立專案,要自己裝、自己拉模型。README 的推薦模型是 Qwen3.5 27B 4-bit 與 Gemma 26B 8-bit,這類 20 B 級別的量化模型在 Apple Silicon 上實跑通常建議 16 GB 以上統一記憶體,32 GB 比較從容(README 本身沒有給硬體門檻,這是社群對同類模型的一般經驗)。把這串條件加起來,macOS 版的真實硬體與知識門檻比官網徽章暗示的高很多。
作者把語音拆成兩個模式:Global Dictation 與 Agent Mode。Global Dictation 是 ⌘⌥] 系統熱鍵在任何 App 把逐字稿打到游標上,概念接近SpokenType 把口語順成可用文字 的桌面版。Agent Mode 才是這個工具的特色。你對著一個浮動視窗說話,本機 LLM 把你說的內容即時改寫成結構化的 Markdown、純文字或 HTML 文件。
從 CLAUDE.md 與原始碼可以看到實際參數:音訊以 4 秒為單位切片送 whisper,逐字稿在記憶體裡累積到約 30 字、靜默 5 秒或你按下 ⌘↩ 送出時,就把這段 buffer 連同目前文件一起丟給本機 LLM。LLM 的輸出是以 token 串流方式直接寫進編輯器與磁碟上的 .md、.txt 或 .html 檔。

| 模式 | 送進 LLM 的內容 | 輸出形態 |
|---|---|---|
| Format(預設) | 整份文件加新口說 | 整份重組過的文件 |
| Edit | 口說當指令(例如「把這段轉成表格」) | 針對選取範圍的修改 |
| Append | 最後 3 句加新口說 | 只新增內容,延遲不隨文件變長而上升 |
Append 模式的設計特別值得點出來:它只送最後 3 句與新口說,LLM 只回新內容,文件越長延遲不會跟著膨脹。這是工程上對 token 成本與回應延遲的常識權衡,但與「Format 模式每次都重組整份文件」是不同的取捨:前者追求品質,後者追求長文件穩定性。輸出格式(MD / TXT / HTML)則是另一個獨立維度,三個模式都可以配三種格式,作者在 OutputFormat+PromptExpectations.swift 為每種格式準備了專屬的 prompt 規則與範例。
控制面板上還有幾個按鈕把這套工作流收攏:Send(⌘↩)讓你跳過自動 buffer 直接把當前口說送 LLM、Mic 啟停錄音、Preview 用系統預設程式打開 .md 或 .html 預覽、Read Aloud 把文件內容交給 macOS 內建 TTS 念出來(可在句子中點一下停止)、Clear Session 清空當前 session 的音訊與逐字稿。Session 會自動存進 ~/.stmd/speech-to-markdown/<unix_ms>/<id>.{txt,md,html},下次可以從 History 直接還原繼續錄音到同一個檔案。CLAUDE.md 對這套檔案命名與 session 還原邏輯寫得很清楚,看得出作者把它當成可被工程師檢視的工作流,不只是黑箱產品。
討論這個工具很難不提到 Wispr Flow 與 Superwhisper,兩者都是這條賽道上的商業方案。Wispr Flow 是訂閱制雲端聽寫,主打跨平台、多用模型與精準度;Superwhisper 是 macOS 與 iOS 上的 Whisper-based 工具,離線與雲端方案都有,社群活躍。Speech-to-Markdown 與這兩者不是同一條路線:它不做雲端、不收訂閱、不幫你準備模型,而是把「你自己架的 whisper.cpp 與本機 LLM」串成一條工作流。
| 定位軸 | Wispr Flow | Superwhisper | Speech-to-Markdown |
|---|---|---|---|
| 語音引擎 | 雲端(OpenAI、Deepgram 等) | Whisper(離線或雲端) | whisper.cpp(僅本機) |
| 格式化 LLM | 雲端 GPT / Claude | 雲端或本機 | 僅本機(使用者自架) |
| 收費 | 訂閱 | 買斷與訂閱 | 免費 |
| 設定門檻 | 低(裝完登入即用) | 中(要挑模型與方案) | 高(要架 LLM 伺服器) |
| 資料離開裝置 | 是 | 視方案而定 | 否 |
| 適合受眾 | 想付費買生產力的人 | 進階使用者 | 地端信仰者、開發者 |
換句話說,選它等於選一種政治姿態:你的語音資料不應該離開你的硬體,而且你願意為這個保證付出自己的時間去架 whisper 與 LLM。這也是本機 Whisper 字幕工具那條路線的延伸,同一套 whisper.cpp 在不同工具上滿足不同人對「地端」的執念。
這個工具在 2026 年 7 月還是非常早期的個人專案:十顆星星、零個 issue、最近的 commit 是作者一人提交,第一次 release 是 7 月 8 日、到 7 月 25 日已經迭代到 v0.2.4。作者 Igor Steblii 在 App Store 另外還有 Lucent、Scratch My Map 兩個上架品,類型都與聽寫無關,可以推測 Speech-to-Markdown 是他個人的side project,不是商業公司的產品線。Git commit 歷史顯示幾個關鍵節點:7 月 10 日把專案從 VoiceToMarkdown 改名為 SpeechToMarkdown、加入 iOS build 與測試 CI、7 月 22 日為了解決 App Store 5.1.1(i)/5.1.2(i) 的隱私拒審補上「no third-party AI service」澄清,整個 repo 至今仍維持一人提交的節奏。
把這些條件攤開,會建議以下判斷。
macOS 版的語音與 LLM 處理都在你的機器上,前提是你自己架的 whisper.cpp 與本機 LLM 伺服器。iOS 版的 SpeechAnalyzer 與 Foundation Models 也是蘋果裝置端運算。App Store 標籤寫「Data Not Collected」。值得注意的是,作者在 2026 年 7 月 22 日的 commit 訊息寫著「clarify no third-party AI service is used, address App Store 5.1.1(i)/5.1.2(i) rejection」,意思是 App Store 曾以隱私條款退審,作者澄清沒有任何第三方 AI 服務後才通過。這條歷史同時說明兩件事:作者確實沒有偷連雲端,但 Apple 的隱私審查也會把這類全地端 App 拿來放大檢視。
GitHub 上 repo 的 description 是「Voice to structured markdown with local TTS and Claude, Gemini, Codex or Opencode」。這與 README 強調的「100% local」字面上衝突。Claude、Gemini、Codex 都是雲端商業 LLM 服務,Opencode 是 CLI 工具。比較合理的解讀是 description 是早期版本沒有同步更新,README 與 commit 歷史才反映目前的實際設計。但這條描述會造成搜尋引擎與 GitHub 主題 tagging 的誤導,第三方聚合站也可能據此把它歸到「Claude / Gemini 工具」的分類。
所有 v0.0.6 以後的 release 都沒有 Apple Developer ID 簽名,第一次打開要右鍵選「打開」bypass Gatekeeper。作者在 install.sh 提供「Apple Development」身份自動偵測,但那是給已加入 Apple Developer Program、要從原始碼自行編譯的使用者。對一般下載 .dmg 的使用者,每次更新到新版本都會再被 Gatekeeper 擋一次,麥克風與輔助使用權限也可能會因為 ad-hoc 簽名變更而重問。這是Input 0 那類本機工具的「無簽名」痛點放大的結果。
Global Dictation 的設計繞不開一個事實:要把逐字稿打到任何 App 的游標上,必須取得 macOS 的 Accessibility 權限,並用 Carbon RegisterEventHotKey 註冊系統級熱鍵(鍵碼 0x1E 對應 ]),再透過 CGEvent 注入合成鍵盤事件。CLAUDE.md 明確寫了「synthetic events inherit physically-held modifiers」,所以作者還得等使用者放開修飾鍵、清空事件旗標,否則合成鍵會被實體按住的修飾鍵綁走、變成快捷鍵誤觸。這套機制跟鍵盤側錄或 RPA 工具用的是同一個入口,所以蘋果才會把它列為高敏感權限,每次新簽名都會重問一次。
這對一個未簽名的 .dmg 釋出版本來說特別尷尬:作者在 install.sh 用 Apple Development 身份自動偵測,但那條路徑只對自己編譯原始碼的人有效。一般使用者從 GitHub Release 抓 .dmg,每次版本更新都得重新右鍵開啟、重新授權麥克風與 Accessibility,這條摩擦成本會隨 v0.2.x 的快速迭代節奏放大。對真的想長期用的人,自己跑 install.sh 簽一個 Apple Development 身份反而是最省事的選項,但這要求你已是 Apple Developer Program 會員。
Speech-to-Markdown 的價值不在於它取代 Wispr Flow 或 Superwhisper,它取代不了,作者的設定也明顯不是為了大眾。它的價值在於示範了一條蘋果平台上的純地端語音工作流可以長成什麼樣子:iOS 版靠 Apple Intelligence 把「零設定、零雲端」變成可能,macOS 版則把責任還給使用者,要你自己架設 whisper 與 LLM 伺服器。同一份 README 寫的「100% local」對兩個平台成立的原因剛好相反。
想試 Apple Foundation Models 寫作能力的人,iOS 版是目前最直接的入口;已經在本機跑 LLM 的開發者,macOS 版的 Agent Mode 與 Append 模式提供了清晰的取捨。要把這個工具放進穩定工作流之前,先把「沒有 LICENSE、未簽名、單人維護」這幾條事實記下來,再決定要不要押注在上面。它有趣,但還不是成熟。