18 de desembre 2017

Aplicar filtros de sonido al micrófono (pulseaudio)

imagen CC0
Actualización marzo 2021: Pulseeffects ya está disponible en Debian por lo que este artículo ha quedado en gran medida desfasado.
____________________


Probablemente la mejor solución para aplicar filtros al micrófono pasaría por instalar pulseeffects, programa que incorpora limitador, compresor, reverberador y ecualizador. A día de hoy hay paquetes para Arch Linux, Gentoo y Ubuntu. Para los que usamos Debian, a parte de no estar en los repositorios parece que da problemas al compilar, así que de momento no es una opción. Si es tu caso o no te convence pulseeffects te ofrezco otra solución a continuación.

Pulseaudio es el servidor de sonido por defecto de la mayoría de distribuciones linux.
En esta guía utilizaremos un módulo de pulseaudio que nos permite cargar plugins LADSPA. Con este acrónimo se define un formato estándar para filtros y procesadores de sonido, permitiendo que podamos instalar diferentes librerías de efectos y usarlos en todos los programas compatibles con dicho formato.
La receta es la siguiente:
pacmd load-module module-ladspa-sink sink_name= master= plugin= label= control=
sink_name=
El nombre que queramos ponerle al módulo.

master=
Salida de audio donde se enviará el sonido filtrado, típicamente la tarjeta de sonido. Para encontrar el nombre de nuestra tarjeta teclearemos pacmd list-sinks y copiaremos el texto que aparece en name: <nombre-de-la-tarjeta-de-sonido>.

plugin=
Nombre de archivo del plugin tal y como aparece en /usr/lib/ladspa/ sin la extensión.

label=
Un archivo puede contener varios filtros y aquí es donde ponemos la etiqueta del que queremos usar (normalmente será el mismo nombre que en el punto anterior).

control=
Parámetros del filtro. Necesitaremos consultar la documentación para saber qué valores poner, separados por comas.

El gran inconveniente de este método es que no se pueden modificar los ajustes del filtro una vez está en marcha, así que hacer pruebas hasta encontrar los valores idóneos se puede volver muy farragoso.

Para este ejemplo usaremos el plugin tap_dynamics, que incluye una función de compresor y puerta de ruido. Lo obtendremos instalando el paquete tap-plugins.
Empezamos:

pacmd load-module module-null-sink sink_name=MIX
Creamos una salida nula, un dispositivo virtual que no va a parar a ningún hardware.

pacmd load-module module-ladspa-sink sink_name=DIN master=MIX plugin=tap_dynamics_st label=tap_dynamics_st control=4,15,0,5,,13
Cargamos el plugin y lo mandamos a la salida nula. Según la documentación los parámetros de control corresponden a attack, release, offset gain, makeup gain, stereo mode y function. Dado mi desconocimiento del tema tuve que buscar unos valores recomendados de partida.

pacmd load-module module-loopback sink=DIN latency_msec=1
Con esto conectamos el micrófono predeterminado del sistema al filtro que cargamos en el punto anterior. Si tenemos más de un micrófono podemos especificar cuál de ellos utilizaremos con el parámetro source= . Los nombres los sacamos con el comando pacmd list-sources.

Hecho esto si abrimos el mezclador (pavucontrol) nos aparecerán todos los elementos que hemos creado y sus respectivas entradas y salidas. No es muy intuitivo que digamos pero la idea es la siguiente: en Reproducción seleccionamos hacia dónde dirigimos los flujos y en Grabación de dónde escuchamos.
Si queremos oír en vivo cómo suena el micrófono con nuestro filtro podemos ir a reproducción y mandar la salida del filtro LADSPA a nuestra tarjeta de sonido.
Es muy conveniente ir a la pestaña Dispositivos de entrada y marcar el monitor de la salida nula como predeterminado. Así cada vez que arranquemos un programa que utilice el micrófono como entrada seleccionará directamente el flujo filtrado y no tendremos que cambiarlo cada vez.

Más filtros

¿Queremos añadir más filtros a la cadena? Sin problema. Vamos a cargar ahora un filtro de reverberación del mismo pack de plugins que ya tenemos instalado.

pacmd load-module module-ladspa-sink sink_name=REV master=MIX plugin=tap_reverb label=tap_reverb control=,,,,,,,26
Como veis en este caso he dejado la mayoría de parámetros del filtro en valores por defecto (sin número) y solo me he fijado en el último, que indica el tipo de reverberación empleado.
Como lo hemos añadido posteriormente tendremos que entrar en el mezclador pavucontrol y cambiar las entradas y salidas para que el flujo de sonido quede así: micrófono>loopback>dynamics>reverb>salida nula.
Si los creamos desde cero el orden de comandos sería este:

pacmd load-module module-null-sink sink_name=MIX
pacmd load-module module-ladspa-sink sink_name=REVERB master=MIX plugin=tap_reverb label=tap_reverb control=,,,,,,,26
pacmd load-module module-ladspa-sink sink_name=DIN master=REVERB plugin=tap_dynamics_st label=tap_dynamics_st control=4,15,0,5,,13
pacmd load-module module-loopback latency_msec=1 sink=DIN
Tened en cuenta que el orden de los filtros importa. No es lo mismo ecualizar antes del compresor que después, por ejemplo.

Una vez hayamos terminado y queramos deshacer todo el entuerto acudimos de nuevo a la consola y usamos el comando pacmd unload-module seguido del número de identificación del módulo que queramos cerrar. Podemos ver todos los módulos cargados y sus números identificativos con el comando pacmd list-modules.
Y si lo que queremos es que se carguen cada vez que arranquemos el ordenador tendremos que añadir el listado de módulos con sus parámetros al archivo /etc/pulse/default.pa . Ojo con el orden, no sea que hagamos referencia a un módulo que creamos en líneas posteriores.

Otro ejemplo (puerta de ruido)

El filtro que usamos en el primer ejemplo incluye algunas funciones predefinidas de compresor y puerta de ruido, pero puede que no se ajusten a nuestra situación, especialmente en lo que al umbral de ruido se refiere. Si lo que nos interesa es un plugin de puerta de ruido que podamos ajustar al dedillo podemos usar el gate_1410 del paquete swh-plugins. Los parámetros de control en este caso son los siguientes: LF key filter, HF key filter, threshold, attack, hold, decay, range, output select.
Veamos un ejemplo:

pacmd load-module module-ladspa-sink sink_name=GATE master=MIX plugin=gate_1410 label=gate control=,,-35,7,10,170,-20,0
Una vez más, los parámetros que he empleado aquí son recomendaciones encontradas por la red. La clave es el valor de threshold o umbral, que es el que marca a partir de qué nivel de señal la puerta “se abre” y deja pasar el sonido. En principio lo mejor es bajarlo todo lo que se pueda (más negativo) mientras nos elimine el ruido de fondo. Hay que tener cuidado de que no nos recorte o atenúe nuestra propia voz.

Emitir voz y música por videoconferencia

En un artículo anterior explicamos cómo emitir música conjuntamente con nuestra voz en una videoconferencia. Para lograrlo tendremos que insertar nuestro filtro en aquel montaje.
Todo junto quedaría así:

pactl load-module module-null-sink sink_name=voip_out
pactl load-module module-ladspa-sink sink_name=din master=voip_out plugin=tap_dynamics_st label=tap_dynamics_st control=4,15,0,5,,13
pactl load-module module-loopback latency_msec=1 sink=din
pactl load-module module-null-sink sink_name=musica
pactl load-module module-loopback source=musica.monitor sink=voip_out
pactl load-module module-loopback source=musica.monitor
Aquí nos faltaría indicar en el mezclador que el reproductor de música envíe la señal a musica y el navegador o programa de videollamada reciba desde el monitor de voip_out.
Recordad que en el caso de usar Hangouts tendréis que poner en las opciones de videollamada el sonido en modo estudio. También conviene desactivar cualquier opción de control dinámico del micro que pueda tener el programa empleado, como en skype.

En la próxima guía entraremos de lleno en JACK, el servidor de sonido profesional de linux.



Enlaces de interés

Cap comentari:

Publica un comentari a l'entrada