Superposición de voz
Ciclo de vida de la superposición de voz (macOS)
Sección titulada «Ciclo de vida de la superposición de voz (macOS)»Público: colaboradores de la aplicación macOS. Objetivo: mantener la superposición de voz predecible cuando la palabra de activación y la pulsación para hablar se superponen.
Intención actual
Sección titulada «Intención actual»- Si la superposición ya está visible por la palabra de activación y el usuario presiona la tecla de acceso rápido, la sesión de la tecla de acceso rápido adopta el texto existente en lugar de restablecerlo. La superposición permanece activa mientras se mantiene presionada la tecla de acceso rápido. Cuando el usuario la suelta: enviar si hay texto recortado; de lo contrario, descartar.
- La palabra de activación por sí sola todavía se envía automáticamente en silencio; la pulsación para hablar se envía inmediatamente al soltar.
Implementado (9 de diciembre de 2025)
Sección titulada «Implementado (9 de diciembre de 2025)»- Las sesiones de la superposición ahora llevan un token por cada captura (palabra de activación o pulsación para hablar). Las actualizaciones de parciales/finales/envío/descarte/nivel se descartan cuando el token no coincide, evitando devoluciones de llamada obsoletas.
- La pulsación para hablar adopta cualquier texto visible de la superposición como prefijo (por lo que presionar la tecla de acceso rápido mientras la superposición de activación está activa mantiene el texto y añade el nuevo discurso). Espera hasta 1,5 segundos una transcripción final antes de volver al texto actual.
- El registro de la campana/superposición se emite en
infoen las categoríasvoicewake.overlay,voicewake.pttyvoicewake.chime(inicio de sesión, parcial, final, envío, descarte, motivo de la campana).
Próximos pasos
Sección titulada «Próximos pasos»- VoiceSessionCoordinator (actor)
- Posee exactamente un
VoiceSessiona la vez. - API (basada en tokens):
beginWakeCapture,beginPushToTalk,updatePartial,endCapture,cancel,applyCooldown. - Descarta las devoluciones de llamada que llevan tokens obsoletos (evita que los reconocedores antiguos vuelvan a abrir la superposición).
- Posee exactamente un
- VoiceSession (modelo)
- Campos:
token,source(wakeWord|pushToTalk), texto confirmado/volátil, indicadores de campana, temporizadores (envío automático, inactividad),overlayMode(display|editing|sending), fecha límite de enfriamiento.
- Campos:
- Enlace de la superposición
VoiceSessionPublisher(ObservableObject) refleja la sesión activa en SwiftUI.VoiceWakeOverlayViewse renderiza solo a través del editor; nunca muta singletons globales directamente.- Las acciones del usuario en la superposición (
sendNow,dismiss,edit) hacen una llamada de retorno al coordinador con el token de sesión.
- Ruta de envío unificada
- En
endCapture: si el texto recortado está vacío → descartar; si noperformSend(session:)(reproduce el tono de envío una vez, reenvía, descarta). - Pulsar para hablar: sin retraso; palabra de activación: retraso opcional para envío automático.
- Aplique un breve tiempo de espera al tiempo de ejecución de activación después de que termine la función de pulsar para hablar para que la palabra de activación no se active de nuevo inmediatamente.
- En
- Registro
- El coordinador emite registros
.infoen el subsistemaai.openclaw, categoríasvoicewake.overlayyvoicewake.chime. - Eventos clave:
session_started,adopted_by_push_to_talk,partial,finalized,send,dismiss,cancel,cooldown.
- El coordinador emite registros
Lista de verificación de depuración
Sección titulada «Lista de verificación de depuración»-
Transmita registros mientras reproduce una superposición persistente:
Ventana de terminal sudo log stream --predicate 'subsystem == "ai.openclaw" AND category CONTAINS "voicewake"' --level info --style compact -
Verifique que solo haya un token de sesión activo; las llamadas de retorno obsoletas deben ser descartadas por el coordinador.
-
Asegúrese de que la liberación de la función de pulsar para hablar siempre llame a
endCapturecon el token activo; si el texto está vacío, esperedismisssin tono ni envío.
Pasos de migración (sugeridos)
Sección titulada «Pasos de migración (sugeridos)»- Agregue
VoiceSessionCoordinator,VoiceSessionyVoiceSessionPublisher. - Refactorice
VoiceWakeRuntimepara crear/actualizar/finalizar sesiones en lugar de tocarVoiceWakeOverlayControllerdirectamente. - Refactorice
VoicePushToTalkpara adoptar sesiones existentes y llamar aendCaptureal liberar; aplique tiempo de espera de ejecución. - Conecte
VoiceWakeOverlayControlleral editor; elimine las llamadas directas del tiempo de ejecución/PTT. - Agregue pruebas de integración para la adopción de sesión, el tiempo de espera y el descarte de texto vacío.