我最近在整理一份 ACLS 的講稿,120 張投影片、將近三萬字,全部寫在 Keynote 的講者附註裡。上課時我習慣把筆電擺在講桌上,每講完一段就轉頭去瞄一眼下一段要說什麼。

轉頭這個動作很小,小到聽的人未必說得出哪裡怪,但它每一次都把我跟台下的連線切斷一次。低頭看稿更明顯,你一低頭,全場都知道你在念稿。

我戴 Even Realities G2 一陣子了。它的字是投影在鏡片上的,看出去像一塊懸在正前方兩公尺處的字幕,不擋人臉。第一次戴上去我就在想:講稿如果出現在這個位置,那個轉頭的動作就不必存在了。

官方已經有提詞功能,但它不知道我翻到第幾張

Even 內建了 Teleprompt,可以把一整份文字丟上鏡片,用語速自動捲動或用 R1 戒指手動推進。這是第一方功能,免費、不必接電腦,做得也很完整。

問題是它跟投影片是兩條各走各的線。你得先把稿子貼進去,然後在台上同時管兩件事:投影片翻到哪、稿子捲到哪。只要有一次不同步(臨時跳過一張、回頭補一句),接下來整場都在找位置。

而那份講稿,本來就寫在 Keynote 的講者附註裡。我要的其實只有一句話:翻到第幾張,就顯示第幾張的附註

盤點過同類型的東西,Google Slides 有人做過類似的(powerslides),Android 上有離線提詞機(whisprompt),但把「翻頁」和「講稿行號」綁在一起的,當時找不到。那就自己做。

SlideCue 在 G2 鏡片上的提詞畫面:上排四格顯示現在時刻、授課時間、下課倒數與講稿分頁,下方是講稿內文與指示行的箭頭
鏡片上實際的樣子。上排是現在時刻、已經講了多久、離結束還剩多久;左側箭頭指著正在念的那一行。實際鏡片是單色綠、576 × 288 像素。

卡住的地方是:眼鏡看不到我的電腦

這個東西之所以要做一個星期而不是一個晚上,關鍵在架構。

Even Hub 的外掛跑在手機裡。手機不知道我筆電上的 Keynote 播到第幾張,眼鏡更不知道。能問出「現在播到第幾張」的,只有一支跑在那台 Mac 上的程式。

所以 SlideCue 是三段接力:

Mac背景常駐的小程式,去問 Keynote 播到第幾張、那張的講者附註是什麼
手機透過同一個 Wi-Fi 收下整份講稿
G2 眼鏡藍牙收到之後畫在鏡片上

這個設計有代價。使用者必須在自己的 Mac 上多裝一支免費的程式,這件事我誠實寫進了商店說明。倒不是偷懶,是這條路本來就沒有捷徑。後來這也成了送審前我最擔心的一題,因為不確定官方能不能接受「需要電腦伴隨程式」的外掛。

好消息是講稿在連上的當下就整份存進手機了。所以演講中途 Wi-Fi 斷掉,鏡片上的字不會消失,你還是可以用手勢自己往下推。

一個星期的進度

日期做到哪裡
8/20先驗可不可行:Keynote 願不願意誠實回報頁碼、R1 戒指能不能反過來翻投影片。三項全過才動工
8/21第一次在眼鏡上看到自己的講稿。當天晚上把語音跟隨接通
8/22打包成一般人可以雙擊安裝的 Mac App、寫好說明網站、評估要不要支援 PowerPoint 和 Windows
8/25送 Even Hub 審核。當天晚上被退件
8/26改完重送,早上通過,中午公開上架

中間真正花掉時間的,沒有一項是我一開始預期的。

真正卡住我的那幾個問題

畫面一直在抖,而那個畫面不是我畫的

實機上一滑動鏡腿,整段文字就跟著上下晃。我照著「是不是我重畫太頻繁」這個方向修了三輪:讓每次送出的行數固定、把連續的重畫合併、把時間欄位降低更新頻率。三個都是真問題,也都真的改善了一點,但抖動還在。

破案的線索是一組對不上的數字:畫面一直在動,我的重畫次數卻只有 20 秒兩次。那就代表動的不是我。是眼鏡的韌體自己在捲那個文字框,完全不經過我的程式。

解法很小:把接收手勢的框換成一個內容永遠固定、根本沒有可捲空間的框,韌體想捲也捲不動。

這件事後來變成我的一條通則:當「畫面在動」和「我做了幾次動作」對不上時,先懷疑那不是你在動。

鏡片上有字會憑空消失,而且不會報錯

眼鏡韌體的字型不是全套。遇到它沒有的字,不會報錯、不會顯示替代符號,就是安靜跳過,那個字直接不見。

實測缺的包括 ,還有中文的「稿」字。中文不是全有全無,常用字在、次常用字可能不在。所以講稿的頁碼指示原本想寫「稿 1/2」,最後改成 (1/2)

現在我的習慣是,任何要進鏡片的新符號,先做一張測試頁推上去用眼睛確認,不要相信程式跑得動就等於看得到。

語音跟隨聽得懂我在念什麼,卻對不上稿

語音跟隨是讓箭頭自己往下走的功能,麥克風用眼鏡上的(演講會走動,離筆電很遠,但眼鏡永遠在臉上)。

第一版的辨識結果是這樣:

第二,第一章正常不代表没事,20分钟后再做一章。

我念的是:

第二,第一張正常不代表沒事,二十分鐘後再做一張。

意思幾乎對,但簡體字、同音錯字、數字寫法全部不一樣,程式拿去跟講稿比對時分數只有 0.353,勉強貼著門檻,箭頭有時動有時不動。

後來的解法跟模型大小無關,是換了一個想法。整份講稿我本來就有,機器要做的其實只有一件事,在已知的文字裡找出我念到哪一行。於是我把整份講稿當成提示詞餵給辨識引擎,它立刻自己把簡體改成繁體、把錯字改回來,比對分數跳到 0.882。

這個想法還帶來一個意外的好處:既然只是對齊,模型就不必大。實測下來,141MB 的小模型跟 1.5GB 的大模型,對齊分數完全一樣,而小的快得多。最後選了小的,下載也只要一次。

整條路徑和判斷方式,畫成一張圖比較快:

SlideCue 語音跟隨流程圖。上半:G2 眼鏡麥克風收音,經藍牙送到手機,手機再經 Wi-Fi 送回 Mac,whisper 辨識與對齊都在 Mac 完成,只把「第 N 行」這個數字回傳給眼鏡。下半:取聽到的最後 16 字,拆成相鄰兩字一組,跟目前這行往後 3 行算重疊率,最高分 ≥ 0.3 就把箭頭移到那一行,低於 0.3 則原地不動。
上半是聲音跑一圈的路徑,下半是 Mac 上判斷「我念到第幾行」的方式。

圖上有兩件事值得單獨講。一是眼鏡從頭到尾都不知道我在說什麼,它收到的只有一個數字,所以鏡片端不必背著一個語音模型,也不會因為辨識而變慢或耗電。二是比對用的是模糊比對而不是逐字比對,因為講者本來就會即興改幾個字,辨識也一定會聽錯幾個;真要求一模一樣,箭頭大概整場都不會動。

上架版本裝好之後,完全找不到我的電腦

開發的時候,眼鏡上的外掛直接從我 Mac 上開的伺服器載入。所以它只要回頭看一眼「我是從哪個位址來的」,就等於知道我的電腦在哪,完全不用設定。上架之後這條路斷了:外掛改成從 Even 的伺服器下載,它回頭看到的位址變成手機自己,於是永遠連不到那台 Mac。

更麻煩的是它安靜地失敗,不當機、不報錯,畫面就是一片空白。如果不是先想到這件事,第一批使用者裝完只會覺得「這東西壞了」。

現在的做法是,電腦端會顯示一組三位數的連線碼,在手機輸入一次就好,之後會記住,只有換場地才要重來。

斷線重連時,它自己把自己打死

斷線之後程式會自動重連。為了快,它同時對好幾個可能的位址發出連線,誰先回應就用誰。問題出在「等多久才算失敗」這件事,我設的是 2.5 秒。但重連的計時器不管上一輪結束了沒有,時間一到就再發一輪。於是第一輪還在等,第二輪已經開始,第三輪又跟著來,連線一輪一輪疊上去。實測 30 秒累積到 19 條,而電腦端對每一條連進來的裝置都會老實地送出整份講稿,等於自己對自己發動攻擊,當場癱瘓。

這種問題正常開發完全遇不到,因為開發時網路都是好的。但它一定會在台上發生,因為台上網路最不穩。

我的講稿在會場 Wi-Fi 上是裸奔的

這是整個專案裡我最不想承認、但也最該寫出來的一件事。

電腦端一開始對任何連進來的裝置都無條件送出整份講稿,沒有任何驗證。實際測過:從同一個網路連進去,不需要任何步驟,直接收到完整的 120 張、29,247 字,第一句就是 ACLS 課程的開場白。而我的講稿裡有臨床個案。

醫院、研討會、飯店的 Wi-Fi 都叫「區域網路」,但上面同時有幾百個陌生人。「只在區網」從來不等於安全。

目前的處理是,只服務第一個連上的裝置,預設開啟,其他一律拒絕。這只是緩解,真正的修法是配對加上端到端加密,還沒做完。所以我在 GitHub 的說明和商店頁都把這條限制寫清楚,沒有藏起來。

我跟 AI 是怎麼分工的

這個專案從第一行到上架,都是我跟 Claude Code 一起做的。但「一起做」這件事的品質,取決於幾條我這一年慢慢定下來的規矩。

不接受推論,只接受實測

上架前有一題卡了很久:官方文件寫著網路連線要填白名單,而我要連的,是使用者家裡那台電腦的浮動位址,根本填不出來。照文件推論,這個架構死路一條,必須另外架一台中繼伺服器。

我沒有接受這個推論,而是要求做一次真機實測。結果是:目前根本沒有在執行期強制白名單,連線完全正常。一次實測,省掉了一個星期的無用工程。

同一條路失敗兩次就換路

想把電腦端做成單一執行檔的時候,用官方的打包方式連試兩次都失敗。第三次我沒有再試,改成做成一般的 Mac App,結果不但更快,還更像 Mac 上該有的樣子:使用者拖進「應用程式」就好,不必安裝任何開發工具。

「做完」的定義是有一條不是自己做的檢查通過了

AI 說「已完成」不算完成。這個專案的驗收方式是 92 項自動化測試,加上我本人戴著眼鏡站在房間裡實際翻投影片。抖動那個問題就是這樣抓到的:所有測試都過,但眼睛看得到它在晃。

需要視野的時候,派五個去分頭跑

決定要不要支援 PowerPoint、Windows、Google Slides 的時候,我一次派了五個 AI 分頭調查,各自回報一份評估。合起來的結論跟「先做哪個平台」沒什麼關係,是一句更冷靜的話:現在真正能用這個東西的人數是零,因為連線位址還寫死在我自己那台電腦上。

於是順序全部重排:先讓別人裝得起來,再談支援誰。上架素材刻意不排第一,上架一個別人裝了也不能用的東西沒有意義。

送審:被退件一次,理由是截圖

8/25 晚上送出,當晚就被退。理由只有一句:截圖不符合標準,請用最新版模擬器重拍。

原因有點好笑:我電腦裡有兩個版本的模擬器,指令抓到的是舊的那個。舊版拍出來是不透明的黑底,新版拍出來才是透明底。G2 是透視鏡片,商店會把你的鏡片畫面疊在真實場景照片上,黑底疊上去就變成一塊實心方塊,一看就不像真的。

重拍、重送,隔天早上 11 點通過,中午公開上架。從被退件到上架,總共不到 12 小時。

SlideCue 開場的翻頁方式選單,兩個選項為 R1 戒指翻頁與我自己翻
開場二選一:R1 戒指當家(戒指同時翻投影片和講稿),或簡報器當家(你自己翻,鏡片跟著走)。兩個不能同時主控,會互相打架。

在哪裡裝

SlideCue 已經在 Even Hub 商店公開上架,免費。它有兩個部分,兩個都裝才會動。

裝在哪怎麼拿
手機端外掛手機的 Even Realities app打開 app 進入 Even Hub(插件商店),搜尋 SlideCue 安裝,裝好後會出現在「我的插件」
電腦端程式你的 Macslidecue.pages.dev 下載,或直接抓 SlideCue.zip(約 72 MB)

電腦端第一次啟動有兩個地方要注意:

  1. 要按右鍵再選「打開」,直接雙擊會被 macOS 擋下來。那是因為我沒有買 Apple 的開發者簽章,不是程式有問題。
  2. 它會問「SlideCue 想要控制 Keynote」,要按「好」。不允許的話它讀不到講稿。

之後電腦上會跳出一組三位數的連線碼,在手機的 SlideCue 輸入一次,打開 Keynote 按播放,講稿就上鏡片了。往後每次開機電腦端都會自動在背景待命,不必再管它。

手機和 Mac 要連在同一個 Wi-Fi。 會場沒有網路的話,開手機熱點讓 Mac 連上也可以,我自己現在都是這樣用,順便解掉上面提到的裸奔問題。

完整的設定說明、鏡片上每一格是什麼意思、常見問題,都寫在說明頁:

它現在還做不到什麼

寫在最後,因為這比功能清單重要:

下一場課我會戴著它上台。真的用過一輪,才知道還缺什麼。

◆ ◆ ◆