Project Story – Vybo

La música tiene el poder de cambiar nuestro estado de ánimo. Queríamos traducir esa conexión emocional en una interacción física tangible.


Inspiration

[!NOTE] Nos inspiramos en proyectos de affective computing y en la creciente accesibilidad de herramientas de reconocimiento de audio y microcontroladores como el ESP32.


What it does

Vybo es un robot que reacciona emocionalmente a la música de tu entorno.

  1. Captura: Graba 10 segundos de audio del entorno.
  2. Reconocimiento: Usa ACRCloud para identificar la canción y su posición temporal.
  3. Inferencia Emocional: Envía el audio a un modelo de IA que detecta la emoción predominante (alegría, tristeza, energía, etc.).
  4. Reacción Física: Envía comandos al ESP32 vía Web Serial API. El robot muestra expresiones faciales en una pantalla OLED 128x64 sincronizadas con el ritmo y la emoción.
  5. Exploración 3D: Incluye una escena interactiva 3D de los componentes de hardware.

How we built it

Capa Tecnología / Detalles
Frontend Next.js 13 (App Router), React, TypeScript, Tailwind CSS, Lucide icons
Audio Capture Hook personalizado useAudioCapture.ts con MediaRecorder API
Reconocimiento ACRCloud API vía route handler (/api/recognize)
IA Emocional Modelo ligero de TensorFlow.js para clasificar el espectro de audio
Comunicación useSerialPort.ts vía Web Serial API enviando JSON
Firmware ESP32 C++ (Arduino), OLED SSD1306 vía I²C
Escena 3D Three.js renderizando modelo GLTF del ESP32
Estilos Tema oscuro/claro, variables CSS (#6B8AF2, #F4F4F5)

Challenges we ran into

[!WARNING] Latencia de audio: Grabar, enviar y obtener respuesta tomaba >2s. Lo optimizamos limitando la captura a 10s y usando caché.

Web Serial API: Requiere contexto HTTPS e interacción explícita del usuario. Solución: Añadimos un botón explícito de "Connect".

Sincronismo IA-Hardware: Fue difícil alinear la emoción detectada con el beat. Implementamos un buffer de tiempo y suavizado (interpolación lineal) para las transiciones.

Rendimiento 3D: Renderizar en móviles era pesado. Optimizamos el modelo GLTF (decimation, compresión de texturas) para mantener 60fps.

Gestión de Estado: Prevenimos race conditions al cambiar de canción usando React Query.


Accomplishments that we're proud of

  • [x] Pipeline completo en tiempo récord: Audio → Reconocimiento → Emoción → Actuador en < 3s después de la interacción inicial.
  • [x] Interfaz atractiva: Una UI que combina ondas visuales, terminal simulado y una escena 3D interactiva.
  • [x] Código modular: Uso de TypeScript para lograr un mantenimiento robusto y fácil expansión.
  • [x] Demostración exitosa: En eventos locales, usuarios novatos conectaron fácilmente al ver su reacción emocional reflejada en el robot.

What we learned

  • La integración de servicios de audio (como ACRCloud) requiere un manejo sumamente cuidadoso de límites de tasa y costos.
  • La Web Serial API es muy poderosa, pero es crucial ofrecer fallbacks e instrucciones claras debido a inconsistencias entre navegadores.
  • El diseño de interacciones visuales y hápticas mejora significativamente la percepción de inteligencia, incluso en dispositivos simples.
  • La separación de preocupaciones (audio, IA, comunicación serial) fue fundamental para probar cada capa de forma independiente.

What's next for Vybo

[!TIP] El futuro del proyecto

  • Expresiones Avanzadas: Añadir animaciones complejas usando doble búfer para transiciones más suaves en la OLED.
  • Control por Voz: Incorporar reconocimiento para comandos directos (ej. "cambia a modo fiesta").
  • Mejoras en IA: Utilizar características de MFCC y redes LSTM para lograr mayor precisión emocional.
  • Hardware Portable: Crear una versión autónoma con batería y caja impresa en 3D.
  • Open-Source: Publicar el firmware y el esquema de circuito en GitHub para la comunidad.

Built With

  • acrcloud-api
  • components/landing/hardwarescene.tsx
  • esp32-(arduino-ide)
  • lib/useaudiocapture.ts
  • next.js-13
  • oled-ssd1306-(i?c)-|-logica-principal:-app/page.tsx
  • react
  • tailwind-css
  • tensorflow.js
  • three.js
  • typescript
  • web-serial-api
Share this project:

Updates