
¿Cómo superviso la entrada del micrófono en Linux?
Nota: monitorear no es lo mismo que grabar y reproducir lo grabado.
En Windows, puedo escuchar mi propio micrófono de las siguientes maneras:
Con algún programa que capture mi micrófono y lo envíe a mi tarjeta de sonido para reproducirlo. Por ejemplo, con
ffplay
el comandoffplay -f dshow -i audio="Front panel mic (Realtek High Definition Audio)"
Producirá un retraso significativo, de hasta varios segundos.
Con la opción "Escuchar" de las propiedades del dispositivo de entrada
Producirá un retraso menor, hasta un segundo.
Con widget de tarjeta de sonido
Producirá CERO retraso. Creo que esto hará que el sonido de entrada pase a la salida sin salir de la tarjeta de sonido, pero no estoy seguro.
Necesito la opción n.° 2 en la línea de comando de Linux.
Respuesta1
Deberías poder monitorear tu micrófono con PulseAudiomódulo de bucle invertido. El módulo debería crear automáticamente salidas de bucle invertido para los dispositivos de entrada disponibles. Para cargar el módulo manualmente
pactl load-module module-loopback
Para que el cambio sea persistente, agregue /etc/pulse/default.pa
con
load-module module-loopback
Respuesta2
Si tiene entrada y salida analógicas, le recomendaría simplemente usar pavucontrol
(Control de volumen PulseAudio) para enrutar el audio de entrada a la salida en el mezclador. Sin embargo, si tiene, por ejemplo, un micrófono USB, el audio no se puede simplemente mezclar, sino que algún software debe grabar el audio y luego reproducirlo para generar un flujo de salida. Y dependiendo de su hardware, esta grabación y reproducción puede causar cierta (o incluso alta) latencia.
Podrías probar esto:
Primero obtenga los nombres de las entradas y salidas que desea utilizar:
$ pactl list short | egrep "alsa_(input|output)" | fgrep -v ".monitor"
Para mí, los resultados se ven así:
0 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
0 alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono module-alsa-card.c s16le 1ch 44100Hz SUSPENDED
lo que significa que se llama a mi dispositivo de salida alsa_output.pci-0000_00_1b.0.analog-stereo
y se llama a mi cámara web/micrófono USB alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono
.
Ahora puedo grabar el micrófono USB y enviarlo a la salida de audio de esta manera:
$ pacat -r --latency-msec=1 -d alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono | pacat -p --latency-msec=2 -d alsa_output.pci-0000_00_1b.0.analog-stereo
Es decir, un pacat
proceso lee desde el micrófono y solicita la pila de audio para intentar llevar la latencia a 1 ms o 0,001 segundos. Y otro pacat
proceso escribe el audio en mi dispositivo de salida e intenta llevar la latencia a 2 ms o 0,002 segundos. También puedes intentar reducir la latencia de salida a 1 ms, pero al menos para mi hardware bastante antiguo, el audio se corta con demasiada facilidad en ese caso.
Sin embargo, si mantengo esta combinación de salida de grabación y reproducción ejecutándose durante períodos prolongados, parece que la latencia aumenta lentamente con el tiempo. Supongo que el reloj de mi micrófono USB es ligeramente más rápido que el reloj de mi audio de salida, lo que hace que el búfer aumente lentamente. No conozco una buena manera de permitir que esos procesos pactl omitan el audio para mantener la salida en tiempo real. Supongo que necesitaría escribir una aplicación personalizada para eso.
Para el pacat ... | pacat
canal anterior, la latencia en el mejor de los casos para mi hardware parece ser de alrededor de 6 ms desde las ondas de sonido que golpean el micrófono hasta las ondas de sonido que se emiten desde los parlantes de salida mientras uso el kernel de Linux con PREEMPT habilitado (por ejemplo, linux-lowlatency
kernel de Ubuntu).