Noise reduction

elferrer

Raül Martínez i Peris

Posted on January 4, 2024

Noise reduction

Tengo instalada la distro https://neon.kde.org/ (iso: neon-user-20231221-0716.iso), y una novedad que me he encontrado a finales de 2023 tras unos meses sin tocar mi ordenador ha sido el cambio de pulseaudio a pipewire.

Ello implica que ya no me funciona la configuración de sonido que tenía aplicada para quitarle el ruido de fondo al micrófono. Así que me he puesto manos a la obra para volver a ponerme el eliminador de ruido, pero esta vez para pipewire.

He de decir que me ha encantado el cambio a pipewire.


Documentación

Todo lo indicado está basado en la documentación oficial. Puedes encontrar la documentación de pipewire en Pipewire

Además, vamos a habilitar la reducción de ruido con easyeffects, la documentación está en Easyeffects


Índice


-^-

Revisar la instalación de pipewire

Todo el código que ves está pensado para que puedas ejecutarlo con un script bash, o, directamente en la consola bash. Recuerda que si creas un archivo deberás indicar en la primera línea del archivo #!/bin/bash para que se ejecute con dicha shell.

-^-

Instalar librerías

El primer paso es revisar la instalación de las librerías cliente:

sudo apt install pipewire-audio-client-libraries libspa-0.2-bluetooth libspa-0.2-jack
Enter fullscreen mode Exit fullscreen mode

-^-

Sustituir pipewire-media-session por wireplumber

Lo siguiente que necesitamos es instalar wireplumber y quitar pipewire-media-session ya que éste último se ha quedado descontinuado y se ha cambiado por el primero:

sudo apt purge pipewire-media-session
sudo apt install wireplumber
Enter fullscreen mode Exit fullscreen mode

-^-

Configurar pipewire para clientes alsa

Ahora copiaremos el archivo de configuración para alsa:

sudo cp /usr/share/doc/pipewire/examples/alsa.conf.d/99-pipewire-default.conf /etc/alsa/conf.d/
Enter fullscreen mode Exit fullscreen mode

-^-

Desactivar pulseaudio

Es el momento de desactivar pulseaudio, para ello deshabilitaremos el servicio y anularemos sus mensajes enmascarándolos hacia /dev/null:

systemctl --user --now disable pulseaudio.service pulseaudio.socket
systemctl --user mask pulseaudio
Enter fullscreen mode Exit fullscreen mode

-^-

Revisar y activar

Actualizamos la configuración, para ello lanzamos:

sudo ldconfig
Enter fullscreen mode Exit fullscreen mode

Activamos wireplumber:

systemctl --user --now enable wireplumber.service
Enter fullscreen mode Exit fullscreen mode

Y en caso de ser necesario reiniciamos los servicios:

systemctl --user restart pipewire
Enter fullscreen mode Exit fullscreen mode

Comprobamos su estado:

systemctl --user status pipewire pipewire-session-manager
Enter fullscreen mode Exit fullscreen mode

y consultamos la info:

pactl info
Enter fullscreen mode Exit fullscreen mode

Verás un resumen. En la info que te lanza pactl verás una línea de texto similar a "Server Name: PulseAudio (on PipeWire x.x.x.x)". Si vemos on Pipewire quiere decir que está todo bien.

Podíamos haber realizado un grep para mostrar solo la línea que nos interesa, pero en este momento es más interesante ver toda la info. Puedes adaptarte el script para que te dé un error si no existe 'PipeWire' en el resultado.


-^-

Instalar Easyeffects

Después de haber revisado pipewire le llega el momento a easyeffects. Con easyeffects vamos a añadir el efecto noise-reduction.

Instalamos con flatpack el módulo easyeffects. Evidentemente deberás tener instalado flatpack:

flatpak install flathub com.github.wwmm.easyeffects
Enter fullscreen mode Exit fullscreen mode

Puedes lanzarlo la interfaz visual con flatpak run com.github.wwmm.easyeffects.

Vamos a empezar, construyamos algunas variables para mejorar la legibilidad y evitar errores:

noiseReduction="noise-reduction"
folderEasyEffects="$HOME/.var/app/com.github.wwmm.easyeffects/config/easyeffects"
easyEffectsConfigInput="autoload/input"
configureNoiseReduction="${noiseReduction}.json"
noiseReductionJson="${folderEasyEffects}/${easyEffectsConfigInput}/${configureNoiseReduction}"
Enter fullscreen mode Exit fullscreen mode

Te habrás percibido de que vamos a guardar el filtro dentro de la carpeta autoload/input, de esta forma siempre se leerá cuando se inicie easyeffects. Por contra, si no quieres que se lea de forma automática deberás guardarlo en la carpeta input en vez de en la carpeta autoload/input.

Ahora vamos a crear el archivo noise-reduction.json:

read -r -d '' configureContentNoiseReduction <<EOF
{
    "input": {
        "blocklist": [],
        "plugins_order": [
            "rnnoise#0"
        ],
        "rnnoise#0": {
            "bypass": false,
            "enable-vad": true,
            "input-gain": 0.0,
            "model-path": "",
            "output-gain": 0.0,
            "release": 20.0,
            "vad-thres": 50.0,
            "wet": 0.0
        }
    }
}
EOF
echo "${configureContentNoiseReduction}" >| "${noiseReductionJson}"
Enter fullscreen mode Exit fullscreen mode

En cada ordenador, habrá que investigar un poco sobre qué valores del filtro son los que mejor se adaptan.

Una vez ejecutado el código, comprobamos que se ha creado correctamente:

[ -f "${noiseReductionJson}" ]
fileExist=$?
Enter fullscreen mode Exit fullscreen mode

Si la variable fileExist tiene un 0 quiere decir que el archivo existe; cualquier otro valor es un error.

Con estos pasos ya tenemos preparada la configuración y podemos volver a lanzar el script cuando lo necesitemos.


-^-

Activar en el inicio (autostart)

En este último paso vamos a hacer que se ejecute easyeffects en el inicio.

Si no quieres que el perfil se inicie automáticamente, puedes lanzarlo con flatpak run com.github.wwmm.easyeffects --load-preset nombre_del_perfil --gapplication-service &.

Primero nos creamos nuestras variables para simplificar las acciones:

profileFolder="/etc/profile.d"
initEasyEffects="99-autostart-easyeffects.sh"
Enter fullscreen mode Exit fullscreen mode

Creamos el archivo que se ejecutará al inicio:

read -r -d '' easyeffectsContent <<EOF
#!/bin/bash
flatpak run com.github.wwmm.easyeffects --gapplication-service &
EOF
echo "${easyeffectsContent}" >| "${initEasyEffects}.temp"
Enter fullscreen mode Exit fullscreen mode

Movemos el archivo a su destino:

sudo mv "${initEasyEffects}.temp" "${profileFolder}/${initEasyEffects}"
Enter fullscreen mode Exit fullscreen mode

Comprobamos que se movió correctamente:

[ -f "${profileFolder}/${initEasyEffects}" ]
fileExist=$?
Enter fullscreen mode Exit fullscreen mode

Y le cambiamos los permisos para que se pueda ejecutar:

sudo chmod +x ${initEasyEffects}
Enter fullscreen mode Exit fullscreen mode

Espero te haya servido de ayuda.
:)

💖 💪 🙅 🚩
elferrer
Raül Martínez i Peris

Posted on January 4, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Noise reduction
bash Noise reduction

January 4, 2024