善解
善解,所以選對。
一個開源的 macOS 注音輸入法,專心把同音字選對:看懂你前面寫了什麼,選出你真正要打的那個字。
開發中・尚未開放下載
為什麼要做
注音輸入最常見的困擾不是打不出字,而是打出了「同音的另一個字」。
怎麼做
三層分工:每一次按鍵都在本機即時完成,語意判斷只在需要時加入,而且只能從本機的候選裡挑。
候選生成
詞庫與語言模型在本機產生前 64 名候選,每一鍵都要在 16 毫秒內完成。
本機重排
小型語言模型看你前面寫的內容,從候選中挑出最合理的一句;在背景執行,不拖慢打字。
雲端校正(選用)
打完按一下快速鍵,請雲端模型再看一次。預設關閉;雲端只能回傳候選的編號,不能自己寫字。
目前的實測
所有數字都來自專案的評測集,句子由專案自寫並以 CC0 釋出。
這些數字怎麼量的
評測分成開發集與保留集。開發集用來調整;保留集由另一個流程撰寫、開發過程中不看內容,只在每個階段結束時量一次,用來確認進步不是因為「背了題目」。前 64 名含正解的比例用寬鬆對照:「她/他」「臺/台」這類寫法視為相同;保留集的 99.6% 是上一版語言模型(model-v2)時量的;只有詞庫、還沒有語言模型時,保留集是 97.8%(完全相符)。
判斷器比較了本機模型與多家雲端服務的三十多組設定;所有判斷器都卡在同一個上限:正解根本不在候選裡的句子,誰也救不回來。所以目前的重點是先把正解放進候選。
輸入法實際送出整句的正確率,保留集上聊天設定 79.3%、書面設定 81.1%(目前的語言模型加詞類回退);這是只用詞庫與語言模型、還沒有語意重排的成績。
每個按鍵的處理時間是 76 句打字測驗共 2,483 個按鍵的 p95;量測時機器同時在跑其他工作。沒有選字記憶時 p95 是 2.5 毫秒。
路線圖
依版本分階段。每一項都有可量測的驗收條件,由獨立的檢查流程確認後才算完成;研究插在它進行的那個階段,寫明結論。
- 完成
- 進行中
- 規劃中
- 研究
v0.1輸入法本體完成
評測基準與評測資料
Rust 核心與研究原型逐字一致;口語開發集與獨立撰寫的保留集,含同音陷阱與詞庫沒收的日常用語。
研究語意選字可行性
實測本機與雲端模型的準確度與延遲。結論:瓶頸在候選,不在判斷,先把正解放進候選。
詞庫 v1 與精簡格式
從維基標題與維基詞典補進約 34 萬個詞,可從鎖定版本的來源完整重建;記憶體從約 390 MB 降到約 88 MB,輸出逐字不變。
語言模型整句選字
用上下文排序候選,聊天與書面兩種設定依前景 App 自動切換。
macOS 輸入法本體
標準與倚天鍵盤、候選窗;標點留在組字區,並有標點候選清單。
標準讀音
依教育部規範,「一」「不」打本調或變調都能打出整個詞,「法國」的「法」用審定音 ㄈㄚˇ;補充詞表的錯誤讀音一併修正。
簽章與發佈流程
Developer ID 簽章與 Apple 公證、安裝程式、Homebrew 的發佈流程已就緒;開放下載的時間另行公布。
v0.2選字記憶與候選窗完成
個人化學習
只從你在候選窗的改選學習,依前文分開記,不會一次改選就污染所有句子;單一個字只在前文完全相同時才套用。密碼欄與安全輸入時自動暫停;可以清除全部記憶,清除前會先確認。
玻璃候選窗
自己繪製的玻璃候選列,標點附上名稱。按 ↓ 往下疊出更多候選列,每列 9 個,原本第一列的候選展開後仍在第一列。
按鍵細節
組字區是空的時候按聲調鍵打出聲調符號;音節還沒打完時,Backspace 逐個刪掉注音符號,和蘋果注音相同。
v0.3選字品質完成
看前文選字
讀取游標前已經送出的文字(按過 Enter、已經在文件裡的字),接著它選這一段的第一個詞;分好幾次送出的句子,選字仍接得上前面,不再每段都從頭猜。
台灣字形與簡體殘留
語料與補充詞表裡的「最后」「由于」清掉;台灣常用的「床」「秘」「灶」不再被當成簡體字轉成異體字;同一個詞的異體寫法合併計數。
詞類回退
兩個詞沒在語料裡一起出現過時,用「哪一類詞後面常接哪一類詞」補估計。保留集聊天設定多對 2 句,書面持平。
非標準讀音不擋路
整句選字時,詞庫為了容錯收錄的非標準讀音不再擋住同音的一般詞(例如「搞完這波」);選單可以關掉。
即時預測
打下一個詞的第一個注音,就在候選窗列出接得上前文的詞;按 Tab 進入選取,不會自動替換你打的字。選過的詞會記住,選單可以關掉。
候選窗跟著 App 的深淺色
App 用淺色或深色外觀時,候選窗跟著切換,不只看系統設定;候選列的大小與位置和蘋果注音並排量過,完全相同。
選字記憶只在前文對得上時優先
改選過的詞只在前文相同、或前文最後一個字相同時優先,不再因為在別的句子改過就到處優先。
研究即時預測怎麼做
在公開資料上比較幾種預測方式。結論:用「接在前文後面的詞」當候選、注音只用來篩選,做成上面的即時預測。
研究維基百科的台灣正體轉換
改用維基百科自己的台灣正體轉換重建模型,和現行模型配對比較。結論:對打字沒有顯著幫助,還打錯了使用者回報的句子,不採用。
研究本機重排
讓本機模型替每個候選打分數。四個本機模型都沒過預先定好的門檻,每句 p95 510~640 毫秒也超過 300 毫秒的上限。結論:暫不進輸入法。
研究評測統計
每次改動都用配對比較、精確檢定與信賴區間判斷有沒有進步,不靠感覺。
研究改選後其他字不動
在候選窗改選一段後,讓旁邊已經顯示的詞維持原樣(比照蘋果注音)。修了四輪,最後一輪讓「改選後繼續打字」變差。結論:回報的例子(「版控」)根本上是詞庫缺詞,先做「從改選記住新詞組」,這項暫停、之後再評估。
之後已排定,在 v0.3 之後進行中
從改選記住新詞組
改選後送出的片段如果不是詞庫裡的詞(例如「版控」),記成你的詞,下次直接打得出來。先量回報的錯字裡有多少是缺詞。
App 沙盒
輸入法在 macOS 的 App 沙盒裡執行,只拿到需要的權限。
更多新詞
從語料自動找出詞庫沒收的新詞(例如口語縮寫);也能手動加詞。
預測可省略韻母
即時預測的選用設定:只打每個字的聲母也能找到詞。預設關閉。
改選後其他字不動(重新評估)
新詞做完後,照蘋果注音的實測(含改選後繼續打字)重新評估要不要做、怎麼做。
破音字的搭配
同一個字的不同讀音分開計算搭配,例如「空」唸 ㄎㄨㄥˋ 時,不再借用「空間」的搭配而搶走「控」。
研究中英混打
按鍵組不成注音時自動判斷是英文,或依鍵盤上相鄰的鍵校正打錯的注音。
研究評測集擴充
保留集定期擴充與輪替,並加入較長的口語句子。
未排定語意判斷與校正規劃中
本機重排
把語意判斷接進輸入法,在本機執行,不拖慢打字。
一鍵校正、新手測驗
打完一段可以請模型重看(雲端,預設關閉);第一次使用時用簡單測驗了解你的打字習慣。
隱私
輸入法看得到你打的每一個字,所以這些是設計上的硬規則(隨開發逐項實作)。
設計原則
- 目前版本沒有連網功能。之後如果加入更新檢查或雲端校正,會在上線前寫在這一頁:什麼時候連線、送出什麼、能不能關閉。
- 不申請「輸入監控」與「輔助使用」權限。系統的輸入法框架本來就會把按鍵交給輸入法,不需要監看整個系統。
- 用了哪些資料與模型、各自的授權,下載前就寫在這一頁(見「開源與授權」)。
- 雲端功能預設關閉;開啟後只在你按快速鍵或送出時傳送,不會逐鍵傳送。
- 雲端只能回傳候選的編號,不能產生文字;回應不合規就直接用本機結果。
- 密碼欄、安全輸入模式下停止學習與雲端;終端機不傳送到雲端。
- 你打的內容不寫進任何日誌或錯誤訊息。
- 學習資料只存在本機,可以一鍵清除。
開源與授權
授權清單
- 程式碼:Apache-2.0。
- 基礎詞庫:小麥注音(MIT;片語源自 libtabe,BSD)。
- 補充詞表:由維基百科與維基詞典的條目標題產生,CC BY-SA 4.0,署名維基百科與維基詞典貢獻者。
- 標準讀音變體:依教育部《國語辭典簡編本》〈單一音讀〉與《國語一字多音審訂表》的規則,從小麥注音詞庫產生,MIT。規則是事實,檔案不含教育部資料。
- 語言模型(詞的兩兩搭配頻率)與詞類表:由維基百科 2026-10-01 的 20 萬篇條目、Mozilla Common Voice 繁中(台灣)句子、Tatoeba 中文句子,以及 gpt-oss-120b 產生的台灣口語合成句計算,CC BY-SA 4.0,署名維基百科與 Tatoeba 貢獻者。不含任何私人對話。發佈的模型另含少量用來辨識來源的指紋條目。
- 目前沒有使用任何神經網路模型。
- 評測句:專案自寫,CC0。