Skip to main content

語音喚醒與按鍵通話

模式

  • 喚醒詞模式 (預設): 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));釋放後縮回。