DEL MICRÓFONO AL CEREBRO ARTIFICIAL: ¡JARVIS, ESTOY MOLESTO!
¿Puede una máquina saber si estás enojado solo por cómo suena tu voz? ¿Es posible que un dispositivo del tamaño de una tarjeta aprenda a reconocer emociones humanas? ¿Y cómo se entrena una IA para escuchar al mundo?
En este club exploraremos cómo la inteligencia artificial puede analizar señales de audio para identificar y clasificar emociones humanas, usando dispositivos pequeños de cómputo. A partir de grabaciones de voz, aprenderás cómo las máquinas transforman sonidos en datos, extraen patrones invisibles al oído humano y toman decisiones inteligentes.
Comenzaremos con las bases: ¿qué es el sonido y cómo se representa digitalmente?, y, ¿qué es una red neuronal artificial? Después entraremos al corazón del taller: entrenaremos modelos de aprendizaje de máquina para distinguir emociones (como el enojo) a partir del audio. Para ello utilizaremos Python, herramientas y métodos actuales de ciencia de datos, trabajando con modelos de IA usados hoy en día en investigación y desarrollo tecnológico.
Finalmente, llevaremos estos modelos al mundo físico al implementarlos en dispositivos pequeños, mostrando que la IA también puede vivir fuera de grandes servidores. Al finalizar, desarrollarás un proyecto funcional: una máquina capaz de escuchar y reconocer emociones.
📒 Notebook: Base de señales
En este cuaderno aprenderás un sobre Python, creando un vector que representa una onda de audio y generando el sonido de la misma.
📒 Notebook: Introducción a Python
En este cuaderno aprenderás sobre Python, cómo funciona y resolveremos algunos ejercicios prácticos relacionados al procesamiento de imágenes y canales de color. Para poder abrir tu cuadernillo de trabajo, pulsa en el botón a continuación.
📒 Notebook: Introducción a las redes neuronales artificiales
En este cuaderno aprenderás sobre qué son y cómo operan las neuronas artificiales, desde un contexto histórico, hasta la aplicación de este tipo de modelos para la resolución de problemas interesantes. Para poder abrir tu cuadernillo de trabajo, pulsa en el botón a continuación.
📒 Notebook: Redes neuronales artificiales
En este cuaderno pondremos en práctica el conocimiento de las redes neuronales y aprenderás a utilizar TensorFlow para programar modelos más complejos. Para poder abrir tu cuadernillo de trabajo, pulsa en el botón a continuación.
📒 Notebook: Redes neuronales convolucionales
En este cuaderno pondremos en práctica el conocimiento de las redes neuronales convolucionales. Para poder abrir tu cuadernillo de trabajo, pulsa en el botón a continuación.
📒 Notebook: MicroLightCNN Tutorial
En este cuaderno procesaremos el audio y entrenaremos nuestro modelo estrella para utilizar en los circuitos, el modelo
MicroLightCNN. Aquí pondremos en práctica todos los conocimientos adquiridos sobre el procesamiento de señales.
🤖 Material: MicroESP32
Presentaciones (Hugo):
Material para que revises:
Generado a partir de la lectura de
src/main.cpp(definición de pines) yplatformio.ini(board:esp32-s3-devkitc-1/rymcu-esp32-s3-devkitc-1).Actualización: se diagnosticó con
src/mic_diag.cpp(entornomic_diagenplatformio.ini) que el pinL/Rdel micrófono está en bajo/flotando en vez de 3V3. En consecuencia,main.cppse modificó para leer el canal izquierdo (I2S_CHANNEL_FMT_ONLY_LEFT) en vez del derecho — ver la sección del micrófono más abajo.
| Componente | Evidencia en el código |
|---|---|
| ESP32-S3 DevKitC-1 (16MB flash, PSRAM) | platformio.ini |
Micrófono digital I2S (breakout tipo INMP441, pines GND, VDD, SD, L/R, WS, SCK) |
confirmado por el usuario a partir del breakout físico; el comentario // Configuración de pines I2S (sph0645) en main.cpp:58 se refiere solo a la config genérica, no al modelo exacto |
| Matriz LED 8x8 con driver MAX7219 (1 módulo) | MD_MAX72XX mxObj(MD_MAX72XX::GENERIC_HW, MOSI_PIN, SCK_PIN, CS_PIN, NUM_MAT) en main.cpp:41, NUM_MAT = 1 |
| Buzzer (activo, control ON/OFF directo) | pinMode(BUZZER_PIN, OUTPUT); digitalWrite(...) en main.cpp |
GND, VDD, SD, L/R, WS, SCK)| Pin del micrófono | Conecta a (ESP32-S3) | Constante en el código |
|---|---|---|
| VDD | 3V3 | — |
| GND | GND | — |
| SCK | GPIO2 | I2S_BCLK (bit clock) |
| SD | GPIO1 | I2S_DOUT (datos seriales) |
| WS | GPIO7 | I2S_LRCL (word select / L-R clock) |
| L/R | 3V3 (o sin conectar) | Diagnosticado con mic_diag.cpp. main.cpp se ajustó para leer ese canal (I2S_CHANNEL_FMT_ONLY_LEFT) en vez de asumir el derecho. |
GENERIC_HW)| Pin de la matriz | Conecta a (ESP32-S3) | Constante en el código |
|---|---|---|
| VCC | 5V (ver nota abajo) | — |
| GND | GND | — |
| DIN | GPIO13 | MOSI_PIN |
| CLK | GPIO14 | SCK_PIN |
| CS (LOAD) | GPIO10 | CS_PIN |
Nota sobre VCC del MAX7219: el chip MAX7219 está especificado para 4.0–5.5 V, así que lo ideal es alimentar el módulo desde el pin 5V del devkit (no 3V3), mientras que las señales DIN/CLK/CS del ESP32-S3 (lógica 3.3V) normalmente son reconocidas igual como “alto” por el MAX7219. Si notas parpadeos o comportamiento errático en la matriz, ese es el primer sospechoso (podría requerir un level shifter, aunque en la práctica casi siempre funciona sin él).
| Pin del buzzer | Conecta a (ESP32-S3) | Constante en el código |
|---|---|---|
| Señal (+) | GPIO21 | BUZZER_PIN |
| GND (–) | GND | — |
El código solo hace digitalWrite(HIGH/LOW), así que se asume un buzzer activo (con oscilador integrado) que puede excitarse directo desde un GPIO. Si es un buzzer pasivo (solo emite tono con PWM), este circuito no lo hará sonar con el código actual — pero eso ya es una observación sobre el firmware, no sobre el cableado.
Se usa un diagrama Mermaid en vez de ASCII art: GitHub y VS Code (con la extensión de Markdown Preview Mermaid) lo renderizan como gráfico, así que no depende de alinear caracteres a mano.
graph LR
subgraph ESP32S3 ["ESP32-S3 DevKitC-1"]
P3V3["3V3"]
P5V["5V"]
PGND["GND"]
G1["GPIO1"]
G2["GPIO2"]
G7["GPIO7"]
G10["GPIO10"]
G13["GPIO13"]
G14["GPIO14"]
G21["GPIO21"]
end
subgraph MIC ["Micrófono I2S (INMP441)"]
M_VDD["VDD"]
M_GND["GND"]
M_SCK["SCK"]
M_SD["SD"]
M_WS["WS"]
M_LR["L/R"]
end
subgraph MATRIX ["Matriz LED 8x8 (MAX7219)"]
X_VCC["VCC"]
X_GND["GND"]
X_DIN["DIN"]
X_CLK["CLK"]
X_CS["CS / LOAD"]
end
subgraph BUZZ ["Buzzer"]
B_POS["( + )"]
B_NEG["( – )"]
end
P3V3 --> M_VDD
PGND --> M_GND
G2 -- "BCLK" --> M_SCK
G1 -- "DOUT" --> M_SD
G7 -- "LRCL/WS" --> M_WS
P3V3 --> M_LR
P5V --> X_VCC
PGND --> X_GND
G13 -- "MOSI" --> X_DIN
G14 -- "SCK" --> X_CLK
G10 -- "CS" --> X_CS
G21 --> B_POS
PGND --> B_NEG
Todos los GND (mic, matriz, buzzer, ESP32) deben ir a un plano de tierra común en la protoboard (raíl “-“).
| GPIO | Función |
|---|---|
| GPIO1 | I2S SD / datos seriales (mic) |
| GPIO2 | I2S SCK / bit clock (mic) |
| GPIO7 | I2S WS / word select (mic) |
| GPIO10 | CS matriz MAX7219 |
| GPIO13 | DIN matriz MAX7219 |
| GPIO14 | CLK matriz MAX7219 |
| GPIO21 | Buzzer |
| 3V3 | Mic VDD |
| 5V | VCC matriz MAX7219 |
| GND | Tierra común (mic, matriz, buzzer) |