search
我是如何開發歲寒輸入法的:滑行輸入的探索之路丨Matrix 精選

我是如何開發歲寒輸入法的:滑行輸入的探索之路丨Matrix 精選

Matrix是少數派的全新產品,一個純凈、小眾的寫作平台,我們主張分享真實的產品體驗,有實用價值的互聯網領域經驗、思考。歡迎忠於寫作,喜好分享的朋友參與內測。我們會不定期挑選 Matrix 最優質的文章,展示來自用戶的最真實的體驗和觀點。

本文內容僅代表作者本人觀點,文章對標題和排版略作修改,原文鏈接

編輯說我前面寫的那篇《拼音原來可以這麼玩!》偏軟文風格,手起刀落就給刪了……其實我只是文風比較活潑跳脫而已啦……好吧,確實有點軟。由此可以看出,少數派對文章的質量要求還是很高的。那麼,請允許我重新講述這個關於歲寒輸入法的故事吧。

我與歲寒

首先,先隆重介紹一下我自己,我叫歲寒,而我要向你介紹的這款輸入法叫歲寒輸入法,沒錯,你猜得沒錯,我正是歲寒輸入法的作者。這裡之所以用的「臨歲之寒」的筆名,是因為我最開始用微信登陸少數派時用的就是「歲寒」這個昵稱,而申請到 Matrix 內測資格的卻是我的郵箱,也就是說,我自己把自己的筆名給佔用了……好尷尬呀。

「歲寒」一詞的出自論語:子曰,歲寒,然後知松柏之後凋也。不過後來,我發現了更時髦的解讀——「歲寒」與《冰與火之歌》中臨冬城史塔克家族的家訓「Winter is coming」有異曲同工之妙。

開發動機

大多數時候,一個人做一件事情,是有其動機的,就像殺人總得有殺人動機是一個道理。開發一款應用,特別是開發一款前途無望的應用時,動機就變得令人好奇。其實我就是想在手機上寫寫東西而已。你看我文風如此清奇,想必可以看出我是「練過的」,曾經我的夢想是成為一名小說家(現在也還是)。我當時嘗試了一些手機輸入法,體驗都不能令我滿意,輸入繁複,效率也一般,於是我萌生了開發一個自己的輸入法的想法。

這是我最開始的動機,十分簡單,甚至有些中二。但動機這個東西是會變化的,起初只是想嘗試嘗試,後來是想用它來證明自我,再後來它變成了一種堅持,變成了一份事業。

滑行為王

那是 iPhone 橫空出世,Android 開始當道的時代,觸摸屏的出現使手機的可操控性上了一個台階,但是大多數手機仍然沿用舊有的點擊式輸入,在我看來,這是一種極大的浪費。當時 Swype 滑行輸入法已經問世,但還不適合於中文輸入,卻給我帶來了許多啟發。從那之後,利用手機的滑行特性來提高輸入的效率和趣味便成為了歲寒的核心理念,而這一理念,至今不變。

但最開始時,我所構想的輸入法並不是現在這種拼音輸入方案,而基於五筆的改進型,做了歲寒輸入法 v1.0 和歲寒輸入法 v2.0,不過嘗試的結果都以失敗告終。從中,我得到的教訓是,五筆此路不通。當然了,我想在失敗的原因中,有一部分原因是我的輸入法界面做得太醜陋了,嗯……可能有一半吧,嗯……也可能是大部分吧,嗯……也可能是全部。(左邊是歲寒輸入法 v1.0,右邊是歲寒輸入法 v2.0)

於是我放棄了在五筆方案上的嘗試,而開始思考更為大眾所熟悉的拼音輸入方案有沒有可能與我的滑行理念取得融合。

放眼當時江湖,拼音滑行輸入法已經呼之欲出,像搜狗、百度、Google 這些大廠嗅覺之靈敏不必分說,自然能夠意識到滑行輸入對用戶的吸引力有多大。不過他們大都因循守舊,只在舊有的 qwerty 布局上作錦繡文章,利用其技術上的優勢,使用數學分析的方法提取用戶滑行中的特徵,從中獲得用戶的真實輸入意圖。而這種做法存在天然的缺陷,那就是滑行距離太長,因此效率甚至還不如點擊式的全拼輸入法。

與此同時也有敢於打破桎梏的,先行者有 AEVIOU 蜂窩式中文滑行輸入法、閃雲滑行輸入法(但真的一點也不好用)還有盛大也湊熱鬧地做了一個盛大輸入法。難能可貴的是,他們都敢於在 qwerty 鍵盤上做些微調來適應滑行輸入的需要。但問題在於,他們並沒有走對方向——他們無一例外都選擇了動態布局的滑行方案。

所謂動態布局,就是在用戶按下第一個字母后,據此在觸點中心(或在周邊)浮現一個新的鍵盤,以讓用戶可以方便的滑行到想要的鍵位上。可能我的描述有失精準,但做法上大體如此。方便用戶滑行這個用意自然是很好,但同樣存在一個天然的缺陷,即每一個鍵位可能對應一個完全不同的新鍵盤,如果用戶想快速輸入怎麼辦呢?好像只有把所有的變化都背下來吧。所以,這種做法在效率上也有問題,正確的方嚮應該是靜態布局。

方案上的缺陷可以通過技術上的進步來彌補,但不可能予以真正的解決。想要徹底解決,就要對方案進行重新設計。這意味著要徹底打破 qwerty 布局對我們思維的限制,去構想一個適合於漢語拼音滑行的新布局,而不是改一點留一片。既然不適合,就應該推翻掉重來,要相信「不破不立」

於是,我站在一片荒地上開始我的耕作。

布局之道

想要在靜態布局上實現高效的拼音滑行,一定要結合拼音的結構特點才行。經過研究,我發現,漢語拼音在結構上非常有特點,這裡我指的是數學上的排列組合,而不是音韻學上的平上去入。說了你可能不信,我一個做拼音輸入法的人對音韻學幾乎一竅不通。

漢語拼音方案是利用英文已有的 26 個字母轉化而來,在此我們應該感謝已逝的周有光先生,感謝他的天才創造。這裡,我把 a、o、e、i、u、v(習慣上,我們用 v 來替代 ü)稱為韻母字母,除此之外的字母稱為聲母字母,那麼拼音在結構上,存在這樣的兩條重要的規律:

除了 zh、ch、sh,其它聲母就只有一個字母,而 zh、ch、sh 都以「h」為後綴;

在韻母中只存在3個聲母字母:n、g、r,其中 r 只有「er」一種情況,聲母字母總是綴在韻母字母之後,而且當 n 與 g 同時存在時,n 總是在 g 之前。

把「er」算為特例的話,在聲母和韻母中則大量的存在 3 種後綴結構:h、n、g。

如果按照習慣的做法,一定要按順序滑過相應的鍵位才能輸入相應字母的話,我們在一個平面上是不可能使所有其它韻母都能夠以最短的距離靠近這 3 個字母所對應的鍵位的,必然會導致遠近不一的情況。

我問自己,「按順序滑過相應的鍵位才能輸入相應字母」是否是必要的?比如我想輸入sh,我是不是一定要從「s」滑到「h」上不可?

此時,我想起了高中化學裡面「族」這個概念,元素周期表中的每一豎列都是一個族,在同一個族中的元素在化學性質上會有相似之處。受此啟發,我想到,如果有一群鍵位在滑行時都表現得像「h」,那輸入 zh、ch、sh 時就近滑行不就可以了嗎?n 和 g 的情況也是類似的。那麼多少鍵位適合做這一群鍵位呢?我想,一行應該是一個不錯的單位。我效仿化學的概念,稱它們為「h 族」、「n 族」和「g 族」。

巧合的是,拼音中最長的韻母不過 4 個字母,因此歲寒輸入法的鍵盤有 4 行,除去第一行,正好剩下 3 行可用,於是他們就與 3 個鍵族一一對應起來了。

接著,我對韻母字母的位置作了一番研究后,發現 u、i、v 出現在 a、o、e 之前的情況更多一些,因此 u、i、v 放置在 a、o、e 之上。但這帶來了另一個問題,u、i 離 n 族有一行的距離,想要輸入 in、ing 和 un 的話比較麻煩。為了解決這個問題,我引入了聲韻混合鍵——在第二行找兩個聲母作為滑行時 u 和 i 的替代,即在點擊時它們還是自身,但是當從它們上滑出時,它們就代表 u 或 i 了。於是,我得出了下面這樣一個布局。

再配合下列輸入規則,

  • 單個的聲母或韻母直接點擊獲得;
  • 帶 h 的聲母從首字母滑到第二行;
  • 帶 n 的韻母從首字母滑到第三行;
  • 帶 ng 的韻母從首字母滑到第四行;
  • 利用 y,r 這兩個聲韻混合鍵可以快速的輸入 un,in,ing;
  • 其它的韻母依照字母順序滑過即可;

從而在一個靜態布局上實現了「任何一個聲母或韻母都可以在一個操作之內完成」的目標。可以看到,歲寒輸入法並不是只有滑行,而是將點擊和滑行兩種操作結合起來,各取所長。誰說滑行輸入法就一定只有滑行操作?在只有一個字母的情況下,滑行輸入就有點脫褲子放屁的意味了。

在此,歲寒輸入法實際上是借鑒了雙拼輸入法的核心思想,即將拼音分為聲母和韻母,並將其作為基本的輸入單位,而非全拼那樣以字母為輸入單位。所以,從一開始,我就對外宣稱,歲寒輸入法是「雙拼變種」。說了也許你不信,我一個做雙拼變種輸入法的至今仍沒有掌握任何一款雙拼輸入法的具體用法。

而大多數滑行輸入法都喜歡在一次滑行之內就輸入一個拼音,你可能會說,這樣效率不是也更高嗎?在部分情況下確實如此,但將聲母和韻母分開輸入並非多此一舉,恰恰相反,這個做法為歲寒輸入法帶來了極大的輸入靈活性,也塑造了歲寒輸入法許多與眾不同的特性。

無二義性

在設計完歲寒輸入法的布局和輸入規則后,我驚奇地發現歲寒輸入法呈現出一種非常重要的特性——輸入聲韻的無二義性。簡單地說,就是任何一條滑行路徑都明確地指向某一個聲母或者韻母,不會存在歧義。

這有什麼可驚奇呢?要知道,這個特性是其它許多拼音輸入法都不具備的。還是以全拼和雙拼為例。

在全拼中,如果沒有分音鍵的話,平常輸入的許多拼音都是有歧義的,比如「xian」也可能是「xi'an」,那「gang」也可能是「gan'g」,這些情況其實非常普遍。之所以平時我們感覺不出來,是因為現在的輸入法都會很聰明地將兩種可能的結果都呈現給我們,或者預測當下我們意圖輸入的是什麼。這就是我所指的,通過技術的進步來彌補方案的缺陷。

而在雙拼中稍微好一些,因為引入了零聲母為作為無聲母情況的佔位,從而實現在拼音層面上的無二義性。但是既然雙拼每一次輸入的都是一個聲母或一個韻母,這個時候如果我們仔細去看,雙拼在聲母或韻母的輸入是否有無二義性時,就會發現它沒有,也不可能有。按照雙拼的分法,漢語拼音可分為 23 個聲母和 33 個韻母,而 23 + 33 > 26 * 2。簡單的數學計算可知,鍵位不夠表示這麼多聲韻,就算是番了一翻還是不夠,所以有些韻母勢必要擠在一起共用一個鍵位,出現「二女共侍一夫」的情況。不過雙拼方案還是很聰明地解決了這一問題,因為不是任意的聲母和韻母都可以組合成合法拼音,利用這一點,可以在已知聲母的情況下,確定用戶輸入的韻母到底是哪一個。但這也意味著,韻母的確定依賴於已輸入的聲母。

而在歲寒輸入法中,輸入本身是自解釋的,任何一次輸入都可以明確地知道這次輸入是聲母還是韻母,是聲母是哪個聲母,是韻母又是哪個韻母,不依賴於已經輸入的信息,也不依賴於還沒有輸入的信息。

無二義性這個性質非常之重要,歲寒輸入法幾乎所有與眾不同的特性都是以此為基礎。

自然生長

萬物有靈,生命的開始只需一顆種子和陽光雨露,就會自然生長。

歲寒輸入法對於我而言,就是這樣一個小生命,他後來的許多特性都不在我最初的設計預想之中。正像是在撰寫一部玄幻小說,小說的設定究竟可以如何組合演化,作者可能在動筆時並沒有完全想好,只是覺得這個設定很酷,而當劇情逐步演進,那些設定才會顯露出它們神奇的一面,也許會極大地出乎作者的意料。

當我去思考如何處理無聲母的拼音的情況時,我發現,既然歲寒輸入法有無二義性,那完全不需要任何多餘的操作,直接輸入韻母即可。於是我又想,為什麼其它拼音輸入法中韻母如此依賴於聲母,像在全拼中,韻母可以省略,而聲母是不可以省略的,韻母的地位為何會如此不堪呢?這很大程度上,是由於漢語拼音中存在無聲母的情況。因為總是有的東西沒有了,那肯定是省略了,而有可能有也有可能沒有的東西如果沒有,那就不好說是沒有了,還是省略了。那麼如果我假設所有拼音都有聲母會怎樣?於是我提出了一個概念——虛聲母,一個假設存在又從來用不著的聲母。既然所有拼音都有聲母,那麼在輸入時省略聲母就不是什麼奇怪的事情了。

需要指出的是,歲寒輸入法的虛聲母跟雙拼輸入法的零聲母是完全不同的,零聲母是「以有為無」,而虛聲母是「以無為有」

虛聲母可不是純粹為了炫技而提出的,且不說虛聲母豐富了拼音輸入的組合形式,配合歲寒輸入法的特徵碼機制可以有較地降低重碼率,就說如果沒有虛聲母,聲韻匹配機制就無從談起。

前面提到過,並不是任意的聲母和韻母都可以組合成合法的拼音,比如說「gi」這個拼音就是無效的。那如果出現這種情況,我應該怎麼辦呢?是應該直接認為用戶輸入錯誤忽略之,還是應該接受這個輸入但在候選區顯示一片空白,好讓用戶知道自己輸入錯誤了呢?此時,我退了一步想,為什麼出現這種情況時一定要認為是用戶輸入錯誤呢?說不定這正是用戶的意圖呢?有沒有可能他是想輸入第一個字的聲母和第二個字的韻母,不過剛好兩個不匹配而已?於是我設計了聲韻匹配機制,來幫用戶自動完成了這個操作。

這個特性可以利用來減少輸入的次數,比如我就經常輸入「f'er」來獲得「反而」,屢試不爽。而這一切必須在引入虛聲母之後才可以,因為第二個字省略了聲母。

而在加入聲韻匹配之後,歲寒輸入法立刻獲得了另一種特性——輸入無錯性。

這種無錯性表現在:

  • 用戶無法輸入不正確的聲母或韻母;
  • 用戶輸入不匹配的聲母和韻母時,會被拆成兩個拼音;
  • 省略聲母也是正確的。

因此歲寒輸入法不存在形式上輸入錯誤的情況。

獨特功能

除了上述的特性之外,歲寒輸入法還有許多獨特的功能。這些功能有的依賴於歲寒的特性,有的是為了解決某些場景下存在的問題,也有的解決了輸入法使用中普遍存在的疼點。

拼音替入

雖然歲寒輸入法不存在形式上的輸入錯誤問題,但由於用戶操作失誤,而輸入與其輸入意圖不符合的情況卻是不可避免的。應對這種情況,歲寒輸入法提供了一樣強大而簡單的功能——拼音替入。

因為歲寒可以在一次操作內輸入任何一個聲母或韻母,再加上其輸入無二義性,也不依賴於其它已有的信息,所以替換掉任意位置的某個聲母或韻母是一件輕而易舉的事情。這無論是對於全拼,還是雙拼都是難以做到的,因為即使勉強做到了,其操作勢必也無法做到簡潔明了。而在歲寒輸入法中,想要替換或插入一個聲母或韻母,操作僅僅是:選中想要操作的拼音,直接輸入正確的聲母或韻母即可。這個操作簡潔到沒有一絲冗餘,自然而強大。

截取優先

歲寒輸入法擁有手動造詞功能,造詞的方法是先輸入片語的拼音,然後將片語中的子片語點擊上屏之後就自動完成造詞。根據用戶的反饋,造詞功能在實際使用中存在這樣一個問題:歲寒輸入法是以特徵碼、等長度匹配、超長度匹配、不等長度匹配的順序顯示候選詞的,那麼在所要造的片語中涉及選字時就會特別麻煩,因為輸入的拼音越長,字的候選位置就會越靠後。

為了解決這一問題,我加入了截取優先功能,用戶可以選擇某個位置的拼音,命令輸入法以該位置之前的拼音作為優先檢索的條件。

片語回退

片語回退功能不依賴於歲寒輸入法的任何特性,它要解決的是日常輸入中的一個疼點,就是在輸入拼音完全正確的情況,用戶有可能手抖選錯了候選詞,好尷尬的!我們要刪除掉已經上屏的片語,然後還要重新再輸入一遍拼音,才能選擇正確的候選詞。問題是,有必要這麼麻煩嗎?刪掉已經上屏的片語,和再輸入一遍拼音這個工作為什麼不交給輸入法去做呢?

用戶只需要從 enter 鍵上向左滑出,一切就回到點擊候選詞之前的狀態。雖說「落子無悔大丈夫」,但這種時候就不要那麼較真了嘛。

上述三個功能,是我揀選歲寒輸入法中比較的代表性的功能,畢竟這不是使用說明書,沒有必要一一講解。其實歲寒輸入法還有其它一些功能,比如為了方便選字而加入的筆劃篩選功能,還有在用戶強烈要求下逐步探索后加入的連滑機制。

這個連滑機制最開始只是獨韻連滑,即只能和僅有一個字母的韻母進行連滑,後面放開了這一限制。但連滑機制並不是完美的——連滑機制只適用於方便某些拼音的輸入,並不能適用於全部拼音,這也是我沒有將它拿出來著重講解的原因。

歲寒輸入法也有很多不足之處,比如界面不夠美觀、詞庫不夠強大、智能整句功能也不夠強大(Android 版已有,iOS 還沒有)等等。但我想說的是,這些都是技術上的不足,技術上的進步可以彌補方案的缺陷,而技術上的不足卻不能夠掩蓋方案的光芒。有些技術上的難題,以個人之力確實難以克服,所以如果有認識像馬雲、馬化騰、雷軍、羅永浩這樣的人物的朋友,麻煩幫助引薦引薦,在此提前謝過。

如果你想了解更多關於歲寒輸入法的信息,可以查看 歲寒輸入法 iOS 版使用教程;如果你想下載歲寒輸入法的話,Android 用戶請前往 酷安的歲寒輸入法頁面,iPhone 用戶請前往App Store 搜索「歲寒輸入法」,這裡需要說明一下,Android 歲寒輸入法是免費的,而 iOS 歲寒輸入法是付費的,售價為 3 元人民幣。

寫在最後

歲寒輸入法於我已經不是一款應用那麼簡單了,他更像是我的孩子。最開始他蹣跚學步,跌跌撞撞,如今已能微微站定,他想朝大家揮手,想得到這個世界投射過來的目光。如要問歲寒今年幾歲?我想,大概是有 6 歲了吧。

熱門推薦

本文由 一點資訊 提供 原文連結

一點資訊
寫了5860317篇文章,獲得23246次喜歡
留言回覆
回覆
精彩推薦