# Envío de audio por MQTT En este documento describiremos los pasos y las herramientas utilizadas para enviar audio mediante el protocolo MQTT. Este proyecto constará de dos partes: el envío del audio y la reproducción del audio recibido. ## Librería de Node-RED Se instalará un nuevo nodo de Node-RED para la reproducción del audio: 'node-red-contrib-wav'. Se puede instalar de dos maneras, por medio de la interfaz de Node-RED o mediante el siguiente comando en la consola: ```bash= npm install node-red-contrib-wav ``` Con nuestra libreria ya podemos visualizar el nodo que se añadio en nuestro input. ![](https://i.imgur.com/UbRuAcV.png) ## Envío del audio ![](https://i.imgur.com/Pdrl1xA.png) Para el envío de audio, utilizaremos un fichero que almacenaremos dentro del sistema operativo. Comenzamos la prueba con un **timestamp** el cual enviara una señal cada x tiempo. ![](https://i.imgur.com/3LekmRP.png) Utilizando el nodo "Read file", vamos a pasarle la ruta donde tenemos nuestro archivo almacenado en el directorio. La salida de este nodo será un buffer con el contenido del archivo. ![](https://i.imgur.com/8lkNI1d.png) Procedemos a remover las cabeceras del archivos WAV, para simular que se grabara un audio sin ningun tipo de formato previo. Revisar **Anexo I** "*Remove WAV headers*" ![](https://i.imgur.com/oQcLh1F.png) Simulamos la grabación de este audio enviandolo al nodo **/microphone/audio**. ![](https://i.imgur.com/EJl7A8S.png) ## Recepción del audio ![](https://i.imgur.com/DjDJliZ.png) Luego de obtener la muestra previamente grabada, vamos a añadirle las cabeceras WAV (**Anexo II** "*Add WAV headers*"), para poder reproducir la muestra de audio de manera correcta. ![](https://i.imgur.com/tvG7wEa.png) Seleccionamos un **canal**, ya que es el unico que tenemos, luego para la **frecuencia de muestreo** damos un valor de 8000, y en nuestro caso estamos tratando con una **profundidad de bits** de 16. ![](https://i.imgur.com/e1ljWi4.png) Finalmente con la muestra en formato WAV, añadimos el nodo **audio out** para poder reproducir la misma, ya que sin el paso anterior este no funcionaria. ![](https://i.imgur.com/6aQdhqt.png) El audio se reproducirá desde el dashboard generado por el plugin 'dashboard-ui' de Node-RED. ## Esquema completo ![](https://i.imgur.com/RSPUe0D.png) ## Anexo I: Remove WAV headers Cuando la entrada es un fragmento de audio WAV, esta opción se puede usar para eliminar los encabezados WAV. En la primera salida, aparecerá el fragmento de audio con muestras de audio sin procesar (es decir, sin los encabezados WAV). En la segunda salida, se enviarán los encabezados WAV eliminados. ## Anexo I: Add WAV headers Cuando la entrada es una porción de muestras de audio sin procesar (PCM), esta opción se puede usar para agregar encabezados WAV. En la primera salida, aparecerá el fragmento de audio WAV (es decir, los encabezados WAV seguidos de las muestras de audio sin procesar). En la segunda salida, se enviarán los encabezados WAV agregados. En ese caso, este nodo puede agregar toda la información requerida a las muestras de audio sin procesar, agregando encabezados WAV al fragmento de audio. Toda la información requerida se puede especificar en la pantalla de configuración del nodo: - El número de canales: es una grabación de un solo canal o múltiples canales (micrófono izquierdo y micrófono derecho). - La frecuencia de muestreo: es decir, el número de muestras de audio por segundo. - La profundidad de bits: es decir, el número de bits de cada muestra de audio. Podríamos estar tratando con muestras de 8 bits (1 byte), muestras de 16 bits (2 bytes), etc. **La conversión de PCM a WAV se explica en la siguiente figura:** ![](https://i.imgur.com/uXPG5q6.png) ## Referencias 1. [node-red-contrib-wav (node) Node-RED](https://flows.nodered.org/node/node-red-contrib-wav)) 2. [Qué es la frecuencia de muestreo (sampling rate) y profundidad de bits (resolución) | Refraction Productions](https://refractionproductions.com/que-es-frecuencia-de-muestreo-profundidad-resolucion-bits-audio/) 3. [Sampling (signal processing) - Wikipedia](https://en.wikipedia.org/wiki/Sampling_(signal_processing))