Personalización vocal con IA: su asistente finalmente lo conoce
Un asistente de voz que no te conoce es una herramienta. Un asistente que sabe que tienes tres hijos, que gestionas un equipo de campo y que "lo de siempre" significa el pedido de material del martes, eso es un compañero. A dos días del lanzamiento público de TAMSIV, he añadido la personalización vocal: configura tu IA por voz, elige tu voz TTS entre 6 opciones, y el asistente se adapta a tu contexto. 1800 líneas de código, un memorable error de WebSocket y una profunda reflexión sobre lo que marca la diferencia entre un asistente genérico y uno personal.
Puntos clave a recordar:
- La personalización por contexto vocal transforma un asistente genérico en una herramienta personal: el usuario habla de forma natural, la IA comprende las referencias implícitas.
- La elección de la voz TTS es íntima: ofrecer 6 opciones con vista previa en tiempo real aumenta el apego a la aplicación.
- Cuando dos pantallas comparten el mismo WebSocket, un sistema de "propietario activo" evita conflictos de callbacks.
- La personalización de la IA es una palanca de monetización natural para un modelo freemium (contexto básico gratuito, completo en Pro).
¿Por qué la personalización cambia fundamentalmente la experiencia de un asistente de voz?
Desde octubre, la IA de TAMSIV entendía lo que decías. Creaba tareas, notas, eventos de agenda. Respondía educadamente. Pero no te conocía.
Podías decirle "recuérdame comprar leche" y lo hacía. Pero si le decías "recuérdame lo de los niños", no sabía que tenías hijos, ni cuántos, ni qué significaba "lo de siempre" en tu día a día. Esa es la diferencia fundamental entre una herramienta de comando de voz y un asistente personal.
Las investigaciones de Nielsen Norman Group sobre personalización muestran que las interfaces personalizadas aumentan el compromiso en un 40% de media. Para un asistente de voz, el impacto es aún mayor: la personalización elimina la necesidad de explicarlo todo en cada interacción.
Esta reflexión me impulsó a añadir esta característica a dos días del lanzamiento. ¿Un riesgo? Sí. Pero sin ella, TAMSIV habría sido "otro asistente de voz". Con ella, se convierte en tu asistente de voz.
¿Cómo funciona la configuración de la IA por voz?
Ha aparecido un nuevo botón en la pantalla del dictáfono: "Configurar mi IA". Pulsas, hablas y le explicas quién eres.
"Soy padre de 3 hijos, gestiono un equipo de 4 personas en una empresa de limpieza y se me olvida todo lo que me dicen después de 30 segundos."
La IA escucha a través del pipeline vocal, transcribe y luego resume tu contexto en unos pocos puntos estructurados. Este resumen se almacena en tu perfil de Supabase y se inyecta en el prompt del sistema en cada conversación.
El proceso técnico en detalle
- Captura de voz: el mismo STT nativo que el dictáfono principal (con fallback Deepgram si es necesario).
- Extracción de contexto: un LLM a través de OpenRouter analiza la transcripción y extrae información estructurada (situación familiar, profesión, hábitos, preferencias).
- Almacenamiento: el contexto se guarda en el perfil del usuario a través de Supabase, no localmente, y sigue al usuario en todos sus dispositivos.
- Inyección: en cada nueva conversación WebSocket, el contexto se añade al prompt del sistema del LLM. La IA "sabe" quién eres desde la primera palabra.
A partir de ahí, cada respuesta se adapta. Si hablas de "el pequeño", sabe que te refieres a tu hijo. Si dices "la obra del martes", sabe que gestionas intervenciones en el terreno. Esa es la diferencia entre un asistente genérico y un asistente que te conoce.
¿Por qué ofrecer 6 voces TTS y cómo elegir la correcta?
La voz es íntima. Escuchar la misma voz robótica 50 veces al día acaba molestando. Peor aún: una voz que no te gusta crea una fricción inconsciente en cada uso. Evitas usar la aplicación, sin saber exactamente por qué.
He añadido un selector de voz TTS con 6 opciones diferentes: masculinas, femeninas, tonos variados. Las 6 voces provienen de OpenAI TTS (modelo Nova por defecto), que ofrece la mejor calidad natural del mercado para la síntesis de voz.
La experiencia de selección
Pulsas una voz, escuchas una vista previa en tiempo real ("Hola, soy tu asistente TAMSIV...") y eliges. Se almacena en tu perfil y se utiliza para todas las respuestas de voz. El cambio es instantáneo, no es necesario reiniciar la aplicación ni volver a conectar el WebSocket.
Este detalle de UX parece menor, pero tiene un impacto medible. Según las investigaciones de Voicebot.ai, los usuarios que eligen la voz de su asistente lo utilizan un 60% más a menudo que los que mantienen la voz por defecto. La elección crea un sentimiento de apropiación.
¿Cómo resolver un conflicto de WebSocket entre dos pantallas que comparten el mismo canal?
El error que costó 3 horas. La pantalla de configuración de IA y el dictáfono comparten el mismo canal WebSocket hacia el backend. Cuando pruebas tu voz en la configuración, el dictáfono en segundo plano también intentaba procesar los callbacks de audio. Resultado: las dos pantallas se pisaban.
Concretamente, esto es lo que pasaba:
- El usuario abre la pantalla de configuración de IA.
- Prueba una voz TTS: el backend envía el audio a través de WebSocket.
- El dictáfono en segundo plano también recibe el callback de audio.
- Ambas pantallas intentan reproducir el mismo sonido simultáneamente.
- En algunos modelos de Android donde el recolector de basura es agresivo, el AudioPlayerService falla silenciosamente.
La solución: sistema de "propietario activo"
Cuando la pantalla de configuración está abierta, toma el control exclusivo del WebSocket. El dictáfono espera su turno. El patrón es simple:
- Un flag
activeOwner: 'dictaphone' | 'setup' | nullen el estado global. - Cada callback de WebSocket verifica al propietario antes de procesar el mensaje.
- La transición de propiedad es atómica, sin ventanas donde ambas pantallas escuchen.
Simple en teoría, 3 horas de depuración en la práctica. El conflicto solo se manifestaba en ciertos dispositivos, lo que dificultaba la reproducción. Es el tipo de error que solo encuentras probando en dispositivos reales, no en un emulador.
¿Cómo integrar la personalización en un modelo freemium?
La personalización de la IA ahora forma parte de las funcionalidades diferenciadoras en los planes de suscripción de RevenueCat:
- Plan gratuito: contexto básico (nombre, idioma). La IA sabe cómo te llamas, eso es todo.
- Plan Pro: contexto completo (situación personal, profesión, hábitos) + elección de voz TTS. La IA te conoce de verdad.
- Plan Team: todo lo de Pro + contexto de grupo (equipo, proyectos, terminología profesional). La IA conoce a tu equipo.
Es una palanca de monetización natural. La personalización es la característica que crea más apego: una vez que tu IA te conoce, no quieres volver a un asistente genérico. Es exactamente el tipo de feature gate que recomienda la estrategia freemium para las aplicaciones de productividad.
¿Cuál es el impacto en la arquitectura del backend?
La adición de la personalización requirió 1800 líneas de código distribuidas entre el frontend y el backend. En el lado del backend Node.js, las principales modificaciones:
- Prompt del sistema dinámico: el contexto del usuario se carga desde Supabase en cada conexión WebSocket y se inyecta en el prompt. Caché en memoria para evitar una llamada a la base de datos en cada mensaje.
- Endpoint de vista previa de TTS: un nuevo endpoint WebSocket dedicado a las vistas previas de voz, aislado del flujo de conversación principal.
- Validación de contexto: el LLM que extrae el contexto filtra la información sensible (números, direcciones); solo se conserva la información estructural.
El sistema de historial de conversaciones también se actualizó para incluir el contexto en los metadatos, lo que permite ver cuándo y cómo se modificó el contexto.
Más de 730 commits, a dos días del lanzamiento: ¿era el momento adecuado para esta característica?
Fue la última funcionalidad antes del lanzamiento público. La aplicación ahora sabe con quién habla. Queda el pulido final, las últimas pruebas en los dispositivos de los beta-testers y el gran salto.
Añadir una característica importante a dos días del lanzamiento es arriesgado. Pero la personalización es el tipo de característica que transforma la experiencia completa de la aplicación. Sin ella, TAMSIV habría sido una buena herramienta vocal. Con ella, es un asistente que te conoce. Y eso es lo que marcará la diferencia frente a alternativas como Todoist.
Preguntas frecuentes
¿Están seguros los datos de personalización?
Sí. El contexto se almacena en Supabase con las mismas políticas RLS (Row Level Security) que todos los datos de usuario. Solo el usuario autenticado puede leer o modificar su contexto. El LLM que extrae el contexto filtra automáticamente la información sensible (números de teléfono, direcciones); solo se conserva la información estructural.
¿Se puede modificar o eliminar el contexto después de configurarlo?
Sí, en cualquier momento. El botón "Configurar mi IA" permite volver a grabar un nuevo contexto que reemplaza al anterior. Un botón "Restablecer" elimina completamente el contexto y vuelve al modo de asistente genérico.
¿Por qué OpenAI TTS en lugar de Google o Azure para la síntesis de voz?
Después de probar los tres, OpenAI TTS (modelo Nova) ofrece la voz más natural en francés. Google TTS es bueno pero ligeramente más robótico. Azure es excelente en inglés pero menos convincente en francés. El coste es comparable (~0.015 EUR/1000 caracteres para OpenAI).
¿Puede reproducirse el conflicto de WebSocket con otras pantallas?
El sistema de propietario activo es genérico; protege contra cualquier conflicto entre pantallas que compartan el mismo canal. Si una futura pantalla necesita el WebSocket, basta con añadir un valor al tipo activeOwner y respetar el protocolo de adquisición/liberación.
¿Funciona la personalización en todos los idiomas compatibles?
Sí. La extracción de contexto utiliza un LLM multilingüe a través de OpenRouter. Puedes configurar tu IA en francés, inglés, alemán, español, italiano o portugués; el contexto se almacena en el idioma en el que lo dictaste y se utiliza tal cual en el prompt del sistema.