Cambiador de voz amplificado usando una Raspberry Pi Zero

Mientras investigaba posibles mejoras para el disfraz de Star Wars Bounty Hunter de mi hijo, encontré una excelente publicación de blog de Dave Shevett en Planet-Geek.com sobre el uso de una Raspberry Pi para crear un cambiador de voz para un disfraz de Halloween. Esto parecía algo que podría integrar en nuestro casco de cazarrecompensas construido con amor.

El sistema usa SoX para grabar sonido a través de un micrófono, distorsionarlo y luego enviarlo a un altavoz amplificado.

Recogí el hardware y seguí los pasos de Dave. Para mi proyecto, decidí usar Raspbian Lite y Pi Zero W. Todo funciona, por lo que esta publicación se presenta para cualquier persona que quiera hacer algo similar y puede encontrar estos pasos útiles.

Hardware cambiador de voz

  • Raspberry Pi Cero W
  • Adaptador microUSB a USB
  • concentrador USB (opcional)
  • Teclado
  • Adaptador de sonido USB
  • fuente de alimentación de 5V
  • Altavoz amplificado

Adaptador de sonido USB

Mi dongle de adaptador de audio y sonido USB era un «controlador de audio C-Media Electronics Inc CM108». Tiene un conector USB estándar, un conector para micrófono de 3,5 mm y un conector para auriculares de 3,5 mm. En el interior hay un LED rojo muy brillante que domé con un poco de cinta aislante.

Hay muchas alternativas, pero es difícil saber qué tan compatibles son con Pi. Están disponibles desde [eBay] por unos pocos €/£.

Altavoz amplificado

Compré un altavoz de voz amplificado portátil «N74» de [eBay] por £20. Tiene una batería recargable incorporada, un enchufe de entrada de línea y viene con dos micrófonos. Necesitaba sacar un adaptador de corriente de 5V para cargarlo.

Configuración

Para comenzar, cree una nueva tarjeta microSD de 4 GB con la última imagen de Raspbian Lite. El Pi Zero debe conectarse a un monitor HDMI y un teclado usando los adaptadores apropiados. Cuando el Pi arranque por primera vez, inicie sesión con el nombre de usuario y la contraseña predeterminados (pi/raspberry).

Inicie la utilidad de configuración:

sudo raspi-config

y realice los siguientes cambios de configuración:

  • Nombre de host > “Cambiador de voz”
  • Opciones de arranque > Escritorio/CLI > Inicio de sesión automático en la consola
  • Opciones de arranque > Esperar red en el arranque > No
  • Opciones de interfaz > SSH > Sí
  • Opciones avanzadas > Expandir sistema de archivos

Seleccione y reinicie el Pi cuando se le solicite.

Configurar Wi-Fi (Opcional)

Conectar el Pi a una red le permite hacer el resto de la configuración usando SSH en una PC. Esto ahorra un poco de escritura, ya que puede cortar y pegar texto y transferir archivos.

Para configurar el WiFi, edite el archivo wpa_supplicant.conf:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

Ya debería contener:

ctrl_interface=/var/run/wpa_supplicant update_config=1

luego inserte:

network={   scan_ssid=1   key_mgmt=WPA-PSK WPA-EAP   psk="1234567890"   ssid="MyWIFISSID" }

Utilice su propia contraseña y SSID. Vuelva a verificar los valores, guarde (CTRL-X, Y) y regrese a la línea de comando.

Conectar dispositivo de audio USB

Apague el Pi usando:

sudo halt

y desconecte la alimentación.

Si tiene un concentrador USB, puede conectar el teclado y la llave de sonido USB al mismo tiempo. Si se va a conectar a la RasPi usando SSH, entonces no necesita el hub y reemplace el teclado con el dongle de sonido USB.

Vuelva a conectar la alimentación y permita que Pi se inicie. Con un poco de suerte, su Pi se conectará a WiFi y se habilitará SSH.

Comprobar dispositivo de audio USB

Una vez iniciado, conéctese a la RasPi usando cualquier utilidad de terminal SSH (como Putty o MobaXterm). O use el teclado si todavía lo tiene conectado.

Ahora compruebe que se detectó el dispositivo de audio USB:

lsusb

Debería ver el dispositivo de audio en la lista junto con cualquier otro dispositivo USB conectado:

Se puede ver más información sobre el adaptador usando:

dmesg | grep C-Media

Para averiguar el número de tarjeta del dispositivo, utilice:

aplay -l

El dispositivo debe aparecer como «tarjeta 1».

Cree el archivo «asoundrc» usando:

sudo nano .asoundrc

y agrega el siguiente texto:

pcm.!default {  type hw  card 1 }  ctl.!default {  type hw   card 1 }

Esto le dice al sistema que use la Tarjeta 1 como entrada y salida de audio predeterminada.

Una vez que haya guardado el archivo (CTRL-X, Y) puede verificar el contenido en cualquier momento usando:

cat .asoundrc

Instalar SoX

Para usar la utilidad «play» necesitamos instalar «SoX»:

sudo apt-get install sox

Instalar mpg123 (Opcional)

Para permitir que el sistema reproduzca archivos MP3, también instalé mp123, pero esto es opcional.

sudo apt-get install mpg123

Puede reproducir archivos MP3 usando:

mpg123 mysong.mp3

alsamixer

Para verificar que el altavoz y el micrófono no estén silenciados, puede ejecutar Alsamixer usando:

alsamixer

Esto debería mostrarle un indicador para «Altavoz», «Micrófono» y «Control automático de ganancia».

Con las teclas de flecha puede ajustar la ganancia de ambos canales y activar o desactivar la ganancia automática. Un canal se puede silenciar con la tecla M. Aparece “MM” si el canal está silenciado. Presione «Esc» para volver a la línea de comando.

Prueba de altavoz

Con auriculares o un altavoz conectado al dongle, puede usar la sencilla utilidad de prueba de altavoz:

speaker-test -c2

o

speaker-test -c2 -t sine -f 500

Debería escuchar ruido blanco o un tono de 500 Hz a través de su altavoz. Presione CTRL-Z para salir de la prueba.

Reiniciar

Como ha instalado algunos paquetes y ha editado el archivo .asoundrc, reinicie para asegurarse de que todos los cambios estén activos. El comando de prueba de altavoz a veces puede generar errores de «Dispositivo o recurso ocupado», por lo que reiniciarlo es útil en este punto:

sudo reboot

Reproducción de archivos WAV (opcional)

¡Casi llegamos! Si desea reproducir un archivo WAV de prueba, puede descargar un archivo de prueba usando:

wget http://www.kozco.com/tech/piano2.wav

y luego jugar usando:

play piano2.wav

Cambio de voz usando SoX

Usando el método de Dave Shevett, puede cambiar dinámicamente su voz usando:

play "|rec --buffer 2048 -d pitch -300 echos 0.8 0.88 100 0.6 150 .5 band 1.2k 1.5k"

Esto procesa los datos del canal del micrófono usando «rec» y los pasa a «reproducir», que envía el resultado al altavoz.

  • El búfer permite que la transmisión recopile datos del micrófono para procesarlos antes de enviarlos al altavoz. Esto agregará algo de retraso. Puede reducir el número, pero el búfer puede desbordarse si no puede seguir el ritmo.
  • tono reduce el tono de la voz
  • echos agrega algunos ecos (ya lo adivinaste, ¿verdad?)
  • band agrega un filtro centrado en 1.2kHz con una pendiente de 1.5Hz a cada lado.

Todas las opciones de SoX se detallan en la página de opciones de SoX.

Puede jugar con las opciones y valores para obtener diferentes efectos.

Inicio automático en el arranque

Si desea que el cambiador de voz sea portátil, puede configurar un script para ejecutar automáticamente el comando de reproducción cuando se inicia el Pi. Esto se puede hacer configurando un trabajo cron.

Primero necesitamos crear un script:

nano voicechanger.sh

luego pegue el comando de reproducción:

play "|rec --buffer 2048 -d pitch -300 echos 0.8 0.88 100 0.6 150 .5 band 1.2k 1.5k"

Acceda a la configuración de cron para el usuario Pi usando:

crontab -e

Seleccione «nano» si solicita un editor de texto. Luego agregue la siguiente línea:

@reboot sh /home/pi/voicechanger.sh > /home/pi/voicechanger.log 2>&1

Guarde y salga usando CTRL-X, Y.

La próxima vez que reinicie, el comando de reproducción debería ejecutarse automáticamente.

Conclusiones finales

Una cosa en la que perdí mucho tiempo fue la conexión del micrófono al dispositivo de audio USB. Si el conector de 3,5 mm se introdujo completamente en el zócalo, el micrófono no funcionó. Pasé años preguntándome por qué no funcionaba hasta que lo saqué un poco, se hizo la conexión y el micrófono funcionó como se esperaba.

De alguna manera, el cambiador de voz funcionó muy bien, pero no sonaba como esperaba. Al final, decidí no usar el cambiador de voz porque la voz real de mi hijo era demasiado obvia en el fondo. Había cubierto mucho terreno en este punto, así que decidí escribirlo de todos modos en caso de que alguien más lo encontrara útil.