Uno de los procesos en los que he trabajado durante este confinamiento, es la codificación de mensajes generados dede el I’m Live! ( así llamaré desde ahora a la web de la performance online de Transceptor) en estímulos para el cuerpo. Distintxs usuarixs enviarán algunas señales a mi cuerpo pudiendo ser o bien señales empáticas 💜 traducidas a vibraciones puntuales con pequeños motores, o también pudiendo ser palabras escritas #identificables traducidas a sonido con un sintetizador de voz. (Anni Garza me ha dado la idea de reconocer esos textos mediante hashtags. Gracias Anni!)
Podemos decir entonces que parte del sistema de Transceptor está basado en comunicar la web I’m Live! con las Raspberry Pi’s que distribuidas en mi cuerpo.

En este post, describiré varios procesos que he aprendido con el objetivo de hacer que mi Raspberry Pi Zero W me hable al oído desde una web. 🤖💭

El diagrama de arriba, muestra el resumen del proceso que he trabajado.


Conectar un dispositivo Bluetooth

Probablemente utilizaré auriculares para escuchar las palabras #identificables que funcionarán como consignas de movimiento. Será como escuchar lo que dice mi cuerpo, pero en verdad será lo que dice un “cerebro colectivo” desde mi web. 💻😮

  1. Encender la Raspberry y el dispositivo bluetooth.
  2. Instalar BlueAlsa, un paquete que permite reconocer y registrar dispositivos de audio bluetooth.
    sudo apt-get install bluealsa

    Está basado en el software ALSA (Audio Linux Sound Architecture). (Aquí algunas notas y comandos útiles de BlueAlsa.)

  3. Llamar al paquete e inicializarlo:
    sudo service bluealsa start
  4. Acceder a las opciones de bluetooth con:
    sudo bluetoothctl
  5. Para ver la lista de dispositivos bluetooth que la Raspberry ha encontrado disponibles, escribir:
    scan on

    En esta lista verás el nombre del altavoz, y su número de identificación. Por ejemplo: F8:DF:15:C2:77:43. Copia y guarda este número en algún sitio fácil de encontrar.

  6. Hacer “pairing” con tu dispositivo:
    pair F8:DF:15:C2:77:43
  7. Después:
    trust F8:DF:15:C2:77:43
  8. Hacer conexión:
    connect F8:DF:15:C2:77:43
  9. Hasta aquí debería haberse escuchado una señal auditiva desde el altavoz o auriculares en respuesta a la conexión. Una vez hecho esto, hay que salir de las opciones de bluetooth con:
    exit
  10. Para que la Raspberry recuerde a este dispositivo cada vez que se enciende, hay que ir al archivo “.asoundrc“.
    nano ~/.asoundrc

    Se abrirá un archivo que hay que editar, añadiendo el identificador del dispositivo bluetooth. Por ejemplo:

    defaults.bluealsa.interface "hci0"
    defaults.bluealsa.device "7B:08:72:E8:DD:13"
    defaults.bluealsa.profile "a2dp"
    defaults.bluealsa.delay 10000

    { Update 19 de Julio
    Hay dos tipos de perfiles de configuración dependiendo del tipo de dispositivo bluetooth. En mi caso “a2dp” funciona para altavoces y “sco” para los auriculares que utilizaré en la performance.
    Al principio pensaba que mis auriculares tenían algún tipo de problema, pero adentrándome en el mundo de los foros, encontré un post que me ayudó a encontrar la solución.  Aquí la referencia }

  11. Una vez hecho esto, sal del editor de texto con Ctrl+X, y guarda los cambios. Este último proceso también simplifica la manera de redactar un código sin tener que escribir siempre el dispositivo que se quiere utilizar.

Ahora, para probar que la voz de la Raspberry Pi, escribir:

 aplay -D bluealsa /usr/share/sounds/alsa/Noise.wav

De esta manera estamos entrando a la carpeta de sonidos de ALSA y ejecutando el archivo Noise.wav
¡Listo!


Usar Text To Speech 

Necesitamos instalar una máquina virtual capaz de traducir caracteres de texto a voz mediante un sintetizador. Para ello estoy utilizando espeak, un software de código abierto producido por SourceForge y que tiene implementado diferentes idiomas, entre ellos inglés y español (de España y Latinoamérica).

  1. Instalar espeak
    sudo apt-get install espeak
  2. Hacer funcionar espeak desde la línea de comandos:
    espeak "Hello. I am your Raspberry Pi with a very robotic voice" -ven+f3 -k5 -s130 --stdout | aplay -D bluealsa

    Importante! Al estar utilizando bluealsa como dispositivo de audio de salida, es necesario usar siempre esta estructura. En caso de estar utilizando un altavoz conectado directamente al HDMI, entonces la estructura del código sería así:

    espeak "Hello speakers" 2>/dev/null

    Jorge Yau explica en su blog qué significa “2>/dev/null”. En mi caso esta sintaxis no me es útil, pero lo dejo por aquí.

Sintaxis en espeak:
– Para definir el idioma hay que utilizar “-v” seguido dela abreviación del idioma.  “-ven-us” para inglés norteamericano, “-ves” para español, y “-ves-la” para español latinamericano. Aquí una lista de abreviaciones para definir más idiomas.

Una prueba con una voz muy robótica:

Hay una lista larga de comandos dentro de la sintaxis en la página de espeak, aquí pondré algunos a modo de cheatsheet personal:

  • -a <integer>
    Establece la amplitud (volumen) en un rango de 0 a 200. El valor predeterminado es 100.
  • -p <integer>
    Ajusta el tono en un rango de 0 a 99. El valor predeterminado es 50.
  • -s <integer>
    Establece la velocidad en palabras por minuto. El valor predeterminado es 175.
  • -b <integer>
    Formato de caracteres de texto de entrada.
    1 UTF-8. Este es el valor predeterminado.
    2 El conjunto de caracteres de 8 bits que corresponde al idioma (por ejemplo, Latin-2 para polaco).
    4 Unicode de 16 bits.
    Sin esta opción, eSpeak supone que el texto es UTF-8.
  • -g <integer>
    Word Gap. Inserta una pausa entre palabras en unidades de 10 ms.
  • -k <integer>
    Aumenta el tono de las palabras que comienzan con mayúscula. Cuanto mayor es el valor, mayor es el aumento en el tono. Prueba -k20.
  • -w <archivo wav>
    Escribe la salida de voz en un archivo en formato WAV, en lugar de hablarlo.
  • –stdout
    Escribe la salida de voz en stdout a medida que se produce, en lugar de hablarla. Los datos comienzan con un encabezado de archivo WAV que indica la frecuencia de muestreo y el formato de los datos. El campo de longitud se establece en cero porque la longitud de los datos es desconocida cuando se genera el encabezado.
  • –punct [= “<caracteres>”]
    Dice los nombres de los caracteres de puntuación cuando se encuentran en el texto.

Con este setup ya puedo pasar un buen rato descubriendo lo que mejor funciona para escuchar futuras consignas de movimiento.
🤖Por investigar está, más librerías de voces, por ahora las que he probado son extremadamente sintéticas, aunque no me molesta.
📡El paso siguiente es hacer un código de Python que me permita leer strings de texto desde una URL.