Solucionando ChatGPT Voice Mode en Manaby: El Desafío del Micrófono en macOS
Cómo solucionamos los problemas de permisos de micrófono que impedían que ChatGPT Voice Mode funcionara en navegadores basados en Electron en macOS.
Tabla de Contenidos
- El Problema
- Por Qué las Apps de Escritorio Tienen Problemas
- El Laberinto de Audio en macOS
- La App de Escritorio de ChatGPT Tiene el Mismo Problema
- Nuestra Solución
- Análisis Técnico
- El Resultado
El Problema
El Voice Mode de ChatGPT es una de sus funciones más impresionantes. Puedes tener una conversación en tiempo real con la IA, y responde naturalmente con voz. Pero cuando intenté usarlo en Manaby, no pasaba nada. El botón del micrófono aparecía, pero al hacer clic no ocurría nada. Sin errores, sin feedback—solo silencio.
Este es el tipo de bug que vuelve locos a los desarrolladores. La función funcionaba perfectamente en Safari y Chrome. ¿Por qué no en un navegador basado en Electron?
Por Qué las Apps de Escritorio Tienen Problemas
Los navegadores web llevan años lidiando con permisos de micrófono. Tienen sistemas de permisos maduros y probados. Pero las apps de Electron son diferentes. Estamos ejecutando Chromium dentro de una shell nativa, y eso crea complicaciones:
- Permisos a nivel de sistema - macOS requiere que las apps soliciten acceso al micrófono explícitamente en los entitlements
- Diálogos de consentimiento - El sistema necesita mostrar un diálogo al usuario antes de conceder acceso
- Enumeración de dispositivos - La app necesita identificar correctamente qué dispositivos de audio están disponibles
- Selección del dispositivo por defecto - Cuando un usuario tiene múltiples micrófonos, ¿cuál usamos?
Cada uno de estos puede fallar silenciosamente, dejándote con un micrófono que simplemente no funciona.
El Laberinto de Audio en macOS
macOS tiene uno de los sistemas de audio más complejos de cualquier sistema operativo. Los usuarios pueden tener:
- Micrófonos integrados del MacBook
- AirPods con micrófonos
- Micrófonos USB externos
- Auriculares Bluetooth
- Dispositivos de audio virtuales (para grabación de pantalla, streaming, etc.)
El sistema mantiene un dispositivo “por defecto”, pero este puede cambiar dinámicamente. ¿Conectas auriculares? El defecto cambia. ¿Conectas AirPods? Cambia de nuevo. ¿Los desconectas? Vuelve al micrófono integrado.
Para apps web en un navegador normal, esto se maneja automáticamente. Pero para apps de Electron, necesitamos gestionarlo nosotros mismos.
La App de Escritorio de ChatGPT Tiene el Mismo Problema
Aquí está lo interesante: la app oficial de escritorio de ChatGPT para macOS tiene exactamente el mismo problema.
Cuando intentas usar Voice Mode en la app de escritorio de ChatGPT, no puedes seleccionar qué micrófono usar. Intenta usar el del sistema por defecto, pero la selección no funciona correctamente. Muchos usuarios han reportado este problema—Voice Mode simplemente no funciona en la app de escritorio.
Esto validó lo que estábamos viendo. El problema no era único de Manaby. Era un desafío fundamental de cómo las apps de Electron (y frameworks de escritorio similares) manejan los permisos de dispositivos de audio en macOS.
Nuestra Solución
Implementamos una solución de múltiples capas:
1. Aislamiento Cross-Origin
El Voice Mode de ChatGPT usa funciones web avanzadas que requieren aislamiento cross-origin. Añadimos headers y manejo de permisos adecuados:
// Manejar aislamiento cross-origin para funciones avanzadas
session.webRequest.onHeadersReceived((details, callback) => {
const headers = details.responseHeaders || {};
if (details.url.includes('chat.openai.com') ||
details.url.includes('chatgpt.com')) {
headers['Cross-Origin-Opener-Policy'] = ['same-origin'];
headers['Cross-Origin-Embedder-Policy'] = ['require-corp'];
}
callback({ responseHeaders: headers });
});
2. Manejo Mejorado de Permisos
Mejoramos cómo Manaby solicita y gestiona los permisos del micrófono:
// Solicitar permiso para dispositivos multimedia
session.setPermissionRequestHandler((webContents, permission, callback) => {
const allowedPermissions = ['media', 'microphone', 'camera'];
if (allowedPermissions.includes(permission)) {
// Conceder permiso después del consentimiento del usuario
callback(true);
} else {
callback(false);
}
});
3. Corrección de Enumeración de Dispositivos
La corrección clave fue en cómo enumeramos y seleccionamos los dispositivos de audio:
// Enumerar correctamente los dispositivos multimedia
const devices = await navigator.mediaDevices.enumerateDevices();
const audioInputs = devices.filter(d => d.kind === 'audioinput');
// Encontrar el dispositivo por defecto o usar el primero disponible
const defaultDevice = audioInputs.find(d => d.deviceId === 'default')
|| audioInputs[0];
4. Entitlements de macOS
Nos aseguramos de que los entitlements de la app declaren correctamente el acceso al micrófono:
<key>com.apple.security.device.audio-input</key>
<true/>
Análisis Técnico
La causa raíz fue una combinación de problemas:
-
Inicialización de WebRTC - El Voice Mode de ChatGPT usa WebRTC para audio en tiempo real. Nuestra inicialización de WebRTC no manejaba correctamente el flujo de permisos.
-
Caché de Device ID - Los IDs de dispositivos en macOS pueden cambiar entre sesiones. Estábamos guardando en caché IDs que se volvían inválidos.
-
Timing de permisos - La solicitud de permiso necesita ocurrir en el momento correcto. Muy temprano, y el diálogo del sistema se descarta. Muy tarde, y el stream de audio falla al inicializar.
-
Constraints de getUserMedia - Necesitábamos ser más flexibles con los constraints de audio, permitiendo que el sistema elija el mejor dispositivo en lugar de forzar uno específico.
La solución implicó reescribir partes de nuestro servicio de permisos para manejar estos casos límite correctamente.
El Resultado
Voice Mode ahora funciona de forma fiable en Manaby. Haz clic en el botón del micrófono en ChatGPT, y puedes tener una conversación de voz natural—igual que en el navegador normal.
Lo que hace esto particularmente satisfactorio es que solucionamos un problema con el que incluso la app de escritorio oficial de OpenAI tiene dificultades. Cuando usas ChatGPT Voice Mode en Manaby, estás obteniendo una mejor experiencia que la que proporciona la app oficial de escritorio.
Este es uno de esos bugs donde la solución parece simple en retrospectiva, pero encontrar la causa real requirió horas de debugging a través de múltiples capas del stack. Desde JavaScript a Electron, de Electron a macOS, y de macOS de vuelta al hardware de audio.
Si has estado frustrado porque Voice Mode no funciona en apps de escritorio, prueba Manaby. Hemos hecho el trabajo duro para que tú no tengas que hacerlo.
Descarga Manaby 0.0.32 y prueba Voice Mode tú mismo.