Activación por voz y pulsar para hablar
Requisitos
La activación por voz y pulsar para hablar requieren macOS 26 o posterior. En versiones anteriores de macOS, los controles se ocultan de la página de ajustes de voz, que en su lugar muestra el requisito de macOS 26.Modos
- Modo de palabra de activación (predeterminado): un reconocedor de voz siempre activo espera tokens de activación (
swabbleTriggerWords). Cuando hay coincidencia, inicia la captura, muestra la superposición con texto parcial y envía automáticamente tras el silencio. - Pulsar para hablar (mantener Option derecha): mantén pulsada la tecla Option derecha para capturar de inmediato, sin necesidad de activación. La superposición aparece mientras se mantiene pulsada; al soltarla, finaliza y reenvía tras una breve demora para que puedas editar el texto.
Comportamiento en tiempo de ejecución (palabra de activación)
- El reconocedor vive en
VoiceWakeRuntime. - La activación se dispara solo cuando hay una pausa significativa entre la palabra de activación y la siguiente palabra (
triggerPauseWindow= 0,55 s). La superposición/el timbre pueden iniciarse durante la pausa incluso antes de que comience el comando. - Ventanas de silencio: 2,0 s (
silenceWindow) cuando el habla está fluyendo, 5,0 s (triggerOnlySilenceWindow) si solo se oyó la activación. - Detención forzada: 120 s (
captureHardStop) para evitar sesiones descontroladas. - Antirrebote entre sesiones: 350 ms (
debounceAfterSend) después de un envío. - La superposición se controla mediante
VoiceWakeOverlayController, con coloración de texto confirmado/volátil. - Después del envío, el reconocedor se reinicia limpiamente para escuchar la siguiente activación.
Invariantes del ciclo de vida
- Si la activación por voz está habilitada y los permisos están concedidos, el reconocedor de palabra de activación permanece escuchando, salvo durante una captura activa de pulsar para hablar.
- La retirada de la superposición, incluida la retirada manual mediante el botón X, siempre reanuda el reconocedor:
VoiceSessionCoordinator.overlayDidDismissllama aVoiceWakeRuntime.refresh(state:)en cada ruta de retirada. Consulta Superposición de voz para ver el modelo de sesión/token.
Detalles de pulsar para hablar
- La detección de atajos usa un monitor global
.flagsChangedpara Option derecha (keyCode 61+.option). Solo observa eventos; nunca los intercepta. - La captura vive en
VoicePushToTalk: inicia el reconocimiento de voz de inmediato, transmite parciales a la superposición y llama aVoiceWakeForwarderal soltar. - Iniciar pulsar para hablar pausa el runtime de palabra de activación para evitar tomas de audio simultáneas; se reinicia automáticamente después de soltar.
- Permisos: requiere Micrófono + Voz; recibir eventos de teclado necesita aprobación de Accesibilidad/Monitorización de entrada.
- Teclados externos: algunos no exponen Option derecha como se espera. Ofrece un atajo alternativo si los usuarios informan fallos.
Ajustes visibles para el usuario
- Interruptor Activación por voz: habilita el runtime de palabra de activación.
- Mantener Option derecha para hablar: habilita el monitor de pulsar para hablar.
- Selectores de idioma y micrófono, un medidor de nivel en vivo, una tabla de palabras de activación y un probador (solo local, nunca reenvía).
- El selector de micrófono conserva la última selección si un dispositivo se desconecta, muestra una indicación de desconexión y vuelve temporalmente al valor predeterminado del sistema hasta que regrese.
- Sonidos: timbres al detectar la activación y al enviar, con el sonido del sistema macOS “Glass” como predeterminado. Elige cualquier archivo cargable por
NSSound(p. ej., MP3/WAV/AIFF) por evento, o elige Sin sonido.
Comportamiento de reenvío
- Al reenviar,
VoiceWakeForwarder.selectedSessionOptionselige la clave de sesión activa de WebChat si hay una configurada; de lo contrario, la clave de sesión principal del Gateway. - Busca esa sesión mediante
sessions.listy deriva el canal de entrega y el destino del contexto de entrega de la sesión (recurriendo a su último canal/destino y luego a una clave de sesión analizada), con WebChat como valor predeterminado si no se resuelve nada. - Si la entrega falla, el error se registra (categoría
voicewake.forward) y la ejecución sigue siendo visible mediante los registros de WebChat/sesión.
Carga útil de reenvío
VoiceWakeForwarder.prefixedTranscript(_:)antepone una línea de indicación para la máquina (nombre de host resuelto, con alternativa a “este Mac”) antes de la transcripción, compartida entre las rutas de palabra de activación y pulsar para hablar.
Verificación rápida
- Activa pulsar para hablar, mantén pulsada Option derecha, habla y suelta: la superposición debería mostrar parciales y luego enviar.
- Mientras se mantiene pulsada, las orejas de la barra de menús deberían permanecer agrandadas (
triggerVoiceEars(ttl: nil)); se reducen después de soltar.