一個人做語音輸入小工具,掉進了多少坑


AI 也不是每次都答對

現在很多人都覺得,有了 AI,寫程式一定輕鬆很多。

我的答案是:有比較快,但沒有比較省腦。

很多 Bug,我都是先問 AI。有時候它一下就找到問題,真的像請了一位很厲害的助手。但也有不少時候,它一本正經地告訴我一個完全錯的方向,我照著改了半天,最後才發現,真正的原因根本不是它說的那個。

後來我慢慢學會一件事。AI 很像一個超級博學的朋友,它知道很多事情,但不一定知道你現在遇到的,就是哪一件。所以現在我還是會問 AI,但也會懷疑 AI。畢竟,程式最後要負責的人,還是自己。


我曾經以為,一個星期就能做完

專案剛開始時,我很有信心,心裡想著:「不就是語音辨識,再加幾個按鈕嗎?應該很快。」

結果做著做著才發現,每完成一個功能,就會冒出三個新問題。修完一個 Bug,又會發現另一個 Bug 正在排隊。有時候,一整天都在修同一個問題,下班時卻感覺什麼都沒完成。

後來我終於接受一件事。寫程式不像堆積木,它比較像在拼拼圖——拼到最後一塊之前,你永遠不知道下一片會藏在哪裡。


一位不知道要換班的口譯員

程式裡負責聽你說話的那個角色,很像一位口譯員——他得一直記著你剛剛講了什麼,才能翻得準。

有陣子,程式會莫名其妙當機,拖都拖不動。

查了才發現:每次「重新開始聽」,程式都找了一位全新的口譯員上場,但舊的那位從來沒有真的下班,一直站在後面占位置。人越站越多,最後把系統擠爆。

解法很簡單:叫「同一位」口譯員喘口氣、重新歸零就好,不用每次都找新人。

問題是,過一陣子又出包——講到一半突然完全沒反應。一查才發現,這位口譯員根本沒有真的清空腦袋:官方自己寫好的「清空記憶」那行程式碼,被自己用一行註解封印起來,沒有真的執行。他表面上重新開始,其實滿腦子舊雜訊,講越久越恍神,最後乾脆罷工。

最後折衷:大多數時候讓他喘口氣就好,但每講幾句、或每隔一陣子,就真的換一位腦袋乾淨的新人上場。

後來才知道,連 Google 自家的語音服務,都規定一個連線最多撐 5 分鐘,超時就得換人。

原來全世界的口譯員,都撐不了太久。


原來程式也需要熱身

以前我一直以為,程式只要按下去,就應該立刻開始工作。直到有一天,我才發現不是這麼回事。

語音模型第一次啟動時,就像冬天剛起床一樣,需要一點時間暖機。如果什麼都沒準備,就直接開始辨識,整個畫面都會卡住,看起來就像程式壞掉了、按鈕跑位了一樣——後來查才發現,不是按鈕真的跑位,是那幾秒整個畫面根本沒在畫,模型在背景默默用掉了所有運算資源。

後來我乾脆讓它在背景偷偷先完成準備,等真正開始使用時,它早就醒了。使用者感覺不到,但整個體驗順了很多。有時候,看不見的等待,才是最重要的等待。


有些功能,最後我決定不要硬修

「自動貼上」是我期待很高的一個功能。理想中的它,是辨識完成後,文字自己跑到正在輸入的地方,完全不用動手。

這件事有點像請一位信差,幫你把一封信送到隔壁棟大樓某個人手上。信差確實可以確認自己有沒有走進正確的那棟大樓——但走進大樓之後,信有沒有真的塞進正確那間辦公室、正確那個人的桌上,還是不小心塞錯了、掉在走廊上,信差自己也沒辦法回頭跟你保證。做完這個功能之後,我發現有些地方很好用,有些地方卻怎麼試都不穩定,查了很多資料才知道,這正是同一個道理:程式可以確認「有沒有切到正確的視窗」,卻沒辦法確認「那個視窗裡的輸入框,有沒有真的接住這次貼上」——而且不是只有我遇到,連小有名氣的開源工具都是同一套做法:開放一堆「延遲時間」的參數讓使用者自己慢慢調,沒有人真的解決過這個問題。

最後,我沒有硬說它百分之百可靠,反而直接在說明裡提醒大家:遇到特殊網站時,手動貼上可能還比較快,甚至老實建議大家這個功能先別急著開。有時候,承認限制,比假裝完美更值得信任。


原來 AI 也需要「猜」

剛開始測試時,我常常只講兩、三個字,結果辨識率一直不理想。後來才發現,問題不一定是模型。

想像一下,如果有人突然跟你說一句:「可以。」你是不是也會想問:「可以什麼?」語音辨識其實也一樣,一句完整的話,前後都有線索,它比較容易猜出真正的意思。所以現在,我都會建議大家自然地說完整一句話,通常效果反而更好。


我不是在寫程式,我是在當偵探

開發到後來,我每天都很像在辦案:發現一個奇怪現象,提出幾個嫌疑犯,一個一個排除,最後找到真正的兇手。很多時候,真正的答案都跟第一眼看到的完全不一樣。

有一次,語音辨識突然完全沒反應。我第一個念頭是「完了,又有 Bug」,接著檢查程式、檢查設定、重新安裝套件,能想到的方法幾乎都試了一遍。折騰了半天,抱著最後一絲希望把麥克風重新插了一次——好了。

原來只是接觸不良。那一刻真的有點哭笑不得。從那天開始,每次遇到奇怪的問題,我都會先確認硬體是不是正常,再開始懷疑自己的程式——寫程式久了才知道,真正花時間的,不是修 Bug,而是找到 Bug。


一位死腦筋的門衛

有段時間,我一直被一個問題搞瘋。

明明 Windows 已經開放麥克風權限,程式卻還是堅持:「不行,你沒權限。」

重開機又好了。

查了半天才發現,根本不是 Windows 的問題。真正的兇手,是程式底層那位「死腦筋的門衛」。第一次把你擋在門外後,他就把答案寫進小本本,以後再也不重新確認。就算管理員早就改口說「可以進來了」,他還是只相信自己的舊筆記。

最後,我乾脆把他的小本本沒收,規定每次都重新問一次。問題就這樣消失了。

有時候,不是門鎖壞了,只是門口站了一個太固執的人。


一個還沒破的案子

不是每個 Bug 都能漂亮收場。

有一個殘影問題,到現在偶爾還是會偷偷出現。它就像一個小偷,每次只露臉不到一秒,等你回頭看時,又裝作什麼事都沒發生。

我一路排除了座標、指令、動畫,最後發現真正的原因,是底層元件自己的老毛病。既然抓不到,那就換個方法:我把它出現的機會壓到最低,從「常常看到」,變成「很難遇到」。

雖然沒有百分之百破案,但至少這個小偷,現在已經不太敢出門了。


真正花時間的,是大家不會注意的小地方

很多人以為,做這個工具最難的一定是語音辨識。其實不是。

這有點像裝潢一間房子——搬進去的人會稱讚沙發好看、電視夠大,卻沒有人會誇獎牆壁裡的電線走得多整齊,可是電線沒走好,家裡遲早會出事。真正花掉我最多時間的,就是這種牆壁裡的東西:按鈕要放哪裡、視窗怎麼不要擋到別人的工作、第一次啟動要不要等、設定怎麼讓第一次使用的人也看得懂——這些東西每一個都不像大功能,卻默默吃掉了很多時間,有時候一個只有幾行程式的小細節,反而比一個大功能還難決定。

這也讓我對「功能」這件事的想法慢慢改變。開發過程中,我想到很多很酷的功能——翻譯、摘要、AI 助手、語音控制……每一個都覺得很酷。但每做完一個,我都會問自己:如果今天我是使用者,我真的每天都會用它嗎? 很多答案是「不會」,於是又默默把它刪掉了。不是做不到,而是我希望打開程式時,不用花時間研究哪個按鈕要按。真正的設計,不是一直增加,而是知道什麼該留下。


我開始相信「先睡一覺」

以前遇到 Bug,我都會一直查,查到半夜,查到眼睛都快睜不開,總覺得再多十分鐘一定就能找到答案。結果通常沒有。反而很多次都是隔天起床,泡一杯咖啡,重新看一次程式,不到五分鐘就發現問題。

後來我開始相信,有些 Bug 不是你不夠努力,只是大腦也需要重新開機。


我偷偷藏了一點小驚喜

一直修 Bug,其實是一件很累的事,所以偶爾我也想替自己找點樂趣,於是偷偷放了一些小彩蛋。例如講出特定的數字,就會變成表情符號;講「換行」,真的會直接跳到下一行,而不是打出「換行」兩個字。

這些功能不是必要,也沒有特別宣傳,只是希望哪一天,有人剛好發現時,會忍不住笑一下。我一直覺得,一個好工具除了好用,也可以有一點點溫度。


最有成就感的一天

有一天,我沒有新增任何功能,也沒有修任何 Bug,只是把程式打開,用它完成了一整天的工作。直到晚上,我才突然想到:今天居然沒有遇到任何問題。

那一刻我才發現,原來一個工具最成功的時候,不是它有多厲害,而是你用了它一整天,卻幾乎忘記它的存在。


做完之後,我才真正開始

很多人以為,程式做完就結束了,其實剛好相反。真正的開始,是第一位使用者打開它的那一天——每一個回饋、每一個建議,甚至每一個 Bug,都會讓它慢慢變得更好。

每次修好一個 Bug,當然會開心。但真正讓我有成就感的,其實是看到有人說一句:「這個工具真的很好用。」短短幾個字,比修掉十個 Bug 還有成就感。畢竟寫程式的目的,不是讓程式碼變漂亮,而是真的有人願意每天打開它、使用它。

所以如果你現在正在使用這個小工具,謝謝你,也謝謝你願意陪它一起慢慢長大。

Files

語音浮動小工具-1.0.0-win.zip 147 MB
2 days ago

Get 語音浮動小工具(Voice Float Widget)

Buy Now$1.00 USD or more

Leave a comment

Log in with itch.io to leave a comment.