
Como monitoro a entrada do microfone no Linux?
Obs: monitorar não é a mesma coisa que gravar e reproduzir o que foi gravado.
No Windows, posso ouvir meu próprio microfone das seguintes maneiras:
Com algum programa que irá capturar meu microfone e enviá-lo para minha placa de som para reprodução. Por exemplo, com
ffplay
o comandoffplay -f dshow -i audio="Front panel mic (Realtek High Definition Audio)"
Isso produzirá um atraso significativo, de até vários segundos.
Com a opção "Listen" das propriedades do dispositivo de entrada
Produzirá um atraso menor, de até um segundo.
Com widget de placa de som
Isso produzirá atraso ZERO. Eu acho que isso fará com que o som de entrada vá para a saída sem sair da placa de som, mas não tenho certeza.
Preciso da opção nº 2 na linha de comando do Linux.
Responder1
Você deve ser capaz de monitorar seu microfone com o PulseAudiomódulo de loopback. O módulo deve criar automaticamente saídas de loopback para dispositivos de entrada disponíveis. Para carregar o módulo manualmente
pactl load-module module-loopback
Para tornar a alteração persistente, anexe /etc/pulse/default.pa
com
load-module module-loopback
Responder2
Se você tiver entrada e saída analógica, recomendo usar apenas pavucontrol
(PulseAudio Volume Control) para rotear o áudio de entrada para a saída no mixer. No entanto, se você tiver, por exemplo, um microfone USB, o áudio não poderá ser apenas mixado, mas algum software deverá gravar o áudio e depois reproduzi-lo no fluxo de saída. E dependendo do seu hardware essa gravação + reprodução pode causar alguma (ou até alta) latência.
Você poderia tentar isso:
Primeiro obtenha os nomes das entradas e saídas que deseja usar:
$ pactl list short | egrep "alsa_(input|output)" | fgrep -v ".monitor"
para mim, os resultados são assim:
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
o que significa que meu dispositivo de saída é chamado alsa_output.pci-0000_00_1b.0.analog-stereo
e minha webcam/microfone USB é chamado alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono
.
Agora posso gravar o microfone USB e enviá-lo para a saída de áudio assim:
$ 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
Ou seja, um pacat
processo lê o microfone e solicita a pilha de áudio para tentar aumentar a latência para 1 ms ou 0,001 segundos. E outro pacat
processo grava o áudio no meu dispositivo de saída e tenta aumentar a latência para 2 ms ou 0,002 segundos. Você também pode tentar reduzir a latência de saída para 1 ms, mas pelo menos para meu hardware bastante antigo, o áudio é gravado com muita facilidade nesse caso.
No entanto, se eu mantiver essa combinação de gravação e reprodução em execução por longos períodos, parece que a latência aumenta lentamente com o tempo. Eu acho que o clock do meu microfone USB é um pouco mais rápido que o clock do áudio de saída, o que faz com que o buffer aumente lentamente. Não conheço uma maneira legal de permitir que esses processos pactl pulem o áudio para manter a saída em tempo real. Acho que precisaria escrever um aplicativo personalizado para isso.
Para o pacat ... | pacat
pipeline acima, a melhor latência para meu hardware parece ser de cerca de 6 ms, desde as ondas sonoras que atingem o microfone até as ondas sonoras emitidas pelos alto-falantes de saída ao usar o kernel Linux com PREEMPT habilitado (por exemplo, linux-lowlatency
kernel Ubuntu).