macOS コンパニオンアプリ

Voice Wake

モード

  • ウェイクワードモード (デフォルト): 常時稼働する音声認識エンジンがトリガートークン (swabbleTriggerWords) を待機します。一致するとキャプチャを開始し、部分的なテキストを含むオーバーレイを表示し、無音後に自動送信します。
  • プッシュトゥトーク (右Optionキー長押し): 右Optionキーを長押しすると、トリガーなしで即座にキャプチャを開始します。長押し中はオーバーレイが表示され、離すと短い遅延後にテキストを確定・転送するので、テキストを修正できます。

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

  • 音声認識エンジンは VoiceWakeRuntime 内で動作します。
  • トリガーは、ウェイクワードと次の単語の間に意味のあるポーズがある場合にのみ発動します (~0.55秒の間隔)。オーバーレイ/チャイムは、コマンドが始まる前のポーズの時点で開始できます。
  • 無音ウィンドウ: 音声が流れている場合は2.0秒、トリガーのみが検出された場合は5.0秒。
  • ハードストップ: 暴走セッションを防ぐために120秒。
  • セッション間のデバウンス: 350ミリ秒。
  • オーバーレイは VoiceWakeOverlayController によって駆動され、確定/未確定の色分けが行われます。
  • 送信後、認識エンジンはクリーンに再起動し、次のトリガーを待機します。

ライフサイクル不変条件

  • Voice Wakeが有効で、権限が付与されている場合、ウェイクワード認識エンジンは(明示的なプッシュトゥトークキャプチャ中を除き) 待機しているはずです。
  • オーバーレイの可視性 (Xボタンによる手動での閉じる操作を含む) が、認識エンジンの再開を妨げることは決してありません。

オーバーレイが固着する障害モード (以前)

以前は、オーバーレイが表示されたまま固着し、手動で閉じた場合、ランタイムの再起動試行がオーバーレイの可視性によってブロックされ、その後の再起動がスケジュールされないため、Voice Wakeが「停止」しているように見える可能性がありました。対策:

  • ウェイクランタイムの再起動は、オーバーレイの可視性によってブロックされなくなりました。
  • オーバーレイを閉じる操作の完了時に、VoiceSessionCoordinator を介して VoiceWakeRuntime.refresh(...) がトリガーされるため、手動でXを押して閉じても常に待機状態に戻ります。

プッシュトゥトークの詳細

  • ホットキー検出は、右Option (keyCode 61 + .option) に対してグローバルな .flagsChanged モニターを使用します。イベントを監視するのみで (イベントを消費しません)。
  • キャプチャパイプラインは VoicePushToTalk 内に存在します: 即座に音声認識を開始し、部分的な結果をオーバーレイにストリーミングし、キーを離した時に VoiceWakeForwarder を呼び出します。
  • プッシュトゥトークが開始されると、オーディオタップの競合を避けるためにウェイクワードランタイムを一時停止します。キーを離した後に自動的に再開します。
  • 権限: マイク + 音声認識の権限が必要です。イベントを検知するには、アクセシビリティ/入力監視の承認が必要です。
  • 外部キーボード: 一部のキーボードでは右Optionが期待通りに公開されない場合があります。ユーザーから検知されないという報告があれば、代替ショートカットを提供してください。

ユーザー向け設定

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

転送動作

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

転送ペイロード

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

簡易検証

  • プッシュトゥトークをオンに切り替え、Cmd+Fnを長押し、話し、離します: オーバーレイに部分的な結果が表示され、その後送信されるはずです。
  • 長押し中、メニューバーの耳アイコンは拡大されたままであるはずです (triggerVoiceEars(ttl:nil) を使用)。離した後に元に戻ります。

メニューバー音声オーバーレイ