Voice Wake とプッシュ・トゥ・トーク

モード

  • ウェイクワードモード(デフォルト): 常時オンの Speech 認識器がトリガートークン(swabbleTriggerWords)を待機します。マッチするとキャプチャを開始し、部分的なテキストでオーバーレイを表示し、沈黙後に自動送信します。
  • プッシュ・トゥ・トーク(右 Option ホールド): 右 Option キーを押し続けると即座にキャプチャします—トリガーは不要です。ホールド中にオーバーレイが表示されます。解放すると、短い遅延後にテキストを調整できるようにファイナライズして転送します。

ランタイム動作(ウェイクワード)

  • Speech 認識器は VoiceWakeRuntime に存在します。
  • トリガーは、ウェイクワードと次の単語の間に意味のある休止があった場合にのみ発火します(約0.55秒のギャップ)。オーバーレイ/チャイムは、コマンドが始まる前でも休止時に開始できます。
  • 沈黙ウィンドウ: スピーチが流れているときは2.0秒、トリガーのみが聞こえた場合は5.0秒。
  • ハードストップ: 暴走セッションを防ぐために120秒。
  • セッション間のデバウンス: 350ミリ秒。
  • オーバーレイは VoiceWakeOverlayController を介して、コミット/揮発性の色分けで駆動されます。
  • 送信後、認識器はクリーンに再起動して次のトリガーをリッスンします。

ライフサイクル不変条件

  • Voice Wake が有効で、パーミッションが許可されている場合、ウェイクワード認識器はリッスンしているはずです(明示的なプッシュ・トゥ・トークキャプチャ中を除く)。
  • オーバーレイの可視性(X ボタンによる手動閉じを含む)は、認識器の再開を妨げてはなりません。

固定オーバーレイ障害モード(以前)

以前は、オーバーレイが固定されて表示され、手動で閉じた場合、Voice Wake が「死んだ」ように見えることがありました。これは、ランタイムの再起動試行がオーバーレイの可視性によってブロックされ、後続の再起動がスケジュールされなかったためです。

強化:

  • Wake ランタイムの再起動はオーバーレイの可視性によってブロックされなくなりました。
  • オーバーレイの閉じる完了は、VoiceSessionCoordinator 経由で VoiceWakeRuntime.refresh(...) をトリガーするため、手動 X-閉じは常にリッスンを再開します。

プッシュ・トゥ・トーク固有事項

  • ホットキー検出は、右 OptionkeyCode 61 + .option)のグローバル .flagsChanged モニターを使用します。イベントを観察するだけです(スワローしません)。
  • キャプチャパイプラインは VoicePushToTalk に存在します: Speech を即座に開始し、部分をオーバーレイにストリーミングし、解放時に VoiceWakeForwarder を呼び出します。
  • プッシュ・トゥ・トークが開始されると、デュエルオーディオタップを避けるためにウェイクワードランタイムを一時停止します。解放後に自動的に再起動します。
  • パーミッション: Microphone + Speech が必要。イベントを見るには Accessibility/Input Monitoring の承認が必要です。
  • 外部キーボード: 一部は右 Option を期待どおりに公開しない可能性があります—ユーザーがミスを報告する場合はフォールバックショートカットを提供してください。

ユーザー向け設定

  • Voice Wake トグル: ウェイクワードランタイムを有効にします。
  • Hold Cmd+Fn to talk: プッシュ・トゥ・トークモニターを有効にします。macOS < 26 では無効。
  • 言語とマイクピッカー、ライブレベルメーター、トリガーワードテーブル、テスター(ローカルのみ。転送しません)。
  • マイクピッカーは、デバイスが切断された場合でも最後の選択を保持し、切断されたヒントを表示し、デバイスが戻るまで一時的にシステムデフォルトにフォールバックします。
  • サウンド: トリガー検出時と送信時にチャイム。デフォルトは macOS "Glass" システムサウンド。各イベントに任意の NSSound ロード可能ファイル(例: MP3/WAV/AIFF)を選択するか、No Sound を選択できます。

転送動作

  • Voice Wake が有効な場合、トランスクリプトはアクティブなゲートウェイ/エージェント(Mac アプリの他の部分で使用されるのと同じローカル vs リモートモード)に転送されます。
  • 返信は最後に使用されたメインプロバイダー(WhatsApp/Telegram/Discord/WebChat)に配信されます。配信が失敗した場合、エラーがログに記録され、実行は WebChat/セッションログ経由で引き続き表示されます。

転送ペイロード

  • VoiceWakeForwarder.prefixedTranscript(_:) は送信前にマシンヒントを前置します。ウェイクワードとプッシュ・トゥ・トークパスの間で共有されます。

クイック検証

  • プッシュ・トゥ・トークをオンにし、Cmd+Fn を押し続け、話し、解放: オーバーレイは部分を表示してから送信するはずです。
  • ホールド中、メニューバーの耳は拡大したままである必要があります(triggerVoiceEars(ttl:nil) を使用)。解放後にドロップします。