語音喚醒與按鍵通話
模式
- 喚醒詞模式 (預設): Always-on 的語音辨識器等待觸發 Token (
swabbleTriggerWords)。匹配時開始擷取,顯示帶有部分文字的覆蓋介面,並在靜默後自動發送。 - 按鍵通話 (按住右 Option): 按住右 Option 鍵以立即擷取——無需觸發詞。按住時覆蓋介面顯示;釋放時在短暫延遲後完成並轉發,讓您可以微調文字。
執行時行為 (喚醒詞)
- 語音辨識器位於
VoiceWakeRuntime。 - 只有當喚醒詞與下一個詞之間有 有意義的停頓 (~0.55s 間隔) 時才會觸發。覆蓋/鈴聲甚至可以在指令開始前的停頓時啟動。
- 靜默視窗:語音流動時為 2.0s,若僅聽到觸發詞則為 5.0s。
- 硬性停止:120s 以防止工作階段失控。
- 工作階段間的去除彈跳 (Debounce):350ms。
- 覆蓋介面透過
VoiceWakeOverlayController驅動,具有已提交/變動中的顏色區分。 - 發送後,辨識器乾淨地重啟以聆聽下一個觸發。
生命週期不變量
- 若語音喚醒已啟用且權限已授權,喚醒詞辨識器應處於聆聽狀態(除非正在進行明確的按鍵通話擷取)。
- 覆蓋介面的可見性(包含透過 X 按鈕手動關閉)絕不能阻止辨識器恢復。
黏滯覆蓋失敗模式 (先前)
先前,若覆蓋介面卡在可見狀態而您手動關閉它,語音喚醒可能會看似「死掉」,因為 Runtime 的重啟嘗試可能被覆蓋介面的可見性阻擋,且後續未排程重啟。 強化措施 (Hardening):- 喚醒 Runtime 的重啟不再受覆蓋介面可見性阻擋。
- 覆蓋介面關閉完成會透過
VoiceSessionCoordinator觸發VoiceWakeRuntime.refresh(...),因此手動 X-關閉總是會恢復聆聽。
按鍵通話細節
- 熱鍵偵測使用全域
.flagsChanged監控 右 Option (keyCode 61+.option)。我們僅觀察事件(不攔截)。 - 擷取管道位於
VoicePushToTalk:立即開始語音,將部分內容串流至覆蓋介面,並在釋放時呼叫VoiceWakeForwarder。 - 當按鍵通話開始時,我們暫停喚醒詞 Runtime 以避免音訊搶佔衝突;釋放後自動重啟。
- 權限:需要麥克風 + 語音;查看事件需要輔助使用/輸入監控核准。
- 外部鍵盤:部分鍵盤可能未如預期暴露右 Option——若使用者回報失敗,提供備用捷徑。
使用者介面設定
- Voice Wake 開關:啟用喚醒詞 Runtime。
- Hold Cmd+Fn to talk: 啟用按鍵通話監控。在 macOS < 26 停用。
- 語言與麥克風選擇器、即時音量表、觸發詞表、測試器(僅本地;不轉發)。
- 麥克風選擇器會在裝置斷線時保留最後的選擇,顯示斷線提示,並暫時退回至系統預設值直到裝置恢復。
- 音效: 觸發偵測與發送時的鈴聲;預設為 macOS “Glass” 系統音效。您可以為每個事件選擇任何可
NSSound載入的檔案(如 MP3/WAV/AIFF)或選擇 No Sound。
轉發行為
- 當語音喚醒啟用時,轉錄內容會轉發至活動的 Gateway/Agent(使用 mac 應用程式其餘部分相同的 Local vs Remote 模式)。
- 回覆會傳遞至 最後使用的主要供應商 (WhatsApp/Telegram/Discord/WebChat)。若傳遞失敗,錯誤會被記錄,且執行仍可透過 WebChat/工作階段日誌查看。
轉發負載
VoiceWakeForwarder.prefixedTranscript(_:)在發送前將機器提示 (machine hint) 加在轉錄內容之前。喚醒詞與按鍵通話路徑共用此邏輯。
快速驗證
- 開啟按鍵通話,按住 Cmd+Fn,說話,釋放:覆蓋介面應顯示部分內容然後發送。
- 按住時,選單列耳朵圖示應保持放大(使用
triggerVoiceEars(ttl:nil));釋放後縮回。