Aplicación complementaria para macOS
Voice Wake
Modos
- Modo palabra de activación (predeterminado): el reconocedor de voz siempre activo espera los tokens de activación (
swabbleTriggerWords). Al coincidir, inicia la captura, muestra la superposición con texto parcial y lo envía automáticamente tras el silencio. - Pulsar para hablar (mantener Opción derecha): mantén presionada la tecla Opción derecha para capturar inmediatamente—sin necesidad de activación. La superposición aparece mientras se mantiene presionada; soltarla finaliza y reenvía tras un breve retardo para que puedas ajustar el texto.
Comportamiento en tiempo de ejecución (palabra de activación)
- El reconocedor de voz reside en
VoiceWakeRuntime. - El disparador solo se activa cuando hay una pausa significativa entre la palabra de activación y la siguiente palabra (~0.55s de separación). La superposición/tono puede comenzar en la pausa incluso antes de que empiece el comando.
- Ventanas de silencio: 2.0s cuando hay flujo de voz, 5.0s si solo se escuchó el disparador.
- Parada forzada: 120s para evitar sesiones descontroladas.
- Rebote entre sesiones: 350ms.
- La superposición es manejada por
VoiceWakeOverlayControllercon coloreado comprometido/volátil. - Después del envío, el reconocedor se reinicia limpiamente para escuchar el siguiente disparador.
Invariantes del ciclo de vida
- Si Voice Wake está habilitado y se han concedido los permisos, el reconocedor de palabra de activación debería estar escuchando (excepto durante una captura explícita de pulsar para hablar).
- La visibilidad de la superposición (incluyendo el descarte manual mediante el botón X) nunca debe impedir que el reconocedor se reanude.
Modo de fallo de superposición persistente (anterior)
Anteriormente, si la superposición se quedaba visible atascada y la cerrabas manualmente, Voice Wake podía parecer "muerto" porque el intento de reinicio del runtime podía bloquearse por la visibilidad de la superposición y no se programaba ningún reinicio posterior. Refuerzo:
- El reinicio del runtime de activación ya no se bloquea por la visibilidad de la superposición.
- La finalización del descarte de la superposición activa un
VoiceWakeRuntime.refresh(...)a través deVoiceSessionCoordinator, por lo que el descarte manual con la X siempre reanuda la escucha.
Detalles de pulsar para hablar
- La detección de tecla rápida usa un monitor global
.flagsChangedpara la Opción derecha (keyCode 61+.option). Solo observamos eventos (sin consumirlos). - La canalización de captura reside en
VoicePushToTalk: inicia Speech inmediatamente, transmite parciales a la superposición y llama aVoiceWakeForwarderal soltar. - Cuando comienza pulsar para hablar, pausamos el runtime de palabra de activación para evitar conflictos de captura de audio; se reinicia automáticamente después de soltar.
- Permisos: requiere Micrófono + Voz; para ver eventos necesita aprobación de Accesibilidad/Monitoreo de Entrada.
- Teclados externos: algunos pueden no exponer la Opción derecha como se espera—ofrece un atajo alternativo si los usuarios reportan fallos.
Ajustes visibles para el usuario
- Alternar Voice Wake: habilita el runtime de palabra de activación.
- Mantener Cmd+Fn para hablar: habilita el monitor de pulsar para hablar. Deshabilitado en macOS < 26.
- Selectores de idioma y micrófono, medidor de nivel en vivo, tabla de palabras de activación, probador (solo local; no reenvía).
- El selector de micrófono preserva la última selección si un dispositivo se desconecta, muestra una indicación de desconectado y temporalmente recurre al predeterminado del sistema hasta que regrese.
- Sonidos: tonos al detectar el disparador y al enviar; predeterminado al sonido del sistema "Glass" de macOS. Puedes elegir cualquier archivo cargable por
NSSound(ej. MP3/WAV/AIFF) para cada evento o seleccionar Sin Sonido.
Comportamiento de reenvío
- Cuando Voice Wake está habilitado, las transcripciones se reenvían a la puerta de enlace/agente activa (el mismo modo local vs remoto usado por el resto de la aplicación de mac).
- Las respuestas se entregan al proveedor principal usado por última vez (WhatsApp/Telegram/Discord/WebChat). Si falla la entrega, el error se registra y la ejecución sigue siendo visible a través de WebChat/registros de sesión.
Carga útil de reenvío
VoiceWakeForwarder.prefixedTranscript(_:)antepone la pista de máquina antes de enviar. Compartido entre las rutas de palabra de activación y pulsar para hablar.
Verificación rápida
- Activa pulsar para hablar, mantén Cmd+Fn, habla, suelta: la superposición debería mostrar parciales y luego enviar.
- Mientras se mantiene presionado, las orejas de la barra de menú deberían permanecer agrandadas (usa
triggerVoiceEars(ttl:nil)); se reducen después de soltar.
Barra de MenúSuperposición de Voz