Voice Wake&プッシュトゥトーク
モード
- ウェイクワードモード(デフォルト):常時オンの音声認識がトリガートークン(
swabbleTriggerWords)を待機。一致するとキャプチャを開始し、部分テキストと共にオーバーレイを表示、無音後に自動送信。 - プッシュトゥトーク(右Optionキー長押し):右Optionキーを長押しするとトリガー不要で即座にキャプチャ開始。押している間オーバーレイが表示され、離すとテキストを微調整できるよう短い遅延の後に確定・転送。
ランタイムの動作(ウェイクワード)
- 音声認識は
VoiceWakeRuntime内に存在。 - ウェイクワードと次の単語の間に意味のあるポーズ(約0.55秒の間隔)がある場合のみトリガー発火。コマンドが始まる前のポーズ中にオーバーレイ/チャイムを開始可能。
- 無音ウィンドウ:発話中は2.0秒、トリガーのみ聞こえた場合は5.0秒。
- ハードストップ:暴走セッションを防ぐため120秒。
- セッション間のデバウンス:350ms。
- オーバーレイは
VoiceWakeOverlayController経由で制御。committed/volatileの色分けあり。 - 送信後、認識器はクリーンに再起動して次のトリガーを待機。
ライフサイクルの不変条件
- Voice Wakeが有効でパーミッションが付与されている場合、ウェイクワード認識器はリッスンしているべき(明示的なプッシュトゥトークキャプチャ中を除く)。
- オーバーレイの表示状態(Xボタンによる手動閉じを含む)が認識器の再開を妨げてはならない。
固着オーバーレイの障害モード(過去)
以前は、オーバーレイが表示されたまま固着して手動で閉じた場合、ランタイムの再起動がオーバーレイの表示状態によってブロックされ、後続の再起動もスケジュールされないため、Voice Wakeが「死んだ」ように見えることがありました。
強化策:
- ウェイクランタイムの再起動はオーバーレイの表示状態によってブロックされなくなった。
- オーバーレイの閉じる完了時に
VoiceSessionCoordinator経由でVoiceWakeRuntime.refresh(...)がトリガーされるため、手動のX閉じで常にリッスンが再開。
プッシュトゥトークの詳細
- ホットキー検出は右Option(
keyCode 61+.option)のグローバル.flagsChangedモニターを使用。イベントの観察のみ(スワローしない)。 - キャプチャパイプラインは
VoicePushToTalk内:即座にSpeechを開始、部分テキストをオーバーレイにストリーム、リリース時にVoiceWakeForwarderを呼び出し。 - プッシュトゥトーク開始時にウェイクワードランタイムを一時停止して、オーディオタップの競合を回避。リリース後に自動再開。
- パーミッション:マイク+音声認識が必要。イベントの確認にはアクセシビリティ/入力モニタリングの承認が必要。
- 外部キーボード:一部は右Optionを期待通りに公開しない場合がある。ミス報告があれば代替ショートカットを提供。
ユーザー向け設定
- Voice Wakeトグル:ウェイクワードランタイムを有効化。
- Cmd+Fn長押しで話す:プッシュトゥトークモニターを有効化。macOS 26未満では無効。
- 言語&マイクピッカー、ライブレベルメーター、トリガーワードテーブル、テスター(ローカル専用、転送なし)。
- マイクピッカーはデバイス切断時に最後の選択を保持し、切断ヒントを表示、デバイスが戻るまでシステムデフォルトに一時的にフォールバック。
- サウンド:トリガー検出時と送信時にチャイム。デフォルトはmacOSの「Glass」システムサウンド。各イベントに
NSSoundで読み込み可能な任意のファイル(MP3/WAV/AIFFなど)を選択するか、No Soundを選択可能。
転送の動作
- Voice Wakeが有効な場合、トランスクリプトはアクティブなGateway/エージェントに転送(macアプリの他の部分と同じローカル vs リモートモードを使用)。
- 応答は最後に使用されたメインプロバイダ(WhatsApp/Telegram/Discord/WebChat)に配信。配信失敗時はログに記録され、実行はWebChat/セッションログで引き続き確認可能。
転送ペイロード
VoiceWakeForwarder.prefixedTranscript(_:)が送信前にマシンヒントを先頭に追加。ウェイクワードとプッシュトゥトークの両パスで共有。
クイック確認
- プッシュトゥトークをオンにし、Cmd+Fnを長押しして話し、離す:オーバーレイに部分テキストが表示された後に送信されるはず。
- 長押し中、メニューバーの耳が拡大したまま維持(
triggerVoiceEars(ttl:nil)を使用)。リリース後に縮小。