10 月 28 日早上,我在 Mac 上打 adb 在 ts 上,想要的是「ADB在Tailscale上」。輸入法給我的是「沒卡人在成年上」。

這個輸入法是 Rime,我在 Mac 上用的是它的 macOS 版,鼠鬚管(Squirrel)。Rime(中州韻)是佛振開發的開放原始碼輸入法引擎,Windows 版叫小狼毫,輸入方案用 YAML 寫,核心是 C++ 的程式庫 librime。我用它很久了,換成平板時只能用 Gboard,多年累積的個人詞庫和按鍵習慣全部要重新適應,這件事我在〈從平板換回筆電的旅程〉寫過。

佛振當初為什麼做 Rime

佛振在 2014 年 7 月的圖靈社區專訪裡說,他 2009 年開始設計 Rime,2010 年才進百度做 PC 輸入法。做 Rime 的原因,他講得很直接:「当时的智能拼音输入法大都针对《汉语拼音》而设计,无法轻易地将拼音方案更换为其他方言。」

我記得朋友 zhtw2013 說過,佛振之前負責過 Google 的電腦版拼音輸入法,才想做中州韻。這跟專訪對不上。專訪裡提到 Google 的只有兩處,一處是他 2008 年辭職時想將來去 Google、Facebook 找工作,一處是 Rime 最初的詞表用了 Google 開放原始碼的 Android 拼音詞典。朋友可能記混了,也可能有沒公開的經歷,我查不到,不下結論。

當年我在社群裡的位置

我開始用 Rime 大概是 2014 或 2015 年。那時候我沒有直接跟佛振聊,平常是我把意見整理好交給朋友,由朋友轉給他。有需要直接聯絡的時候,我也會直接找他。除了佛振,我也接觸過幾位主要的開發者,其中我和朋友接觸最多的,是詞庫的維護者瑾昀。佛振在同一篇專訪裡,把瑾昀列在持續提交錯字、錯音、整理詞彙的幾位之一。當年大家交流的地方還是 QQ 群,光這一點就知道是多久以前的事,我自己也老了。

我和朋友 zhtw2013 一起開了 Rime 的臺灣粉絲專頁,叫「RIME 中州韻輸入法引擎」。粉專現在還在,我到現在還是管理員。這位朋友就是我首頁友情連結裡的虛度空間 ZH-TW。

當年我提的意見,主要是讀音。我的看法是,臺灣教育部的讀音和內建的不一樣,內建的有些偏古音。像「柏」,臺灣唸ㄅㄛˊ,內建的是ㄅㄞˇ。以下是我的回憶,沒有文件可查:我們原本的意見,是請佛振那邊由官方出一個獨立的方案,被瑾昀打回來了。那次討論在群組裡,GitHub 上不會有紀錄。後來我們自己做了一套,那套方案過了這麼多年,沒了就沒了。

公開看得到的,是幾條相近的紀錄。2015 年 11 月,後來做唯音的 Shiki Suen 開了一串討論各地習慣讀音的討論串。2016 年 6 月,他主張「亞」唸ㄧㄚˇ 在臺灣很流行,應該收,瑾昀回覆,大意是這是錯誤的讀音,官方不認可。同一串裡也提到,「擊」字已經由瑾昀修訂過。佛振提了另一條路:在碼表標註讀音的來源和性質,這樣錯音也能放心收錄。2018 年 3 月,朋友替官方的注音詞典補了約 30 個讀音,隔天合併。但他想把「夾」ㄐㄧㄚˊ 的比重調高,佛振回「請不要降低原有讀音的權重」,那個 PR 就關掉了。讀音補進去了,排序沒有動。

2017 年 12 月,朋友在 PTT IME 版,用 zhtw 的帳號發過一篇〈PRIME 臺灣版本發佈〉。他寫到讀音:「詞庫維護者瑾昀認為不該將錯誤的讀音放進來,這是他身為維護者的堅持。」接著說:「RIME.TW 成立的原因也有部分是這個原因,在我的立場上,我寧願放入錯誤的讀音,也要提升玩家的使用體驗,所以我是有打算編譯一個完全臺灣化的版本,雖然很慢,但這個計劃是一點一點在前進的,可能幾年後會真正做出來吧。」大約八年十個月後公開的,是我這條 fork。

Android 上其實有 Rime 的前端,叫同文(trime)。我當年試用過同文,不過是很早期的版本。同文的作者,朋友接觸得比較多,我只有一點點。我們當時討論的結論,是它比不上當時的 Google 注音,因為 Google 注音會自動推測打錯的鍵和漏打的聲母。同文的自動糾錯,是 librime 引擎內建的那一種,仰賴實體鍵盤的鍵位。這是我們的感覺,沒有做過系統性的比較。我覺得現在的鼠鬚管也有這個問題,同文在手機上更明顯。同文這十年有人持續維護:repo 在 2015 年 5 月建立,2021 年有新的維護者加入,改寫成 Kotlin,最新版 3.3.12 是 2026 年 9 月 1 日出的。這套容錯 librime 本來就有,預設沒開,Claude Code 查過我的設定也沒開,開了會不會讓簡拼變差,我還沒試過。

一直改不動

我的說法是,這個架構太難上手,所以一直到現在,我才能完全去改它。難上手的地方在於,想改的如果是打字的行為本身,就得同時讀懂三層。第一層是 YAML 的設定檔,第二層是拼寫運算,也就是 Rime 用規則把一個音變出各種拼法的機制,第三層是 C++ 寫的 librime 引擎。

這十二年,引擎的骨架幾乎沒變。Claude Code 在 10 月 28 日從 librime 的 git 歷史算過,現在引擎的程式碼,有 59.6% 是 2014 年 7 月以前寫的。外掛、語言模型這些,是後來才有的,讓「加東西」變容易了。要改它本來的行為,還是得讀懂那些十多年前的程式碼。Rime 沒有變簡單。這次改得動,是因為過門檻的工具換成了 agent,讀程式碼的是它。

10 月 27 到 28 日,改了什麼

這兩天我都是用語音輸入,或用右手食指打字,把哪裡不對告訴 Claude Code。讀原始碼、修改、跑基準測試,是它做的。

10 月 27 日中午,先處理一個老毛病。我常常只打每個字的第一個注音,讓輸入法猜整句,它有時會猜錯,像我打ㄨㄑㄕ,想要的是「我其實」,出來的卻是「武器說」,「的是」也會變成「的事」。原因是簡拼的規則只認得從聲母開頭的音。Claude Code 把規則改成沒有聲母、直接從韻母開頭的音也認,再用我的語音輸入工具 Voco 累積的詞頻重新排序候選字。在沙盒裡跑的基準測試,第一個候選字就是答案的比例,從 64.8% 變成 78.4%,這個數字只代表那組測試題。下午加了兩個 Lua 外掛和一個個人的語言模型,晚上 6 點 19 分換掉引擎,自己編譯 Squirrel 加 librime,把原本寫死的學習紀錄長度上限、撤銷學習的秒數都改過了。

回到 28 日早上那句 adb 在 ts 上。英文縮寫表只比對整段輸入,夾在句子裡的縮寫進不了整句。要修,得先讀懂 librime 怎麼切音節:只要有一條全是正常拼法的路走得通,簡拼就會被丟掉。所以 Claude Code 把英文詞做成一種只有簡拼時才會被認得的假音節。權重第一次給得太低,我打了好幾次都學不起來,拉高之後,又有 11 個縮寫開始搶「你看」「你開」這類常用詞的位置,最後分成兩級。每改一步,都跑一次一萬多題的基準測試,確認一般的打字沒有任何一題變差。

當年的讀音意見,這次自己改

同一天早上,Claude Code 查我電腦上這一版 Squirrel 內建的注音詞典(terra_pinyin),「柏」的排序比重是ㄅㄞˇ 90%、ㄅㄛˊ 10%、ㄅㄛˋ 0%。我看完說,我們居然都已經 fork 了,那就幫我校正一下。

我在意的是 Rime 以拼音為根。Rime 的注音方案,詞典裡存的是漢語拼音加聲調,像「柏 bai3」,注音是部署時用一組規則轉出來的。詞典的讀音依據是 CC-CEDICT,一本漢英詞典,臺灣的讀音只能一個個掛到這一層上面。這是我自己的觀察,不是佛振的說法:他做 Rime,本來就是嫌現成的輸入法只認漢語拼音;引擎本身也確實不綁拼音,Claude Code 10 月 28 日實測,詞典改用注音存,引擎一行不用改。可是十幾年後,臺灣注音使用者卡住的,正是官方注音方案以拼音為根。

我在社群上看到過,有人問 Mac 上好用的注音輸入法,很多人推 Rime 或唯音,唯音的作者孫志貴(Shiki Suen)在底下留言,大意是他用中州韻用到受不了,才做了唯音。他為什麼受不了,我不替他說。Claude Code 查過,唯音的詞庫直接用注音存,沒有拼音這一層,「柏」就是ㄅㄛˊ、ㄅㄞˇ 兩行。

這次改成在上游上面加規則。Claude Code 寫了一支產生器,從幾份公開資料套上讀音規則來產生詞典。依據是教育部《重編國語辭典修訂本》(萌典的開放資料)、小麥注音(臺灣的開放原始碼注音輸入法)的讀音表,再加上地球拼音,版本都鎖住了。詞典直接存注音,不是存拼音再轉換。

數字都是 10 月 28 日的:1067 個字調整了讀音比重,其中 20 個字換了第一讀音。「柏」變成ㄅㄛˊ 90%、ㄅㄞˇ 10%,「期」「任」「識」也一樣換了。另外有 1349 個詞補上臺灣的讀音。2018 年朋友補進官方的讀音,這次有 16 個字變成第一讀音。

教育部辭典不等於大家實際怎麼念:它把「滑稽」標成ㄍㄨˇ ㄐㄧ,大家打的是ㄏㄨㄚˊ ㄐㄧ,所以詞的讀音只補不刪。第一版照辭典算比例,結果「給」被拉成ㄐㄧˇ,「都」被拉成ㄉㄨ,後來改成只有證據很明確才動。資料本身也有年代,萌典把「市場」「機場」標成ㄔㄤˊ,Claude Code 說這是 2012 年審訂前的讀音。

輕聲字是下一步。輕聲字我是用本調打,「認識」打ㄖㄣˋ ㄕˋ,詞典裡卻是輕聲。10 月 28 日早上 7 點 19 分,Claude Code 替有輕聲的詞補了一組本調讀音,共 5237 筆,現在打ㄖㄣˋ ㄕˋ,第一個就是「認識」。代價是同音詞會撞在一起,像「心裡」和「心理」、「街上」和「接上」。基準測試:第一版改對 10 題、改錯 7 題,其中 5 題是題目本身用大陸讀音出的;輕聲這一步對上一版,改對 24 題、改錯 8 題。

當年提的讀音意見,十多年後,我讓 agent 把大方向修好了。10 月 28 日那天留下的,還是同音詞的取捨。11 月 5 日,這條 fork 公開了。

引擎叫蓬萊韻,方案叫蓬萊注音,macOS 上的輸入法叫貂毫(Sable)1.0.0。名稱照 Rime 的習慣取:中州韻對蓬萊韻,鼠鬚管、小狼毫對貂毫。官網在 penglai.im,下載在 GitHub 的 v1.0.0,原始碼在 jason5545/rime-penglai,引擎的修改在 jason5545/librime 的 penglai 分支。

蓬萊注音的詞典直接存注音。讀音有三種,打字時就能換,不用重新部署:蓬萊音是預設,臺灣讀音優先;中州音是大陸讀音優先;兼收並蓄是兩岸讀音同等。這剛好對上當年那幾個立場,只是現在不用誰同意,每個人自己選。

公開版只附公開資料,不帶我的學習紀錄。前面那些用 Voco 詞頻重排的數字,還有 10 月 28 日校正的那些數字,都是我自己電腦上的版本;Voco 的語料和私人詞頻表也只在我自己的電腦上。

貂毫用 Developer ID 簽章、送 Apple 公證過,只支援 Apple Silicon。打開 DMG 裡的貂毫按「安裝」,它會把自己裝進輸入法清單。

最後謝謝 zhtw2013。當年是他和我一起開粉專、替我把意見轉給佛振,在 PTT 說要做一個完全臺灣化版本的也是他。