Noise reduction
Tags: bash, pipewire, tutorial
Published: 2024-01-04 13:43:48

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](https://github.com/mikeroyal/PipeWire-Guide)

Además, vamos a habilitar la reducción de ruido con *easyeffects*, la documentación está en [Easyeffects](https://github.com/wwmm/easyeffects/wiki/Community-presets)

---

## Índice<a name="index"></a>

- [Revisar la instalación de *pipewire*](#chapter-1)
  - [Instalar librerías](#chapter-1a)
  - [Sustituir *pipewire-media-session* por *wireplumber*](#chapter-1b)
  - [Configurar *pipewire* para clientes *alsa*](#chapter-1c)
  - [Desactivar *pulseaudio*](#chapter-1d)
  - [Revisar y activar](#chapter-1e)
- [Instalar *Easyeffects*](#chapter-2)
- [Activar en el inicio (*autostart*)](#chapter-3)

---

[-^-](#index)
## Revisar la instalación de *pipewire*<a name="chapter-1"></a>

> 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*.

[-^-](#index)
### Instalar librerías<a name="chapter-1a"></a>

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
```

[-^-](#index)
### Sustituir *pipewire-media-session* por *wireplumber*<a name="chapter-1b"></a>

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
```

[-^-](#index)
### Configurar *pipewire* para clientes *alsa*<a name="chapter-1c"></a>

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/
```

[-^-](#index)
### Desactivar *pulseaudio*<a name="chapter-1d"></a>

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
```

[-^-](#index)
### Revisar y activar<a name="chapter-1e"></a>

Actualizamos la configuración, para ello lanzamos:

```
sudo ldconfig
```

Activamos *wireplumber*:

```
systemctl --user --now enable wireplumber.service
```

Y en caso de ser necesario reiniciamos los servicios:

```
systemctl --user restart pipewire
```

Comprobamos su estado:

```
systemctl --user status pipewire pipewire-session-manager
```

y consultamos la info:

```
pactl info
```

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.

---

[-^-](#index)
## Instalar *Easyeffects*<a name="chapter-2"></a>

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
```

> 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}"
```

> 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}"
```

> 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=$?
```

> 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.

---

[-^-](#index)
## Activar en el inicio (*autostart*)<a name="chapter-3"></a>

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"
```

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"
```

Movemos el archivo a su destino:

```
sudo mv "${initEasyEffects}.temp" "${profileFolder}/${initEasyEffects}"
```

Comprobamos que se movió correctamente:

```
[ -f "${profileFolder}/${initEasyEffects}" ]
fileExist=$?
```

Y le cambiamos los permisos para que se pueda ejecutar:

```
sudo chmod +x ${initEasyEffects}
```

---

Espero te haya servido de ayuda.
:)