國字點字轉換程式

zonble
Oct 3, 2024

三月的時候我取消了一張飛往東京的機票。那個星期四,我在家裡悶頭寫了一段程式,這段程式可以在網頁上,執行國字與台灣點字間的轉換。

我很期待這一次的東京之行。每年三月在東京有一個iOS研討會,那些日本人會邀請不少歐美的工程師來到東京演講,是對台灣iOS工程師來說最方便的國際研討會,三月又是櫻花的季節,在議程前後幾天,還可以去看看燈火中的夜櫻。我可能還會去伊勢丹還是台場的什麼百貨公司,幫外婆買一頂帽子 — 外婆喜歡帽子,尤其是色彩繽紛但是不失莊重的款式,這在日本的百貨公司到是有不少選擇。

因為疫情,這個研討會從 2020 到 2023 停辦了四年,2024年終於恢復,我早早買了門票、機票與住宿,不過我去不了,而且,在星期一之後,外婆也用不到帽子了,我也看不到外婆收到禮物的樣子了,她現在躺在第二殯儀館的冰櫃裡頭,等著週六的告別式之後火化。

週一下午大約三點半,還在公司的無聊週會中,收到家裡的電話通知,外婆正在急診室。急急忙忙跳上計程車,到的時候,母親那邊的親戚大概都到了,除了母親與弟弟,所有舅媽姨媽姨丈表弟都到了,還有一位教堂的牧師,在急診室門口打著電話,確定外婆是否曾經受洗。因為急診室狹小,大部分家屬在比較外頭的塑膠排椅上等候,姨媽、舅媽與外婆的印尼籍照顧工則在裡頭旁在病床旁。

心電圖監視器上面寫著血壓只有五十,只有正常人的一半,但是呼吸次數卻到了每分鐘三十次,急促的呼吸大概代表,外婆每一次發出的呼嚕聲,都沒辦法從呼吸器獲得太多空氣,這一台機器一直發出不悅耳的嘟嘟嘟聲響。外婆微開著眼睛,但是已經看不出她往哪裡看,面色已經是乾枯的蠟黃色,聽說這是肝臟已經失去作用時,才會出現的面色。大夫說,老人家了,根據經驗,不是今天,就是明天。

突然聞到一陣怪味道。舅媽掀開被子,找出濕紙巾,我的力氣比較大一些,從旁邊抱著拉高外婆的身體,讓印尼照顧工幫外婆擦拭,換了一條乾淨的成人尿布。外婆的體重與體溫都還在我的手中,還是沉的,還是熱的。

好奇怪。飛掠我腦中的反而是另一些不相關的畫面與味道。我想著我祖父祖母那邊,年節時在糖果盒準備的大概都是牛軋糖與南洋核桃糕,但是外公外婆這邊,總是一些不是糖果的零食 — 在仿漆器的塑膠糖果盒裡頭,裡頭總是各種黃褐色與淡淡的乾燥香味,裝滿了魷魚絲、帶殼的開心果還有龍眼乾。

兩個小時的時候,我還是心不在焉地想著外婆的體溫還有糖果盒。醫院把外婆移到了地下室,我們還有幾個小時可以在這瞻仰外婆的儀容。外婆已經是九十七歲高齡,平靜地睡著離開,離去之前也排掉了身上的不潔之物,家人全都齊聚一堂,牧師帶著家屬唱著詩歌。我已經沒辦法想像比這更圓滿的結束了,但感覺胸口還是有種散不去的悶。

回頭我就在社群網站上發文,我要免費轉讓這周研討會的門票,誰這周誰能去東京對研討會有興趣都可以私訊,我會發給你入場的QR code,紀念 T 恤想改尺寸則發信給主辦單位。然後是取消住宿,訂的飯店本來就是入住時才付費,要取消不是問題,線上按個按鈕就好。然後這時候才取消機票,沒辦法退全額,但也不重要了。工作方面,之前請假了,雖然取消了行程,但也沒什麼得回去上班的理由與心情。

我悶在家。在告別式上正式告別外婆的前兩天,我還是弄點事情做。我寫了一段程式。

這段程式可以在網頁中將國字轉換成點字,也可以反過來將點字轉換回國字 — 台灣點字其實就是用六碼點字的64種組合表現注音符號,所以,只要先寫好一段注音與點字的來回轉換函式,再想辦法找個詞典,把國字斷詞之後轉換成注音,再轉成點字,這就是國字轉點字。整個工程,應該還是先從注音與點字的轉換著手,轉換規則在網路上都能找到。

反之,將點字轉換成注音,再用個自動選字的注音輸入法把這些注音批次打出來,就可以實作點字果國字功能。這種轉換自然不會太準確,但之前也沒看到別人做過,尤其是在網頁裡頭做,但我剛好有這樣的資源 — 我這兩年剛好用了 TypeScript/JavaScript 語言寫了一套自動選字輸入法。

因為做過一陣子輸入法的關係,以前就約略看過點字注音法,那時候就有點想搞清楚點字是怎麼一回事的念頭,而現在剛好什麼都不能做,於是就把這個想搞懂的題目拿出來。原來點字輸入法是特殊的點字鍵盤、或是用一般鍵盤模擬點字鍵盤輸入注音符號,同時按下六個鍵位的其中幾個來代表一個點字,這樣的輸入法之前就有人做過了,而我大概也不會拿這個輸入法打字,那我就試試看專心在整篇文字轉換的功能上。

這兩年有了很多用AI輔助寫程式的工具,雖然這一段程式不算困難,但是AI看起來幫不上忙。

這段程式就是在做文字解析:讀進了一段字串資料之後,寫一個迴圈,從前往後讀,每讀到一個地方,就往後多讀幾個字元 — 合法的注音符號加上聲調號最多四個字元,點自則固定二到三個字元左右,嘗試解析這幾個字元是否能夠組成合法的注音組合或台灣點字,是的話,就擷取這一段文字,按照注音與點字互轉的規則轉換,不是的話,就再繼續嘗試偵測這些文字是不是標點、阿拉伯數字或是拉丁字母。

大方向如此,實際寫起來就發現還是有些麻煩的狀況,像是英文的句號與小數點,在 ASCII 字元中是同一個,但是在點字中用的卻是不同的字符。所以在讀到同一個字符的時候,還得加上一些前後判斷,如果前後是英文字母就當成句號,前後是數字則應該是小數點。

機械性地寫了一些單元測試,就發現不太可能把各種組合轉換成點字之後,都可以成功從點字轉換回來。一般狀況下,你完全有可能把一些錯誤的標點放在句首,像是把逗號、句號或是下引號放在句子最前頭,轉換程式看到這樣的東西,也只能一對一轉換成對應的點字,但是把這樣轉換出的點字轉回國字就一定會出問題:因為這些點字與數字、拉丁字母的規則衝突,同樣的點字出現在句首,應該要當成數字或拉丁字母才對。

我決定,不去假設會出現標點符號放在錯誤位置的狀況,就當成數字或拉丁字母處理,這就是我想要的最佳結果。一名軟體工程師走進所謂的 flow,高度專注的心流狀態之後,可能真的是很好的逃避,尤其是寫一些自己想寫,而不是燃燒時間換取溫飽的程式碼的時候。

處在我自己的心流世界中,可以自己大膽決定想要排除哪些例外,決定什麼是想要的正確結果。走出這個世界,即使已經是最圓滿的結果,但也從來不是你想要的、能決定的。

叫AI大語言模型寫一個迴圈很簡單,但2024年的現在,你告訴他「寫一個將注音符號轉換成點字的迴圈」,並不會給你正確的結果。人類提供給語言模型的訓練素材中,還沒讓他學會那些例外,像是注音轉成點字的過程中,遇到ㄓ、ㄔ、ㄕ單獨存在時,後面要補上一個空韻,而遇到一、ㄨ、ㄩ之後還有另外一個韻母的結合韻,則要結合成單一的點字。AI還不知道這些,就算 AI 已經學很多事,但人類為自己的語言、行為所設下的規則,還是比 AI 的理解範圍來得多。

但是人類又能夠理解多少呢?我不知道,而我自己能問的,也只有,我能理解多少呢?我所能理解的邊界又在哪?我還不知道什麼?我又還不知道多少是我還不知道?我對我自己的理解又有多少?

寫著寫著,我反而在想,在一個有好幾個同心圓的圖形中,我到底是在什麼位置。我還是在機械所能掌握的範圍與人類可以掌握的範圍的這個區間吧?這種區間叫做活著嗎?寫這樣段程式,是不是只是在感受到體溫的消褪、生命的流逝的時候,對著機器感受一下自己還活著。還是,就跟生成式 AI 在遇到不認識的話題時,會胡說八道、製造幻覺,而我也只是在一種幻覺當中呢?

也或許我是在製造一個聊以安慰的替代品。寫一段很多人都能寫出來、但是之前就是沒人寫的程式,弄出一些好像是新東西的玩意,來替代那些慢慢一個個消失的事物。

想代替的,可能是那個在腦中冒現的糖果盒,我還是可以自己去弄些魷魚絲跟龍眼乾,但也完全不一樣了,畢竟我不會再是那個在茶几旁一直翻開糖果盒的十歲男孩。可能是我知道接下來家人會出售外婆的住處,然後我會陸續失去什麼祖母家、外婆家這些可以稱之為家的場所。可能是,只是因為血緣這種理由,就可以獲得的、無條件的愛。

也或許是我只是沒有理由地想把自己搞得很累,把自己搞得筋疲力盡,沒有力氣再去想一些巨大卻又無解的問題。那個星期四,我寫程式一直寫到自己都不記得多晚,然後倒頭就睡。

--

--