一位匠人的中州韻——專訪Rime輸入法做者佛振

非商業轉載請註明做譯者、出處,並保留本文的原始連接:http://www.ituring.com.cn/article/118072前端

弓辰,號佛振,出身地是河南鄭州以北十里弓家寨,在北平作碼農。佛振是「Rime/中州韻」輸入法引擎的開發者,它不只僅是一個輸入法,也是一個輸入法算法框架,這一套算法支持了拼音、雙拼、註音、五筆、倉頡等全部音碼和形碼輸入法。Rime還支持了許多種方言拼音,如吳語、粵語,甚至中古漢語。「IT學生界大神」BYVoid曾在其博客撰文怒贊「Rime/中州韻」,使得這個本來默默無聞、志在用十年磨礪的項目在一個小圈子裏迅速傳開。佛振四年前加入百度PC輸入法開發團隊,但他並無放棄本身的「業餘做品」,而是將其發揚光大,針對Windows、Linux、Mac三大平臺提供了不一樣的發行版,Windows版「小狼毫」,Mac版「鼠須管」,Linux版「中州韻」。佛振認爲代碼和文學的共同點在於「強大的表現力」,匠人和做品,在佛振這裏有一個什麼樣的故事?面試

圖片描述

當時只道是神奇

「對一個匠人來講,創做一件有情調的做品,必定是出於對精湛技藝的追求。若是僅僅是爲了現實目的,當然能夠寫出高質量的軟件,代碼自己卻容易缺少靈氣。」正則表達式

問:你是如何學編程的?算法

幼時只道符號神奇,喜歡獨個寫寫畫畫,樂此不疲。中學時業餘愛好是鑽研速記學以及編程術。數據庫

問:請您簡單介紹一下開發中州韻輸入法的通過。編程

大學畢業後一邊從事Web開發的工做,一邊構思一種將速錄機鍵盤的並擊工做方式在PC鍵盤上實現的技術,後來製成軟件《宮保拼音》。此後賦閒一段時間,又在民辦高校兼職,擔任過C++、Java教師。這幾年裏一直在使用開源的Linux系統,Linux桌面前後有SCIM和IBus這樣優秀的輸入法框架推出,這使得以往被視爲十分專業化的輸入法開發技術,對普通的開源軟件開發者觸手可及了。受此鼓舞,我從2009年開始設計和編寫一款輸入法,用來驗證本身對輸入法的理解和構想,並融合後來學習到的漢語音韻學知識,使他支持古音和方言輸入。這就是後來稱做「Rime/中州韻」的輸入法。後端

2010年我加入百度,從事百度PC輸入法的開發。這段歲月自有一份艱辛,也獲得很大的鍛鍊。隊友們都是Windows開發高手,我向他們學到了很多。欣喜的是大公司畢竟是規範得多,週末都不多會組織加班的。因而在休息時間我又把滿滿的熱情投入到週末小製做上來。微信

在朋友們的幫助下,最初運行在Linux上的Rime輸入法,成功移植到了Windows和Mac平臺。代碼和設計也不斷完善,算法庫由Python語言轉爲C++後,程序性能和操做體驗都有顯著提高,有幸獲得了身邊朋友們的確定。網絡

問:設計「Rime/中州韻」的初衷是什麼?架構

爲吾等輸入法愛好者設計一個智能的輸入法平臺。

寫輸入法的人每每打字不快:有感於效率低下,卻不思勤學苦練,反倒生出改進輸入工具的念頭。故事一般都是這樣的。

過去,許多輸入法構造簡單,能夠在一套通用的輸入法平臺軟件上實現。其表明有倉頡碼、五筆字型、鄭碼等等。後來的輸入法發明人只須制定一套完備的編碼規則,按規則爲字詞一一設定編碼便可運做。用戶則須要依靠腦力強記規則,在錄入時把文字翻譯成要在鍵盤上打出的代碼。

現在已再也不是輸入法「萬碼奔騰」的時代,然而仁人志士發明和改進輸入法的熱情不減。因爲互聯網和移動網絡的興起,做爲信息處理基礎工具的輸入法從新受到重視,不斷向高效、易用、智能化發展。其表明是智能拼音輸入法。輸入過程當中的許多環節改由輸入法程序完成,極大地減輕了用戶的思惟負擔。

隨之,輸入法開發技術也愈來愈複雜。由於缺乏關鍵的智能算法,輸入法設計者再也沒法利用老舊的輸入法平臺,創做出符合時代水準的輸入法了。我研究的一些問題,如方言輸入,技術上與智能拼音輸入十分類似。但是當時的智能拼音輸入法大都針對《漢語拼音》而設計,沒法輕易地將拼音方案更換爲其餘方言。若用傳統的碼錶式輸入法平臺實現,則因同音字多,逢詞必選,效率十分低下。

惱恨構想中的輸入法難以實現,我終於下決心開發一款聰明而善變的輸入法軟件。但願經過Rime使輸入法的個性化變得簡易,與我有相似須要的用家能夠盡情發揮創造力,找出最適合本身的打字方式。

問:在「Rime/中州韻」輸入法上投入了這麼多的時間和精力,你有什麼收穫?

對我我的而言,爲創做這款開源軟件投入了大量精力,也不全然是「遊手好閒」,心想借此練練技術也是好的。所以創做中不只知足於實現功能就算完,許多技術細節都反覆推想過。

冥冥中天意憐我青春都耗在這上面了,此前能在百度得了工做,以致目前從事的工做,都與開發過這個開源輸入法有莫大關係。某雖不才,此外便一無所長,總算尚未悲劇到飢寒交迫的地步吧。

問:你對古漢語和方言是否是有特殊的感情?背後的緣由是什麼?

不是。

我想每一個人,特別是遠離家鄉的遊子,對本身的家鄉話都是有感情的。

個人母語是中原官話,母親卻講北京話,小時候每回從老家歸來她都要糾正個人口音。以致於一些字詞在家鄉話裏的說法我都記不真切,須求證於祖父母。祖父曰:「過去都以爲土話土,實際上這裏頭也通有講究叻。」這話的意味,直到學習了一些語言學知識才獲得印證。

原來每一種漢語方言都有一套嚴整的音韻系統,對照古代的雅言咱們能夠發現他們各自發展演化的軌跡。普通話是官定的標準音,但比之方言並沒有「特殊」之處。

我發現一些優秀的軟件,很是注重本地化,努力讓不一樣地域、不一樣語言、不一樣文化背景的用戶感覺到公平的對待。輸入法是人機交互的重要一環,如何能貼近用家的直覺,尊重不一樣的語言習慣和輸入偏好?個人解法是儘可能將程序寫得通用,給用戶以足夠多的選擇。

對一個匠人來講,創做一件有情調的做品,必定是出於對精湛技藝的追求。若是僅僅是爲了現實目的,當然能夠寫出高質量的軟件,代碼自己卻容易缺少靈氣。代碼的藝術和美,與文學略有共通之處,在於強大的表現力。缺少靈氣的代碼只顧平鋪直敘,是沒有生命力的機械;好的代碼越是簡單明瞭,越是作獲得更多事情。

編程的樂趣在於享受這份創造的快感:他不僅是在敲代碼,而是在開動腦筋調教程序,增益其所不能。甚至會有一刻在心中大呼:終於再也不像菜鳥同樣寫程序了!誰願作只會搬磚的碼農?定要像設計師那樣思考,才稱得上有手藝的編碼匠。

二〇〇八年我辭去搬磚的工做,立志練好技術,未來上Google、Facebook謀職,作個有技巧的碼農。修煉的方式,就是完成一個有挑戰、來源於真實需求的軟件做品。因而醞釀已久的輸入法開發計劃在來年開工了。

問:能向對古漢語和方言(感興趣)的朋友們推薦一些書籍嗎?

這個問題我原本回答不了,由於我對音韻學只是泛泛地涉獵,瞭解十分粗淺。幸而經過開發Rime輸入法認識了一些語言學和中文專業的朋友,他們向我這樣的外行推薦一本丁聲樹撰文、李榮製表的《漢語音韻講義》作入門書。「這本書吃透了,對於熟悉切韻音系、切韻與現代音(包括一些方言)的對應關係是很是有幫助的。」

若是想更加系統深刻地學習,可參考蔡子文同窗的音韻學入門推薦書目

音韻學研究者可以根據各類線索大體還原出古音的面貌。除了以上書籍,我再推薦古韻Polyhedron君錄製的《中古漢語語音教程》。看網絡視頻學習中古音,至關別開生面。

還有BYVoid君製做的韻典網,提供了包括《廣韻》在內多部古代韻書的線上查詢工具。

對輸入法做者來講,有女同車和Polyhedron整理的《廣韻全字表》是一份極其有用的資料。許多方言輸入法利用這份字表從漢字的中古音推導出現代音,做爲方言碼錶的模板,省去了大量註音工做。

佛振的中州韻

「開發Rime輸入法以前的數年間,我花了很多心思推敲、改進並擊按鍵的排布,使容易擊發的按鍵組合對應經常使用的音節,而且儘可能反映出語音內在的規律性,減小須要記憶的內容。」

問:「Rime/中州韻」的開發設計過程當中,編程方面最大的難點是什麼?語言方面最大的難點是什麼?

編程自己不難,難的是將問題抽象。要用一套代碼支持多種多樣的輸入法,甚至是不曾發明出來的,首先得抽象出一個通用的模型,而後拆分出一個最小的框架和一組完成單一功能的組件,以供按需組合,構成形態萬千的輸入法引擎。

至此問題只解決了一半,還有一個目標是讓用戶可以直接控制這部引擎,而沒必要進行嚴肅的編程。爲此我選取了相似JSON而語法更加簡潔靈活的YAML語言,在其基礎上定義了一套領域專用語言(DSL),稱爲「Rime輸入方案」。在輸入方案文本中,用戶只須列舉爲輸入法引擎選配的功能組件,並設置各組件所需的參數,便得以精確描述輸入法的行爲。

設計一個通用性強的拼音輸入法框架,須要對語音系統的知識有比較全面的瞭解,避免受制於有限的經驗做出設計上的失誤。例如漢語拼音裏面聲母、韻母的劃分,能夠在輸入法中加以利用:用聲母創建索引實現簡拼的功能,爲聲母、韻母分別設置模糊音輸入的功能。然而這樣寫出的程序會喪失一部分通用性,由於不一樣方言的語音系統有差別,觀察和研究《漢語拼音方案》所得的結論,極可能不夠廣泛化;用在其餘語言裏,或者用來處理基於字形的輸入法,甚至聲母、韻母的概念都徹底不適用了。語言學知識幫我判斷哪些語音規律有必要反映在輸入法程序裏,哪些不夠廣泛化,須要尋求更通用的解法。

最終語言學問題能夠轉化爲技術問題啦。Rime有項基於正則表達式的「拼寫運算」技術,它設計的目的是用來描述語音的演變規則。把兩個音系之間的對應規則用技術語言描述出來,咱們就能夠將一套古音輸入法改形成各地方言的輸入法,或是把一種方言輸入法轉換成臨近的方言。又由於正則表達式本質上是作字符串處理而與語音無關,因此「拼寫運算」能夠用於更普遍的場景,統一地解決爲各類音系定義簡拼、模糊音、基於規則的糾錯、標註聲調符號、定義雙拼方案、不一樣拼音系統之間的轉換等諸多問題。

問:經過設計開發「Rime/中州韻」輸入法,你驗證了哪些重要的理解和構想?

一是設計一套通用的音節切分算法。音節的變體形式如簡拼、模糊音,均可以用一套規則描述。

我曾參加過一次主題爲「拼音切分算法」的線上討論,和幾個主要開源輸入法Fcitx、ibus-pinyin、libpinyin以及SunPinyin的開發者一塊兒提出了這個構想。設想不管拼音方案是漢語拼音、註音或是其餘的拼寫方案,輸入法均可以對算法不加修改而作到將連續的輸入串以音節爲單位作切分。音節切分是拼音輸入法作詞典查詢以前的必要步驟。這個構想偏偏也是設計一個通用拼音輸入法的前提。那次討論後一年多,我才最終經過完成「拼寫運算」的設計和開發,驗證了這個構想。

另外一個構想是將專業速錄鍵盤多鍵並擊的工做原理應用到普通電腦鍵盤,從而創造一種高效、省力、富有節奏感的輸入方式。

這項小發明叫作「宮保拼音/Combo Pinyin」,它將一組按鍵同時按下、由不一樣的按鍵組合產生不一樣的拼音音節。看似主鍵盤區的字符按鍵能夠產生的組合遠遠多於拼音中的音節數,然而其中能按照指法用雙手溫馨地擊出的組合數並不寬裕。開發Rime輸入法以前的數年間,我花了很多心思推敲、改進並擊按鍵的排布,使容易擊發的按鍵組合對應經常使用的音節,而且儘可能反映出語音內在的規律性,減小須要記憶的內容。

最終的設計不少地方都符合音韻學原理:聲母按發音部位分組,排列在鍵盤左半區;g,k,h與j,q,x在與韻母的搭配上存在互補關係,所以這兩組聲母共存於一組按鍵;韻母的結構中,介音和韻尾變化多,而韻腹變化少,所以介音i,u,ü由最靈活的右手食指控制,便於與其餘手指造成組合,韻腹的元音則安排在較不靈活的拇指和無名指;韻尾-i, -u交叉排列在與介音i,u相對的行,能夠輕鬆地用食指、中指並擊獲得韻母iu, ui,這是考慮到普通話裏相同的元音不會同時出如今介音和韻尾的位置上,也就是說不存在*iei, *uou這類組合。

問:在百度PC輸入法開發團隊中你的做用是什麼?百度輸入法有沒有受到「小狼毫」輸入法的影響?

我有幸在百度PC輸入法立項的時候加入這個團隊,接到的第一個任務是開發一個高質量的輸入法詞庫,這包括利用百度強大的中文資源構建雲輸入詞庫、訓練語言模型、根據PC輸入法的須要進行裁剪等數據處理工做。後來我又擔任輸入法前端邏輯和新功能的開發。

百度擁有小團隊沒法比擬的資源,其工做方法也十分高效和民主,每一個人的意見都獲得充分表達和客觀評估,而在團隊的決策中發揮做用。起初我雖負責後端詞庫的研發,也一塊兒參加前端輸入法架構設計的討論,分享了此前設計和開發Rime輸入法的經驗。最終開發團隊一致決定採用與業界主流的作法炯然不一樣,而多見於開源輸入法的先後端分離架構。Rime亦是得益於這種架構,保證了平臺一致性,並且簡化了設計,下降了開發難度。

問:相反,從百度輸入法中,「Rime/中州韻」有沒有找到能夠借鑑的地方?

印象最深入的是百度輸入法專業的測試團隊,他們爲輸入法設計了專門的測試工具和工做方法。測試經過後,還有一套嚴密的流程控制產品上線和跟蹤用戶反饋。吾儕的小製做嘛,由於可調教的選項衆多,每每測試不充分,帶着問題上線也是有的。後來我學到一招,爲「小狼毫」增設了一個手動升級的通道,在全量推送新版本以前,先給有經驗的用戶試用「搶鮮版」,以期提早發現並及時修復可能存在的嚴重問題。

後來我還負責維護百度輸入法的工程配置和構建腳本。編譯、數字簽名、打安裝包乃至自動上線的一整套操做,不只用自動化腳本實現,還支持許多參數用來知足不一樣安裝渠道的定製需求。我想到,構建過程的自動化,對於開源軟件更加劇要了,由於開源合做者更難保證使用一致的開發環境。由此受到啓發,我也改進了「小狼毫」在Windows平臺的編譯流程,用腳本簽出代碼、檢測編譯依賴、構建第三方庫,取代原先須要手工操做的衆多步驟。結果這個項目的參與度真的有所提升。可見開源不僅是把源碼發佈出去,還須要各類努力讓源碼對別人更有用。

問:對於輸入法產品,大型開發團隊(如百度)和小型團隊或我的在開發流程上有什麼不一樣?相應形成各自哪些產品上的優缺點?

我不精於這方面的思考,只管猜猜看吧。

首先是產品的定位不一樣,形成最終的產品形態千差萬別。

大團隊分工明確,流程嚴謹,產品的每個功能在開發以前都由產品人員作調研和設計,保證對結果有明確預期。從反面看,穩健意味着少有大的驚喜。小團隊更加靈活,能快速適應變化,勇於作更多嘗試。難的是風險控制,結果容易受偶然因素的影響……還有一個不利因素是資源有限。Rime的許多功能設計,都爲此做出妥協,力求用低成本實現不俗的效果。

反正寫開源軟件和在大公司開發產品,除了碼代碼這項操做比較相似,二者真是大有不一樣呢。

更多人的中州韻

「我近來都在反省,參與開源,哪些地方沒作對。反省完,也就有了未來的方向。」

問:做爲一個開源項目,Rime的代碼來源都有哪些?

Rime的代碼包含一個C++的核心算法庫、一個用來維護輸入方案和詞典文件的數據集、以及分別爲Linux、Mac、Windows平臺開發的輸入法前端。

俺的主張是不重複造輪子,除非須要把輪子造得更圓。爲了同時保證開發效率和軟件的品質,Rime引用了大量的開源程序庫。例如用yaml-cpp作YAML文件的解析、用darts-clone提供詞典中的trie樹結構、用kyotocabinet作爲支持用戶詞典的數據庫、用opencc作高質量的漢字繁簡轉換。爲了把好的功能提供給更多用戶,第三方庫的代碼可否跨平臺,是一個重要的選擇標準。Boost庫提供的正則表達式、文件系統操做、進程間通訊、線程處理等設施,解決了不少跨平臺的麻煩。正由於在這些優秀開源軟件的基礎上開發,Rime才得以集中精力解決前人不曾解決的輸入法難題。

我和Zou Xu同窗一塊兒完成了Rime算法庫的大部分代碼。這個輸入法逐漸爲人所知後,收到很多朋友提交的patch,或是修復程序漏洞,或是添加新的功能。Windows和Mac平臺上,輸入法介面的許多重要特性,如對候選字排版的控制以及配色主題支持,都靠網友們幫忙開發。Linux系統上的fcitx-rime綁定則是由Fcitx輸入法團隊獨立完成的。

Rime收錄的輸入方案包含了一些開放版權的輸入法如倉頡碼、五筆86版、五筆畫、粵拼等,還有一些網友創做的輸入法如各類雙拼方案、宮保拼音、吳語上海話、蘇州話拼音、中古漢語拼音……Rime用家的創造力是使人讚歎的,咱們只能從中選取有表明性的幾例隨輸入法一塊兒發佈。

而詞典數據部分更是聚集了許多人的勞動。Rime最初使用的詞彙表,來源於Google開源的Android拼音詞典,以及CC-CEDICT漢英詞典。爲了作到傳統漢字和簡化字並蓄,我又對照新酷音輸入法(Chewing)及開放中文轉換(opencc)的詞庫,對全部詞彙的傳統字形作了修正。輸入法發佈後,不斷根據網友的反饋查漏補缺,更有瑾昀、雪齋、攴君等幾位仁兄,持續地提交使用中發現的錯字、錯音,並整理添加了許多有用的詞彙。多虧了諸君努力,雖然咱們受限於資源只能維護一個小而精的詞庫,但其品質仍是獲得了用家承認。

問:在開發過程當中,收到過哪些重要的反饋?其中有沒有哪些影響了開發設計的思路?

有很多呢。

早期的版本曾用Python語言編碼、用SQLite數據庫構建詞典,輸入法的響應速度不佳。連城同窗是把我招進百度的面試官,也是Rime最先的用戶之一。他建議我嘗試改用執行效率更高的C++。依計重寫Rime的過程當中,針對響應速度的優化成了我時刻關注的問題。譬如,根據輸入法使用中的特色,有效候選結果常有成百上千個,而最初展示給用戶的候選詞只有不足十個,因而詞典的結構作了針對性的設計,詞典查詢運用生成器模式惰性取詞,這對控制響應時間和資源佔用都有很大幫助。

「小狼毫」0.9發佈後,Rime的開發和用戶有了更多互動。我也更深地瞭解到衆人對輸入法的期待是如何地多樣。有時我只當是牽就用戶的提議而增長一個新特性,誰知一旦新版本發佈出去,竟又生出許多意想以外的玩法。誰能想到輸入碼反查,這一發自上世紀的輸入法技術,還能將輸入法活用,看成查詢古漢語音韻的工具書呢。無論你懂沒懂啊,我是大開眼界了。

問:多數人認爲「Rime/中州韻」輸入法是一種小衆輸入法,這裏的「小衆」是一些具有什麼特色的用戶?

有幾類人愛用。

一是學習和研究語言文字的朋友。他們在學習和工做中要用到傳統漢字,相比依賴於簡繁轉換的輸入法,Rime用字更準確,並且可以兼顧大陸、港臺等地用字習慣的差別。這些朋友還根據本身的須要,創造了用來輸入國際音標、外文字母、乃至藏文、彝文等少數民族語文的輸入方案。集成到Rime以後,可以在行文中方便地切換輸入語言。

一是致力於方言傳承和保護的朋友。Rime能夠幫助他們用較少的勞動,製做出本身家鄉話的輸入法,而且不難達到與《漢語拼音》輸入法一致的效果。
一是輸入法愛好者,輸入法一貫用自家釀造(DIY)的,甚麼輸入法平臺,早都耍得有模樣;終於又有了新的玩具,還能使用拼寫運算,那是必須折騰一番的。

一是苦命的Linux用家,若不滿意默認拼音輸入法的效果,可選擇的替代品真的很少。Rime處理好了一些其餘開源輸入法不曾關注的細節,例如候選詞的編輯操做、學習調頻策略等。恰如其分地營造出「好使」的錯覺。

還有純粹的geek技術高手,Rime提供高度可定製性正對胃口;對工具的要求就是輕巧快速,用開源再沒必要憂心隱私泄露。

最讓我吃驚的是,剛發佈代號爲「鼠須管」的Mac版本時,受用家推崇的緣由居然是它「速度快、在Macbook電腦上不會卡頓」……始料未及的反饋,佛振無言以對。幸運的是後來的新款Macbook配備了高速SSD硬盤,幫助其餘用戶解決了輸入法卡頓的困擾。

我勉強總結出一個共同點,Rime用家是懂輸入法、善用工具的一批人。非此不可容忍它存在的種種不足。

問:不少人都很期待Rime的移動版本,在將來你有這方面的計劃嗎?

我近來都在反省,參與開源,哪些地方沒作對。反省完,也就有了未來的方向。

舉例來講,先時花了很多力氣爲Rime實現一個Windows前端,以求用有限的代價儘早推出「小狼毫」。可是Windows輸入法與軟件的兼容性問題是出名地多,至今還有不少疑難雜症未能解決。假使當初不急於造這個輪子,而是設法找到一個有前景的開源實現,並參與改進,那麼就能憑藉衆多開源高手的智慧解決這些棘手的問題,咱們爲「小狼毫」所做的開發,也會對開源社區更有用些。

術業有專攻,受限於精力和技術廣度,以一人之力決計沒法在方方面面都作到足夠好。開源協做的模式是每一個開發者專一於本身擅長的領域,將成果做爲可複用的代碼開放給協做者。

從此我會更加專一於Rime的核心算法(已在作針對移動平臺的優化),還要完善API、文檔和輔助工具,使這個程序庫對開發者更加友好:讓關注功能的開發者可以理解代碼並動手做出改進,讓專業的移動平臺開發者可以利用Rime的API輕鬆地構建各個移動平臺的輸入法。若能如此,Rime在開源之路上就得到了大成功。


更多精彩,加入圖靈訪談微信!

圖片描述

相關文章
相關標籤/搜索