La pregunta que cambia el proyecto
¿Y si la diferencia entre un audio "amateur" y uno "de estudio" no estuviera en el micrófono, sino en lo que haces con los bits después de capturarlos? Esa es la apuesta de este proyecto: tomar un ESP32 S3 y un micrófono I2S INMP441 (combinación que cuesta menos de $20.000 CLP en total) y, con apenas dos líneas de código DSP en tiempo real, convertirlo en una herramienta de grabación apta para voiceovers de YouTube, podcasts y demos de producto.
Al final de este tutorial vas a tener un grabador con preamplificador por software (ganancia x5), limitador brick wall para evitar distorsión, y comprensión real de por qué el sample rate y el buffer importan tanto como el hardware.
Qué placa usa el tutorial original (y por qué importa)
El autor original arma el proyecto sobre una placa Makerfabs MaTouch ESP32 S3 con una pantalla TFT paralela de 3.16 pulgadas (controlador ST7701S) y un acelerómetro IMU QMI8658 integrado. Esa combinación le da dos cosas que se ven en el video: una interfaz en pantalla con estados STANDBY, REC y SAVED, y una función "Shake to Record" (agitas la placa para empezar y detener la grabación, sin tocar ningún botón).

Lo importante es entender qué aporta cada parte. La pantalla TFT y el acelerómetro son comodidad de UX, no son lo que mejora el sonido. La calidad de audio sale enteramente del DSP en firmware, no del hardware. Por eso en Chile puedes replicar el sonido de dos formas:
- Versión headless (más barata): un ESP32 S3 sin pantalla, que graba a la microSD apenas enciende. Sin TFT ni acelerómetro. Es la que detallamos abajo y la que arma la lista de materiales.
- Versión con pantalla: si quieres la misma experiencia visual del original, súmale una pantalla y maneja los estados REC y SAVED por software. La MaTouch exacta no se vende en Chile, pero el chip ESP32 S3 es el mismo.
El problema con el audio "raw" del INMP441
El INMP441 es un MEMS digital excelente para voz, pero es naturalmente silencioso. La membrana de silicio es rígida (eso es bueno: aguanta golpes, no se desajusta con humedad), pero entrega niveles de señal mucho más bajos que un micrófono de condensador clásico. Si grabas crudo y subes el volumen del parlante al 100% para escuchar, también amplificas el ruido del cuantizador y todo suena "fino" y con hiss.
La solución profesional sería un preamplificador de hardware con bajo ruido (un INA163, un THAT 1510, lo que uses). Pero acá no vamos a tocar el hardware: vamos a multiplicar las muestras por 5 en software dentro del loop. Eso es exactamente lo que hace un preamplificador, pero en código.
Por qué importa el sample rate (y por qué subimos a 48 kHz)
El proyecto base de la entrega anterior usaba 22.050 Hz, que es calidad de radio AM. Suficiente para inteligibilidad de palabras, pero te corta las frecuencias por encima de 11 kHz (la mitad del sample rate, por el teorema de Nyquist). Esas frecuencias altas son lo que aporta el "aire" en una voz: la consonante 's', las plosivas 'p', el shimmer general.
Subimos el sample rate a 48.000 Hz (estándar de cine y video). Ahora capturamos hasta 24 kHz, que ya excede el límite del oído humano. La voz suena natural, no enlatada. El costo: más datos que mover en el bus I2S (96 KB/s en lugar de 44 KB/s para mono de 16 bits), y por eso necesitamos un buffer más grande.
Hardware mínimo y conexiones
Para el montaje headless necesitas:
- ESP32 S3 (el doble núcleo es crítico: un core para audio, otro para UI u otras tareas)
- Módulo I2S INMP441
- Batería LiPo o 18650 (opcional, para portabilidad)
- microSD (donde se guardan los WAV)
El INMP441 se comunica por I2S con tres líneas de reloj y datos más alimentación. Este es el sub esquema de audio del proyecto, donde se ve el micrófono (U10) conectado al bus I2S del ESP32:

La tabla de pines para la versión headless queda así:
| INMP441 | ESP32 S3 |
|---|---|
| WS (Word Select / LR Clock) | GPIO 43 |
| SCK (Bit Clock) | GPIO 44 |
| SD (Data Out) | GPIO 2 |
| VDD | 3.3 V |
| GND | GND |
| L/R | GND (canal izquierdo) |
Si tu micrófono no responde, lo primero que tienes que revisar es L/R: muchos clones vienen flotantes y necesitas amarrarlos a GND o VDD para definir el canal.
Código: el corazón del DSP
#define SAMPLE_RATE 48000
#define I2S_BCLK 44
#define I2S_LRC 43
#define I2S_DIN 2
#define BUFFER_SIZE 4096
#define SOFTWARE_GAIN 5.0
Por qué BUFFER_SIZE = 4096 y no 1024
Las tarjetas microSD no escriben con latencia constante. La mayor parte del tiempo el write() dura 2 a 3 ms, pero ocasionalmente la controladora interna hace garbage collection y el write se cuelga 30 a 50 ms. Mientras tanto, el micrófono sigue mandando samples al bus I2S. Si tu buffer es pequeño, te quedas sin espacio durante esos 50 ms, se pierden samples y aparece un "pop" audible en el WAV.
Un buffer de 4 KB equivale a 1024 samples mono de 16 bits, o sea 21 ms de margen. Apenas suficiente. Subir a 8 KB es más seguro si tienes PSRAM disponible.
El preamplificador en una línea
int32_t boosted = samples[i] * SOFTWARE_GAIN;
Multiplicas por 5 cada sample. Resultado: la voz que se escuchaba "lejos" ahora suena cerca. Pero ahora hay un problema: si gritas, el cálculo intermedio supera fácilmente los 32.767 (límite de int16). Si dejas que el int32_t se trunque a int16_t directamente, obtienes wrap around: el sample de +35.000 se convierte en -30.000 (un overflow brutal). Esto suena como un click violento, audible al instante.
Limitador brick wall: la red de seguridad
if (boosted > 32767) boosted = 32767;
else if (boosted < -32767) boosted = -32767;
samples[i] = (int16_t)boosted;
En lugar de dejar overflow, lo "aplanas" en el techo. Esto se llama "hard clipping" o "brick wall". A diferencia del soft clip (más musical, distorsiona orgánicamente), el hard clip introduce algo de armónicos pero garantiza que nunca habrá un click destructivo.
Para voz funciona perfecto. Para música, querrías un compresor con attack y release suaves, pero ese es otro tutorial.
Grabación: del botón al "shake to record"
En la versión con pantalla del original, la grabación no usa botones. Apenas enciende, la placa calibra el acelerómetro por unos dos segundos y entra en STANDBY. Agitas la placa y arranca a grabar: la pantalla muestra un círculo rojo con "REC" y el texto "RECORDING...".

Cuando vuelves a agitar, cierra el archivo WAV en la microSD y muestra la confirmación en verde "SAVED!" con el nombre del archivo (por ejemplo rec_001.wav).

En la versión headless te ahorras toda esta capa: el firmware abre el WAV al encender y lo cierra al apagar, o por detección de silencio (ver "Variantes" más abajo). El acelerómetro y la pantalla son opcionales, no afectan la calidad del audio.
Configuración del Arduino IDE
Para el ESP32 S3 con PSRAM hay que ser cuidadoso con la configuración:
- Board: ESP32S3 Dev Module
- Flash Size: 16 MB
- Partition Scheme: 16M Flash
- PSRAM: OPI PSRAM (crítico: si lo dejas en "Disabled" el buffer grande no entra)
Versiones recomendadas:
- Arduino IDE 2.3.6
- ESP32 boards package 2.0.11 o 2.0.16 (la rama 3.x cambia la API I2S; los ejemplos de este post asumen la API 2.x)
- Si replicas la versión con pantalla y acelerómetro, vas a necesitar además las librerías QMI8658 v1.0.1 y JPEGDecoder v2.0.0.
Variantes y mejoras
Pequeñas extensiones que no están en el tutorial original y que valen la pena:
- EQ paramétrico simple: agrega un filtro biquad pasa altos con corte en 80 Hz para eliminar el "rumble" de aire acondicionado y golpes de mesa. La librería
arduinoFFTno te sirve acá, pero un IIR de 2 polos en código manual son unas 10 líneas. - Detección de silencio y autosave: cuenta cuántos samples consecutivos están bajo un umbral RMS; si pasa cierto tiempo, cierra el WAV automáticamente. Útil para entrevistas y para la versión headless.
- Streaming a Bluetooth A2DP: en lugar de guardar a SD, transmitir el audio comprimido a auriculares BT con la librería
BluetoothA2DPSink. Útil para monitoreo en vivo.
Post producción: de WAV crudo a voz limpia
El DSP en firmware deja un WAV ya usable, pero el autor original cierra el flujo pasando el archivo por un realce de voz. Una opción gratuita y rápida es Adobe Podcast, que sube el WAV, le quita ruido de fondo y refuerza graves:

Es un paso opcional: si grabaste en un cuarto silencioso, el audio del INMP441 con ganancia x5 y limitador ya queda bien para la mayoría de los usos.
Personalización para Chile
Componentes en stock local en MechatronicStore para la versión headless:
- Seeed Studio XIAO ESP32 S3 (SKU GS1-3): $13.670 CLP. Equivalencia: el tutorial original usa el "MaTouch ESP32 S3" de Makerfabs, que no se vende en Chile. El XIAO ESP32 S3 es el mismo chip ESP32 S3 de doble núcleo con PSRAM, pero sin pantalla ni acelerómetro. Cubre toda la parte de audio y DSP, que es lo que mejora el sonido.
- Módulo Micrófono I2S INMP441 (SKU GL3-12): $5.890 CLP.
- Batería 18650 3000 mAh (SKU L-040): $5.190 CLP. Equivalencia: el original pide una batería pequeña; una 18650 con módulo de carga es más versátil y dura más para grabación prolongada.
- Micro SD tarjeta de memoria 8 GB (SKU B-450V1): $7.990 CLP.
Total de la versión headless: alrededor de $32.700 CLP. Si quieres la experiencia con pantalla del video original, súmale una pantalla TFT o una OLED y maneja los estados REC y SAVED por código.
Recursos
- Tutorial original (inglés): $5 ESP32 Studio Microphone: Pro Quality Audio on a Budget
- Datasheet INMP441 (InvenSense): https://invensense.tdk.com/wp-content/uploads/2015/02/INMP441.pdf
- Documentación I2S en ESP-IDF: https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-reference/peripherals/i2s.html
- Realce de voz gratuito: Adobe Podcast (la post producción que el autor original usa al final)
Versión chilena con componentes en stock local en MechatronicStore.








