Remoção de ruído em tempo real com o PulseAudio?

66

É possível remover o ruído em tempo real com o PulseAudio, para que a saída de som seja mais suave?

Vadim Peretokin
fonte
provavelmente é possível, embora seja intensivo e exigiria que alguém escrevesse um filtro para ele.
RolandiXor
2
@Vadi - Adicionei uma resposta que pode ajudá-lo se você ainda estiver usando o Ubuntu ou qualquer outra distro baseada no PulseAudio. Espero que funcione para você amigo.
Luis Alvarado
Esta pós parece estar fazendo algo semelhante
Akhmed

Respostas:

75

Módulo Pulseaudio module-echo-cancel

Comecei a ler muito sobre o PulseAudio e as opções "ocultas" que tinha para encontrar uma que fosse semelhante a essa pergunta. O que encontrei foi o módulo de cancelamento de ruído, que reduz drasticamente qualquer ruído estático no microfone e até MUITO ruído de fundo, basicamente oferecendo o benefício de gravar apenas sua própria voz com excelente qualidade (para gravação de áudio por exemplo). Para fazer isso, siga estas etapas:

  1. sudo nano /etc/pulse/default.pa

  2. Adicione a seguinte linha em qualquer lugar do arquivo, mas eu recomendo quase no final, onde você encontrará um comentário sobre o material de cancelamento de eco (~ linha 140):

    load-module module-echo-cancel
    
  3. Recarregue o PulseAudio ( pulseaudio -k) ou simplesmente reinicie o computador. Você deve poder selecionar a nova opção Cancelamento de ruído na seção Dispositivo de entrada:

    captura de tela

Você pode encontrar mais informações sobre isso na página Módulo de cancelamento de eco

Definir entrada como padrão

Se você deseja definir como padrão o dispositivo de cancelamento de eco, basta transformar a linha acima em:

load-module module-echo-cancel source_name=logitechsource

e depois na parte inferior do arquivo, adicione

set-default-source logitechsource

Nesse caso, nomeei a fonte logitechsource, mas você pode nomear o que quiser e simplesmente reiniciar o pulseaudio.

Renomear dispositivo

Por fim, se você não quiser um nome super longo nas Configurações de som (quando desejar selecionar um dispositivo de entrada / saída). Minha sugestão é renomear o dispositivo de entrada assim:

load-module module-echo-cancel source_name=logitechsource source_properties=device.description=LogitechHD

E, novamente, reiniciando o pulseaudio. O resultado final é assim:

captura de tela

Luis Alvarado
fonte
6
Fácil de fazer e não parece quebrar as coisas - obrigado!
Vadim Peretokin
2
Excelente solução, trabalhada pronta para uso, obrigado #
rancho
11
Isso reduziu a maior parte do ruído do ventilador do meu laptop e minhas gravações soam muito melhores!
PJ Brunet
11
Holy Moly - eu obtenho resultados surpreendentes mesmo com um microfone de lapela ruim de US $ 5 que recebi do eBay. Não é de qualidade de estúdio, mas está perfeitamente bem para chamadas VOIP agora.
Raymond Morgan
2
Se você quer evitar o módulo echo de ajustar o controle de volume automaticamente, você pode definir load-module module-echo-cancel aec_method=webrtc aec_args="analog_gain_control=0 digital_gain_control=1"como por gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/224
joelostblom
16

Essa é uma pergunta antiga, mas eu tive o mesmo problema e, depois de pesquisar no Google (onde encontrei pessoas que concordaram que isso não era possível) e ler algumas páginas de manual, desenvolvi uma solução baseada na idéia de user2330377.

Primeiro, você precisa criar um perfil de ruído para o SoX. Basta usar qualquer programa de gravação de áudio para gravar alguns segundos de ruído e depois cdno diretório em que você o salvou e faz sox noise.wav -n noiseprof noise.prof.

Então você precisa criar um dispositivo de loopback ALSA:

sudo modprobe snd_aloop

Isso é necessário porque o pulseaudio, ao contrário de Jack, não pode conectar diretamente o software de áudio; portanto, usaremos o dispositivo de loopback como proxy.

Agora você precisa iniciar pamane encontrar os nomes do microfone (ou de outro dispositivo de gravação) e do dispositivo de loopback que acabamos de criar. Uma vez encontrados, você pode executar o seguinte comando para começar a gravar o som do seu microfone, transmitindo-o pelo SoX e reproduzindo-o no dispositivo de loopback:

pacat -r -d alsa_input.pci-0000_00_14.2.analog-stereo --latency=1msec|sox -b 16 -e signed -c 2 -r 44100 -t raw - -b 16 -e signed -c 2 -r 44100 -t raw - noisered noise.prof 0.2|pacat -p -d alsa_output.2.analog-stereo --latency=1msec

(Onde você precisa substituir os nomes de dispositivos corretos pelos parâmetros -d - o dispositivo de entrada para a primeira chamada do pacat e a saída do dispositivo de loopback para a segunda).

Lá vai você, quase pronto! Como último passo, comece a gravar o som com o aplicativo de sua escolha e, em seguida, inicie pavucontrol, vá para a guia "Gravação" e defina o dispositivo de áudio usado para a gravação (exibido como o botão cinza à direita) como "Monitor de áudio de loopback" Dispositivo". Agora você deve ter uma gravação clara e sem ruídos!

cemper93
fonte
11
Este script simplifica o processo gist.github.com/tiagoengel/334573f7c3b98c27356297d6b1996336
Thomas
2

A investigação mostra que não há maneira conhecida de fazer filtragem de redução de ruído em tempo real com qualquer subsistema Linux. Alguns sites apontam para o hardware que você pode comprar, o que deve fazer o truque muito melhor do que fazer um filtro de software.

Como alternativa, se for para uma gravação, você pode passar o som pelo Audacity e usar o filtro de ruído.

Martin Owens -doctormo-
fonte
Pena, eu me pergunto por que não. Obrigado por investigar.
Vadim Peretokin
Certo! Não há informações na página de documentação do módulo sobre cancelamento de ruído. Existe apenas o algoritmo AEC (cancelamento de eco acústico) module-echo-cancel, que possui várias implementações, como webrtc | speex.
Vskubriev 14/02
1

Aqui está, pelo menos de uma maneira, implemente o webrtc-aec no

http://wiki.gentoo.org/wiki/PulseAudio

webrtc-aec Sim Usa a biblioteca de áudioProcessing webrtc.org para aprimorar bastante as chamadas VoIP em aplicativos que a suportam, executando cancelamento de eco acústico, controle de ganho analógico, supressão de ruído e outros processamentos.

Aqui está um artigo datado de 2013 sobre o assunto (remoção de ruído com o pulseaudio, não especificamente o webrtc-aec) http://lac.linuxaudio.org/2013/papers/37.pdf

"Apresentamos os primeiros resultados de uma solução de redução de ruído / eco multicanal construída sobre o PulseAudio e motivamos as decisões de projeto. O trabalho resultou em várias melhorias na estrutura de cancelamento de eco e processamento de sinais do PulseAudio, que foram contribuiu durante o ciclo de desenvolvimento da versão 3.0 / 4.0 e deve facilitar futuras soluções de áudio Linux embarcadas. O trabalho adicional inclui a otimização de código para mixagem de fluxo de áudio, métodos de reamostragem mais eficientes e a implementação de um AEC eficiente no pipeline de processamento multicanal ".

user2330377
fonte
O que eu tinha em mente para dar uma olhada rápida era retirar um perfil de ruído e remover o ruído em tempo real usando sox e reproduzir a saída de áudio que eu posso usar como fluxo de entrada no pulso. Acredito que o pulso é capaz de criar e redirecionar fluxos de entrada e saída dessa maneira. Ou seja, o fluxo de reprodução pode ser redirecionado como fluxo de entrada para outro aplicativo e o fluxo de reprodução é por aplicativo e não por dispositivo, portanto, não precisa ser roteado para o hardware do dispositivo.
user2330377
Estou tentando usar o pacmd para listar dispositivos pulseaudio, pacat para gravar e reproduzir a partir deles e sox para fazer os efeitos em tempo real no fluxo.
user2330377
Você estaria interessado em postar os scripts para ele?
Vadim Peretokin
0

Não há informações na página de documentação do módulo sobre cancelamento de ruído. Existe apenas o algoritmo AEC (Acoustic Echo Cancellation) dentro do module-echo-cancel, que possui várias implementações, como webrtc | speex.

Portanto, você deve comprar microfones de fone de ouvido com recurso de cancelamento de ruído integrado o máximo possível.

Ao testar a gravação de voz no ubuntu, encontrei algumas qualidades específicas:

  • O Skype, Telegram usa a entrada bruta do dispositivo padrão (no meu caso, as tomadas front-in-mic | backward-mic). Se você precisar cancelar um ruído nesses aplicativos, compre fones de ouvido | microfones apenas com o recurso integrado de cancelamento de ruído

  • Se você precisar usar chamadas de voz no navegador, lembre-se de que os navegadores possuem suas próprias implementações de algoritmos de processamento de voz, por exemplo, WebRTC.

  • Também aplicativos da Web (sites como talky, hangouts, appear.in etc.) podem ter suas próprias implementações de algoritmos de processamento de voz, apesar de poderem ser baseadas na análise de hangouts da webrtc

vskubriev
fonte