Como monitoro a entrada do microfone?

Como monitoro a entrada do microfone?

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:

  1. Com algum programa que irá capturar meu microfone e enviá-lo para minha placa de som para reprodução. Por exemplo, com ffplayo comando

    ffplay -f dshow -i audio="Front panel mic (Realtek High Definition Audio)"
    

    Isso produzirá um atraso significativo, de até vários segundos.

  2. Com a opção "Listen" das propriedades do dispositivo de entrada

    insira a descrição da imagem aqui

    Produzirá um atraso menor, de até um segundo.

  3. Com widget de placa de som

    insira a descrição da imagem aqui

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

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-stereoe 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 pacatprocesso lê o microfone e solicita a pilha de áudio para tentar aumentar a latência para 1 ms ou 0,001 segundos. E outro pacatprocesso 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 ... | pacatpipeline 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-lowlatencykernel Ubuntu).

informação relacionada