Alertas sonoras de Centreon con la IA de Ollama y Piper

En este post vamos a combinar varios elementos para tener notificaciones por voz en nuestro sistema de monitorización. Usaremos por supuesto la Inteligencia artificial local y segura (Ollama) para generar un texto amable y humano con la alerta de Centreon, para posteriormente reproducirla en nuestra Pantalla de 7″ gracias a Piper y una voz en perfecto español.

 

Así que lo dicho, si tienes un sistema de monitorización basado en Centreon sabrás que puedes recibir alertas cuando exista un problema en un Servicio o Host monitorizado, así te enterarás de cualquier problema en tu datacenter. En un post pasado vimos cómo hacer que los mensajes que genera Centreon sean más ‘humanos’ gracias a la IA de Ollama, en aquella ocasión mandaba la alerta en formato texto por Telegram. Hoy la diferencia es que haremos que el mensaje sea reproducido por una voz humana (gracias a Piper) y suene por los altavoces de una pequeña Raspberry Pi, que uso en mi Pantalla de 7″ de monitorización.

 

Este sería un ejemplo de audio:

 

Ah, por supuesto, recordar que todo lo que veremos en este post es open source, local, seguro, sin necesidad de Internet

 

Piper

Empezamos por tanto con Piper, que como dicen en su web oficial es un ‘un sistema neuronal rápido y local de texto a voz que suena genial’. Es un TTS (Text-to-speech) que podremos instalar en la Raspberry Pi para convertir cualquier texto en audio con una variedad inmensa de voces en distintos idiomas que nos vendrán genial!

 

Lo más sencillo para tener Piper instalado en la Raspberry Pi, será descargándonos ya el binario compilado para nuestra arquitectura de CPU. Que lo sabremos ejecutando: ‘cat /proc/cpuinfo’.

  • Para el escritorio Linux de 64-bit: amd64
  • Para la Raspberry Pi 4 de 64-bit: arm64
  • Para la Raspberry Pi 3/4 de 32-bit: armv7

 

Descargaros la última versión que encontréis en su GitHub, los links se quedarán obsoletos. Nos lo descargamos, descomprimimos y entramos en su directorio:

wget https://github.com/rhasspy/piper/releases/download/v1.2.0/piper_armv7.tar.gz
tar zxfv piper_armv7.tar.gz
cd piper

 

Escogemos un modelo de voz entrenada de su repositorio: https://github.com/rhasspy/piper/#voices y cuando elijamos la que más nos guste nos descargamos el fichero ONNX y el JSON. Por cierto si queréis escucharlas para ver cómo suenan, usar esta web: https://rhasspy.github.io/piper-samples/. Venga, nos los descargamos:

wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/sharvard/medium/es_ES-sharvard-medium.onnx?download=true -O es_ES-sharvard-medium.onnx
wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/sharvard/medium/es_ES-sharvard-medium.onnx.json?download=true.json -O es_ES-sharvard-medium.onnx.json

 

Y podemos probarlo ya, tendremos dos opciones, crear el streaming de audio y escucharlo por los altavoces de la Raspberry Pi directamente, o generar un fichero .wav para lo que necesitemos. Ejecutamos:

echo 'Hola, esto es un ejemplo de una frase.' | ./piper --model es_ES-sharvard-medium.onnx --output-raw | aplay -r 22050 -f S16_LE -t raw -

 

Y sonará algo así:

 

Integración con Centreon

Si queremos llamar a Piper desde una alerta de notificación, estos son los pasos que yo he seguido. Primero en la Raspberry Pi le crearemos un script al que Centreon le llame cuando haya una notificación, ejecutará este script que notificará por los altavoces de la alerta generada. El script recibirá como primera y única variable el texto que debe reproducir. Me ha quedado algo así (/home/pi/piper/alerta_piper.sh):

#!/bin/bash
cd /home/pi/piper
rm alerta.wav
echo $1 | ./piper --model es_ES-sharvard-medium.onnx --length_scale 1.1 --output_file alerta.wav
systemctl stop snapclient
aplay alerta_inicio.wav
aplay alerta.wav
aplay alerta_fin.wav
systemctl start snapclient

Algunos detalles que veréis es que le ralentizo un poquíto la voz, y que paro unos servicios de snapclient, ya que desde esta pantalla también suele sonar música ambiental y para detenerla temporalmente mientras suena el mensaje.

 

Tras hacer el script ejecutable, deberemos llamarlo/ejecutarlo desde el servidor de Centreon Central, o desde un Poller si es el caso. Para ello, será necesario hacer un fingerprint entre el servidor de Centreon y la Raspberry Pi, para que pueda acceder por SSH sin pedir credenciales, y de esa manera ejecutaremos el script en remoto.

su centreon-engine
  ssh-keygen -t rsa
  cat /var/lib/centreon-engine/.ssh/id_rsa.pub
    ssh-rsa AAA...ySHsfu0= centreon-engine@os-poller-osit

Así que en el Centreon nos logueamos como el usuario que ejecuta las cosicas en Centreon, generamos una clave privada y pública en caso de no tenerlas; luego con cat veremos la clave pública recién creada y la copiamos.

Pegamos la clave pública del Centreon Central o Poller en la Raspberry Pi en el fichero /home/pi/.ssh/authorized_keys

Y probamos a ver si conectamos desde Centreon con centreon-engine a la Raspberry Pi con un SSH::

ssh pi@DIRECCION_IP_RASPBERRY_PI

 

Ahora queda dar de alta los comandos en Centreon que se usarán para notificar cuando un Host o un Servicio tienen problemas. Si usamos este post anterior como referencia, donde generamos ya los scripts para lanzar el mensaje generado por la IA de Ollama a Telegram, pues simplemente tendremos que añadirles una línea al final que llame al script creado en la Raspberry Pi y ya. Así recibiremos la notificación en Telegram y por los altavoces. Os dejo un resumen del script que alerta problemas en los Hosts, lo dicho, lo importante es la última línea:

#!/bin/bash

# Genera el mensaje la IA de Ollama al gusto
texto="Por favor, genera un texto para una notificación que será enviada al smartphone del usuario con información útil. Eres un agente personal útil que genera texto para técnicos de sistemas. Tus respuestas pueden ser técnicas, no te ofrezcas como ayuda, ni des recomendaciones. El mensaje que tienes que decir es sobre un problema de tipo: "$1", en el equipo "$2" ya que está en el estado "$3". No saludes, no digas Hola y no te despidas, ni des las gracias por nada. La respuesta debe ser en Español y el mensaje debe ser breve."

texto_generado=$(/usr/bin/curl http://DIRECCION_IP_OLLAMA:11434/api/generate  -H "Content-Type: application/json" -d '{
  "model": "llama3",
  "prompt": "'"$texto"'",
  "temperature": 0.1,
  "stream": false,
  "max_length": 50
}' | jq -r '.response')

texto_generado_sin_comillas=`echo "$texto_generado" | sed 's/\"//g'`

# Manda a Telegram
/usr/bin/curl -X POST -H "Content-Type: application/json" -d '{
  "chat_id": "ID_CHAT_TELEGRAM",
  "text": "'"$texto_generado_sin_comillas"'"
}' "https://api.telegram.org/botTOKEN_BOT_TELEGRAM/sendMessage"

# Alerta en la Raspberry Pi con Piper por los altavoces
ssh pi@DIRECCION_IP_RASPBERRYPI "sudo /home/pi/piper/alerta_piper.sh \"$texto_generado_sin_comillas\""

 

¡Y chimpún! Ya lo tenemos listo, script creado y el que tenga dudas tiene en los posts anteriores cualquier dato que necesite para crear el Comando, darlo de alta en Centreon, montar la IA local y segura de Ollama, montarse Centreon…

Como siempre y por ser muy original, espero que os haya resultado de interés, que podáis aplicarlo en otro tipo de tecnologías, ideas… La verdad que Piper y Ollama en mi hogar con Home Assistant son totalmente necesarios, le dan un toque original, ahora sí que podemos empezar a llamarle poquito a poco hogar inteligente… pero eso, en otros posts, ya veremos!

Abrazos, portaros bien!

 

Héctor Herrero