Imágenes de IA de voz y dictáfono en línea en TAMSIV
La v1.3.2 es la versión más ambiciosa que he publicado en TAMSIV. Dos características principales, una delicada migración técnica y un cambio de filosofía sobre la relación entre la voz y el contenido visual.
En la superficie, es simple: tú hablas, la IA genera una imagen y se adjunta a tu tarea. Debajo, es un pipeline que encadena voz a texto, análisis contextual por LLM, generación de imágenes, carga a Supabase Storage y visualización con URL firmada. Además, un dictáfono que pasa de una superposición de pantalla completa a un componente en línea integrado en la parte inferior de la pantalla. Y como extra, una migración de gesture handler que me hizo recorrer cada archivo del proyecto en busca de importaciones maliciosas.
Puntos clave
- Las imágenes de IA se generan directamente desde la voz: el LLM analiza el contexto de la tarea para crear un prompt optimizado, sin intervención del usuario.
- El dictáfono en línea reemplaza la superposición de pantalla completa, con la transcripción mostrada antes de que termine el TTS para una sensación de reactividad inmediata.
- La migración de gesture handler corrigió un error invisible en iOS pero bloqueante en Android en modo de lanzamiento.
- La opción "omitir TTS" permite una doble ganancia: tiempo de respuesta dividido y costos de API reducidos para los usuarios que no necesitan la respuesta de voz.
¿Cómo funciona la generación de imágenes de IA directamente desde la voz?
La idea surgió de una observación simple: una tarea con una imagen es inmediatamente más atractiva que una tarea solo con texto. Las investigaciones en psicología cognitiva lo confirman: según un estudio de John Medina (Brain Rules), el cerebro procesa las imágenes 60.000 veces más rápido que el texto. Si puedes asociar un visual relevante a cada tarea, aumentas la retención y la motivación.
El problema es que nadie va a buscar una imagen manualmente para cada tarea. Tenía que ser automático, contextual y activado por la voz. Aquí está el pipeline completo:
- El usuario habla: "Crea una tarea para preparar la presentación del cliente con una imagen".
- STT nativo transcribe la voz a texto, como se describe en mi artículo sobre STT nativo vs Deepgram.
- El LLM analiza el contexto: título de la tarea, descripción, etiquetas existentes.
- El LLM genera un prompt optimizado para el modelo de imagen, en inglés, con detalles de estilo y composición.
- El proveedor de imágenes (Runware o Gemini) genera el visual.
- Carga a Supabase Storage, creación de un registro en
privat.task_attachmentscon el tipoai_generated. - Visualización inmediata a través de URL firmada.
Había detallado la elección entre los proveedores de imágenes en el artículo dedicado a la generación de imágenes de IA. La v1.3.2 integró este pipeline directamente en el flujo de voz, lo que lo hace accesible sin ninguna fricción.
¿Por qué el LLM redacta el prompt en lugar del usuario?
Pedirle a un usuario que escriba un buen prompt de imagen es como pedirle a alguien que hable con fluidez un idioma que nunca ha aprendido. Los modelos de generación de imágenes son sensibles a la formulación: el orden de las palabras, los modificadores de estilo, los términos técnicos como "iluminación cinematográfica" o "poca profundidad de campo" marcan una diferencia masiva en el resultado.
La solución es elegante: el LLM conversacional, que ya comprende el contexto de la discusión, se convierte en un traductor entre la intención humana y el lenguaje técnico del modelo de imagen. El usuario dice "una imagen de presentación profesional", el LLM traduce a "diapositivas de presentación de negocios profesionales en un escritorio moderno, ambiente corporativo limpio, iluminación direccional suave, fotorrealista, detalle 4K".
Es el mismo principio que aplico en toda la arquitectura de TAMSIV: la IA debe hacer el trabajo cognitivo que el usuario no debería tener que hacer. Lo mencioné en el artículo sobre la personalización de voz: la inteligencia no es solo entender las palabras. Es entender la intención detrás de las palabras.
¿Cómo cambia el dictáfono en línea la experiencia del usuario?
Antes de la v1.3.2, el dictáfono abría una superposición de pantalla completa. Tú presionabas el micrófono, todo desaparecía en favor de una interfaz dedicada a la conversación. Era funcional, pero cortaba el contexto. Ya no veías tu lista de tareas, ya no veías dónde estabas.
El dictáfono en línea cambia las reglas del juego. Se integra directamente en la parte inferior de la pantalla, como un teclado. Siempre ves tu contenido arriba. La transcripción del texto aparece en tiempo real mientras hablas. Y lo más importante, el texto transcrito se muestra antes de que termine la generación de TTS.
¿Por qué es importante? Según los estudios de Nielsen Norman Group sobre los tiempos de respuesta, 1 segundo es el límite para mantener el flujo de pensamiento del usuario. Más allá, comienza a sentir un retraso. Al mostrar la transcripción inmediatamente mientras el audio se genera en paralelo, engañamos a la percepción: el usuario ve que la IA ha entendido, incluso si la respuesta de audio aún no está lista.
Es una técnica bien conocida en UX: el modelo RAIL de Google recomienda exactamente eso. Responder visualmente en menos de 100 ms para que la interacción parezca instantánea, incluso si el procesamiento completo lleva más tiempo.
¿Qué aporta la opción "omitir TTS" en la práctica?
No todos los usuarios necesitan escuchar la respuesta de la IA. Algunos están en un ambiente ruidoso. Otros solo quieren leer la transcripción. Otros usan TAMSIV en modo silencioso por costumbre.
La opción "omitir TTS" permite desactivar la síntesis de voz de la respuesta. La ganancia es doble:
- Tiempo de respuesta: sin esperar la generación y descarga del audio TTS, la respuesta se muestra casi instantáneamente.
- Costos de API: cada llamada TTS tiene un costo (OpenAI cobra por carácter). En miles de interacciones diarias, esto se suma rápidamente.
También es una cuestión de accesibilidad. Algunas personas prefieren leer en lugar de escuchar. Otras tienen limitaciones auditivas. Al ofrecer la opción, respetamos las preferencias de cada uno. Es el mismo espíritu que el diseño del dictáfono original: la voz es un canal, no una obligación.
¿Por qué la migración de gesture handler fue tan crítica?
Es el tipo de error que te hace dudar de tu cordura. Todo funciona en depuración. Todo funciona en iOS. Pasas al modo de lanzamiento en Android: el componente ya no responde al tacto. No hay errores en los registros. No hay fallos. Simplemente... no funciona.
El culpable: importaciones de TouchableOpacity, FlatList y ScrollView de react-native en lugar de react-native-gesture-handler, utilizadas dentro de GestureDetector. La documentación de React Native Gesture Handler es clara: dentro de un GestureDetector, todos los componentes táctiles deben provenir de la biblioteca gesture handler, no de React Native estándar.
El error era insidioso por tres razones:
- Invisible en depuración: el puente JavaScript de React Native en modo de depuración maneja los eventos táctiles de manera diferente al modo de lanzamiento con Hermes.
- Invisible en iOS: UIKit y el sistema de cadena de respuesta de iOS son más tolerantes que el sistema de gestión de eventos de Android.
- Sin error explícito: sin advertencias, sin fallos. El componente se muestra, tiene el estilo correcto, pero el toque no activa nada.
La corrección requirió revisar cada archivo del proyecto. No fue un grep rápido, porque algunas importaciones estaban mezcladas: el TouchableOpacity venía de gesture handler, pero el ScrollView en el mismo archivo venía de React Native. Terminé estableciendo una regla estricta para el desarrollo futuro, que sigo aplicando hoy.
¿Cómo garantizar el rendimiento con estas nuevas características?
Añadir características es fácil. Añadir características sin degradar el rendimiento es un arte. La v1.3.2 introduce un pipeline de imágenes y un dictáfono en línea, dos componentes potencialmente pesados. Aquí están las optimizaciones implementadas.
Primero, cero re-renders innecesarios. El dictáfono en línea utiliza React.memo y callbacks estables para evitar activar re-renders en la lista de tareas de arriba. Cada animación pasa por useNativeDriver: true para ejecutarse en el hilo nativo, no en el hilo de JavaScript.
Luego, la limpieza agresiva. El AudioPlayerService implementa un tiempo de espera de seguridad de 30 segundos. Si un audio no termina en ese tiempo (problema de red, archivo corrupto), el servicio fuerza la limpieza. Sin esto, los recursos de audio se acumulan en la memoria. Ya había detallado la arquitectura de este servicio en el artículo sobre el pipeline de voz.
Finalmente, las imágenes generadas se cargan con carga diferida y un marcador de posición borroso. La imagen solo se descarga cuando la tarjeta de tarea está visible en la pantalla. En un feed de 50 tareas, esto significa potencialmente 50 imágenes que no se cargan innecesariamente. Este es el tipo de optimización que impacta directamente el egress de Supabase que me esforcé en reducir.
¿Cuál es el impacto de la v1.3.2 en el uso diario?
El cambio más notable es la fluidez. Antes de la v1.3.2, usar TAMSIV era funcional pero un poco rígido. Después, se volvió natural. Tú hablas, ves tu tarea crearse con una imagen, continúas tu día. El dictáfono en línea ya no te saca de tu contexto.
Los comentarios de los probadores alfa confirmaron la intuición. El dictáfono en línea fue preferido unánimemente a la superposición. La imagen de IA se convirtió en la característica más utilizada después de la creación básica de tareas. Y lo más importante, la corrección del gesture handler resolvió una docena de informes de "botones que no funcionan" que no podíamos reproducir en depuración.
Esta es la versión que hizo que TAMSIV pasara de "funciona" a "es agradable". Y en la construcción pública, es un hito tan importante como el primer commit. Lo mencioné en el balance de 650 commits: la calidad percibida marca la diferencia entre una aplicación que se prueba y una aplicación que se conserva.
Preguntas frecuentes
¿Se pueden generar imágenes de IA también para las notas?
Actualmente, la generación de imágenes de IA está disponible para las tareas. El mecanismo utiliza la tabla privat.task_attachments con el tipo ai_generated. La extensión a las notas está prevista y es técnicamente sencilla, ya que la tabla privat.memo_attachments ya existe con la misma estructura.
¿El dictáfono en línea funciona en segundo plano?
No. El dictáfono requiere que la aplicación esté en primer plano para la captura de audio y la visualización de la transcripción en tiempo real. Es una elección deliberada: el reconocimiento de voz nativo del dispositivo está optimizado para el primer plano, y la visualización inmediata de la transcripción es clave para la experiencia.
¿La opción de omitir TTS es permanente o por conversación?
Es una configuración permanente almacenada en el perfil de usuario. Una vez activada, todas las conversaciones futuras serán solo de texto. Puedes reactivarla en cualquier momento desde la configuración.
¿El error del gesture handler sigue afectando a la aplicación?
No. La migración fue completa y se estableció una regla de desarrollo estricta: cualquier componente táctil dentro de un GestureDetector debe usar obligatoriamente las importaciones de react-native-gesture-handler. Esto se verifica en cada revisión de código.
¿Cuánto cuesta generar una imagen de IA?
Con el proveedor Runware (HiDream-I1-Fast), aproximadamente 0,003 euros por imagen. Con Gemini 2.5 Flash Image, un poco más. Los costos se controlan mediante cuotas por plan de suscripción: el plan Free no tiene acceso, Pro tiene una cuota diaria, Team una cuota más alta.