Después de casi dos meses de espera, esta semana recibí seis micrófonos digitales con la intención de utilizarlos como input de audio durante las transmisiones en directo de cada módulo. 

El modelo adquirido es un breakout board para el micrófono SMD “SPH0645LM4H“. 
Toda la información sobre esta placa, con tutoriales, y ficha técnica se puede consultar en la página de Adafruit aquí.

Anteriormente había adquirido con mucha ilusión seis micrófonos analógicos “MAX4466” pero mi corazón se rompió rápidamente cuando me di cuenta que iba a ser muy complicado cambiar la señal a digital y que requeriría de más componentes de los que tenía en mente.  Así que ahora tengo en la lista de otros proyectos pendientes hacer algo con ellos.

En fin, en este post describiré cómo hacer el setup para la RBPZW.

  1. Para poder comenzar a probar decidí soldar una tira de seis headers. Es importante que los pins queden hacia el lado opuesto del micrófono. Se puede identificar por una pequeña flecha blanca. 
  2. Conexiones para salida en Mono :
    3V – a – Pi 3V 
    GND – a – Pi GND
    BCLK – a – BCM 18 (pin12)
    DOUT – a – BCM 30 (pin38)
    LRCL – a – BCM 19 (pin35)
  3. Conectada ya a la Pi, y desde terminal hay que descargar un archivo .sh desde el GitHub de Adafruit con:
    wget https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/i2smic.sh
  4. Luego, dar permiso para acceder a otro archivo .sh para el micrófono con:
    chmod +x i2smic.sh
  5. Finalmente :
    sudo ./i2smic.sh

    Aparecerá una mensaje de configuración que pregunta por el modelo de Raspberry que se está utilizando y finalmente se hará un reboot.

  6. Para probar que todo funcione vamos a grabar un pequeño archivo de audio, pero primero  habrá que verificar que tengamos dispositivos de entrada disponibles, en este caso el micrófono. Para ello hay que usar el comando , comando list (l) y “arecord” de ALSA “.
    arecord -l

    La tarjeta en mi caso se reconoce como “0”:

  7. Luego grabaremos en mono con el siguiente código, pidiendo que se guarde en un archivo llamado “file.wav”: 
arecord -D plughw:0 -c1 -r 48000 -f S32_LE -t wav -V mono -v file.w

Por cierto, todos los parámetros de “arecord” se pueden consultar aquí.

  • Ahora vamos a escuchar el audio, tomando en cuenta que en mi caso tengo ya en el setup de la RBPZW un dispositivo de audio de bluetooth:
    aplay -D bluealsa file.wav

    Puedes probar quitando el “-D bluealsa”

    En mi caso pude escuchar el audio, pero mi voz se escuchaba muy lejana. Queda pendiente buscar la manera de regular el gain de audio.

     

    Update 14 de Julio: Tests de audio y volumen de entrada

  • T1: Aquí una prueba de sonido acercándome y alejándome del micrófono sin modificar parámetros. Como se puede apreciar mi voz se escucha muy baja aún estando cerca del micrófono.

    Para modificar el volumen de entrada, Adafruit propone acceder a un mixer de audio de alsa llamado “alsamixer”. 
    Para ello hay que ir al archivo .asoundrc que ya teníamos creado  (para los settings de bluetooth), y para colocar un código que llama a un pequeño software de control de volumen . 

    Mi código se ve así: 

    ####### PARA BLUETOOTH CON BLUEALSA
    defaults.bluealsa.interface "hci0"
    defaults.bluealsa.device "F8:DF:15:C2:77:43"
    defaults.bluealsa.profile "a2dp"
    defaults.bluealsa.delay 10000
    #
    ####### PARA VOLUMEN DE MICRO DIGITAL
    This section makes a reference to your I2S hardware, adjust the card name
    to what is shown in arecord -l after card x: before the name in []
    You may have to adjust channel count also but stick with default first
    pcm.dmic_hw {
    type hw
    card sndrpii2scard
    channels 2
    format S32_LE
    }
    This is the software volume control, it links to the hardware above and after
    saving the .asoundrc file you can type alsamixer, press F6 to select
    your I2S mic then F4 to set the recording volume and arrow up and down
    to adjust the volume
    After adjusting the volume - go for 50 percent at first, you can do
    something like
    arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v myfile.wav
    pcm.dmic_sv {
    type softvol
    slave.pcm dmic_hw
    control {
    name "Boost Capture Volume"
    card sndrpii2scard
    }
    min_dB -3.0
    max_dB 30.0
    }
    #

    Una vez hecho esto, desde terminal hay que escribir alsamixer, se abirá una ventanita y habrá que presionar F6 para seleccionar la tarjeta de sonido que tenemos y que en este caso es la 0 (Esto lo sabemos con arecord -l hecho anteriormente).

    Utilizando las flechas del teclado, subir y bajar el volumen de entrada.

    Para guardar los settings:

    sudo alsactl store
  • He probado con un 50%. He aquí el resultado:

     

    Utilicé el siguiente código para la grabación, cambiando entre 41000 Hz y 48000 Hz.

    arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v recording.wav

    Nota importante! Me parece que tendré que hacer una primera grabación de prueba y posteriormete  abrir el alsamixer para ajustar el volumen de entrada antes de iniciar las emisiones en directo. 

    Transmisión de datos de audio por Youtube Live

El objetivo principal de invitar al micrófono digital a la fiesta es poder transmitir audio desde cada parte del cuerpo, así pues y aunque aún estoy en proceso de resolver esta parte, he hecho algunas pruebas.
El setup que tengo montado se ve así:

A la izquierda se ve la cámara gran angular de 130 grados (¡ya tengo seis!), luego se ve parte del circuito que hace funcionar al motor pero que en este ejercicio no tomé en cuenta, luego la RBPZW y el micrófono. En la segunda foto también se puede apreciar el altavoz bluetooth y que en el futuro será suplido por auriculares durante la performance.

Como se puede observar, las conexiones durante la prueba están bastante inestables, para resolver esto estoy trabajando en EAGLE en una placa customizada que funcionará a manera shield para la Raspberry. Más adelante pondré updates del tema.

Aquí los códigos que estoy probando:

A) Basado en el siguiente foro: shorturl.at/uCNWZ

raspivid -o - -t 0 -vf -hf -fps 30 -b 6000000 | ffmpeg -f alsa -ac 1 -ar 44100 -i default -acodec pcm_s16le -f s16le -f h264 -i - -vcodec copy -acodec aac -ab 128k -g 60 -strict -2 -f flv rtmp://a.rtmp.youtube.com/live2/códigodetransmisión

B) Basado en el siguiente foro: shorturl.at/krv56

raspivid -o - -t 0 -vf -hf -fps 30 -b 600000 | ffmpeg -i pipe: -f alsa -ac 1 -i plughw:0 -vcodec copy -acodec aac -ab 128k -g 50 -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/códigodetransmisión

Hay que recordar que en el post previo de setup de la cámara, tengo la explicación de todos los parámetros utilizados para transmitir con raspvid.

En fin, aunque el micrófono está siendo reconocido en la transmisión de audio, de momento solo he podido capturar ruido. Comparto por aquí una de mis pruebas de emisión, en el 00:48 se puede escuchar este particular y  no intencionado noise digital. (Cuidado si están con auriculares o con volumen alto)

https://www.youtube.com/watch?v=c0x3xZCg1nE
https://youtu.be/JfBY6tapY6Y
raspivid --nopreview -md 4 -w 640 -h 480 -fps 15 -t 0 -b 200000 -g 30 -n -o - |  ffmpeg -y -xerror -thread_queue_size 32K -f h264 -r 15 -itsoffset 0 -i - -f alsa -ar 11025 -itsoffset 5.5 -async 1 -ac 1 -thread_queue_size 32K -i plughw:0 -c:a aac -b:a 32k -async 1  -c:v copy  -f flv -flags:v +global_header -rtmp_buffer 10000 -r 15 -async 1 rtmp://a.rtmp.youtube.com/live2/CODIGODETRANSMISION

Tareas pendientes:
Trabajar en el código de emisión para configurar bien la entrada y salida de audio.
Buscar cómo cambiar la ganancia
Añadir el módulo del micrófono al shield en el que estoy trabajando

Update 14 de Julio: Nuevos códigos, nuevos tests
He podido limpiar un poquito el código sin audio, intentando recibir una buena señal y evitando bufferings.  

 raspivid -o - -t 0 -vf -hf -w 854 -h 480 -fps 25 -b 1200000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i - -vcodec copy -acodec aac -ab 128k -g 50 -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/claveaquí

Como se puede observar, la cámara está soltando un color rojizo extraño. También la imagen se ve un tanto pixelada, pero no me molesta del todo, no puedo aspirar a un HD en streaming y eso hace parte también de la estética del proyecto. 

https://www.youtube.com/watch?v=P7xLotMNZm4

El tutorial que describe muy bien cómo adaptar el audio al streaming también es de Adafruit y está aquí: https://learn.adafruit.com/ultimate-youtube-live-camera/streaming-to-youtube

Cambié la cámara y la imagen ha cambiado radicalmente. El código del siguiente test es:

raspivid –nopreview -md 4  -vf -hf -w 854 -h 480 -fps 25 -t 0 -b 1200000 -g 30 -n -o – |  ffmpeg -use_wallclock_as_timestamps 1 -y -xerror -thread_queue_size 32K -f h264 -r 15 -itsoffset 0 -i – -f alsa -ar 11025 -itsoffset 5.5 -async 1 -ac 1 -thread_queue_size 32K -i plughw:0 -c:a aac -b:a 32k -async 1  -c:v copy  -f flv -flags:v +global_header -rtmp_buffer 10000 -r 15 -async 1 STREAMKEY

https://youtu.be/EfeOOva4_iY