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)を使用)。離した後に元に戻ります。