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에 있습니다: 즉시 음성 인식을 시작하고, 부분 결과를 오버레이에 스트리밍하며, 놓기 시VoiceWakeForwarder를 호출합니다. - 푸시 투 토크가 시작되면 웨이크 워드 런타임을 일시 중지하여 오디오 탭 충돌을 방지합니다. 놓기 후 자동으로 재시작됩니다.
- 권한: 마이크 + 음성 인식 필요; 이벤트 확인에는 접근성/입력 모니터링 승인 필요.
- 외부 키보드: 일부는 오른쪽 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)사용); 놓은 후 축소됩니다.