Um plugin de supressão de ruído em tempo real para voz baseado no RNNoise do Xiph. Mais informações sobre a biblioteca base.
O plugin destina-se a suprimir uma ampla gama de origens de ruído (do artigo original): ventiladores de computador, escritório, multidão, avião, carro, trem, construção.
Dos meus testes, o ruído de fundo suave é sempre suprimido, sons altos, como cliques de teclado mecânico, são suprimidos enquanto não há voz, porém seu volume só é reduzido quando a voz está presente.
Observe que este plugin não poderia melhorar a qualidade da voz com um microfone ruim, mas poderia até piorar as coisas ao classificar erroneamente a voz como um ruído, o que reduziria a qualidade de voz já não tão boa.
O plugin funciona com um ou mais canais, entrada de áudio de 16 bits e 48.000 Hz.
❗ ❗ ❗ NÃO use nenhuma outra taxa de amostragem, use SOMENTE 48.000 Hz, certifique-se de que sua fonte de áudio seja 48.000 Hz e force-a para 48.000 Hz se não for.
Existe uma GUI minimalista com todos os parâmetros e estatísticas de diagnóstico:
Últimos lançamentos
VAD Threshold (%)
- se a probabilidade do som ser uma voz for inferior a este limiar - será silenciado. Na maioria dos casos, o limite entre 85% e 95% seria adequado. Sem o VAD, alguns ruídos altos ainda podem ser um pouco audíveis quando não há voz.VAD Grace Period (ms)
- por quanto tempo após a última detecção de voz a saída não será silenciada. Isso ajuda quando o final das palavras/frases está sendo cortado.Retroactive VAD Grace Period (ms)
- semelhante ao VAD Grace Period (ms)
mas para início de palavras/frases.Para verificar ou alterar as configurações do microfone, vá em "Dispositivos de gravação" -> "Gravação" -> "Propriedades" do microfone alvo -> "Avançado".
Para habilitar o plugin no Equalizer APO selecione "Plugins" -> "VST Plugin" e especifique a dll do plugin.
Veja o guia detalhado fornecido por @bssankaran.
Desde a versão 0.3.45
o PipeWire usa configuração de arquivo dividido, tornando extremamente fácil configurar plug-ins e ajustar configurações.
Para versões mais antigas do PipeWire, você teria que copiar /usr/share/pipewire/pipewire.conf
para ~/.config/pipewire/pipewire.conf
e então anexar a configuração abaixo ao já existente context.modules
.
Para PipeWire >= 0.3.45
você deve:
~/.config/pipewire/pipewire.conf.d/
~/.config/pipewire/pipewire.conf.d/99-input-denoising.conf
context.modules = [
{ name = libpipewire-module-filter-chain
args = {
node.description = "Noise Canceling source"
media.name = "Noise Canceling source"
filter.graph = {
nodes = [
{
type = ladspa
name = rnnoise
plugin = /path/to/librnnoise_ladspa.so
label = noise_suppressor_mono
control = {
"VAD Threshold (%)" = 50.0
"VAD Grace Period (ms)" = 200
"Retroactive VAD Grace (ms)" = 0
}
}
]
}
capture.props = {
node.name = "capture.rnnoise_source"
node.passive = true
audio.rate = 48000
}
playback.props = {
node.name = "rnnoise_source"
media.class = Audio/Source
audio.rate = 48000
}
}
}
]
/path/to/librnnoise_ladspa.so
para o caminho real da bibliotecanoise_suppressor_mono
-> noise_suppressor_stereo
. Mesmo que o seu microfone diga que é estéreo - você provavelmente não precisa de saída estéreo. Também consumiria 2x recursos.VAD Threshold (%)
, ...systemctl restart --user pipewire.service
Noise Canceling source
como dispositivo de entradaPara mais informações consulte a documentação do PipeWire sobre Filter-Chains
Solução de problemas:
Soluções alternativas para configuração PipeWire/PulseAudio que também usam RNNoise:
TLDR: Use PipeWire... ou siga as instruções abaixo.
A ideia é:
sink_master
) e tem coletor de entrada (parâmetro sink_name
, o coletor será criado).source
) para o coletor de entrada do plugin ( sink
) com 1 canal.Por exemplo, para criar um novo dispositivo mono com áudio com redução de ruído do seu microfone, primeiro encontre o nome do seu microfone usando, por exemplo:
pactl list sources short
Em seguida, crie o novo dispositivo usando:
pacmd load-module module-null-sink sink_name=mic_denoised_out rate=48000
pacmd load-module module-ladspa-sink sink_name=mic_raw_in sink_master=mic_denoised_out label=noise_suppressor_mono plugin=/path/to/librnnoise_ladspa.so control=50,20,0,0,0
pacmd load-module module-loopback source= < your_mic_name > sink=mic_raw_in channels=1 source_dont_move=true sink_dont_move=true
Isso precisa ser executado sempre que o PulseAudio for iniciado. Você pode automatizar isso criando um arquivo em ~/.config/pulse/default.pa
com o conteúdo:
.include /etc/pulse/default.pa
load-module module-null-sink sink_name=mic_denoised_out rate=48000
load-module module-ladspa-sink sink_name=mic_raw_in sink_master=mic_denoised_out label=noise_suppressor_mono plugin=/path/to/librnnoise_ladspa.so control=50,200,0,0,0
load-module module-loopback source=your_mic_name sink=mic_raw_in channels=1 source_dont_move=true sink_dont_move=true
set-default-source mic_denoised_out.monitor
A ordem das configurações em control=50,200,0,0,0
é: VAD Threshold (%)
, VAD Grace Period (ms)
, Retroactive VAD Grace Period (ms)
, Placeholder1
, Placeholder2
.
Se você tiver certeza absoluta de que deseja uma entrada estéreo, use estas opções:
label=noise_suppressor_stereo
channels=2
Se você tiver problemas com estalos de áudio ou latência alta/aumentada periodicamente, adicionar latency_msec=1
ao loopback pode ajudar:
load-module module-loopback source=your_mic_name sink=mic_raw_in channels=1 source_dont_move=true sink_dont_move=true latency_msec=1
pacmd load-module module-remap-source source_name=denoised master=mic_denoised_out.monitor channels=1
Você ainda pode precisar definir a entrada correta para a aplicação, isso pode ser feito no painel do mixer de áudio (se você tiver um) na aba 'Gravação' onde você deve definir 'Monitor de Saída Nula' como fonte.
Leitura adicional:
TODO, contribuições são bem-vindas!
O plugin é testado com:
Não estou associado ao trabalho original do RNNoise e NÃO tenho nenhum conhecimento das redes neurais recorrentes nas quais ele se baseia.
As dependências externas são vendidas via git-subrepo. Para que não haja necessidade de usar submódulos, e corrigir subrepos é fácil (no momento temos vários patches para JUCE).
Melhorias são bem-vindas! Porém, se você quiser contribuir com algo considerável, abra um problema primeiro.
Compilando para x64:
cmake -Bbuild-x64 -H. -GNinja -DCMAKE_BUILD_TYPE=Release
ninja -C build-x64
Compilando para x32:
cmake -D CMAKE_CXX_FLAGS=-m32 -D CMAKE_C_FLAGS=-m32 -Bbuild-x32 -H. -GNinja -DCMAKE_BUILD_TYPE=Release
ninja -C build-x32
Compilação cruzada para Windows x64 (compilações MinGW estão falhando no momento devido a certas incompatibilidades no JUCE):
cmake -Bbuild-mingw64 -H. -GNinja -DCMAKE_TOOLCHAIN_FILE=toolchains/toolchain-mingw64.cmake -DCMAKE_BUILD_TYPE=Release
ninja -C build-mingw64
Por padrão, todos os plugins suportados por uma plataforma estão sendo construídos. Você pode desativar plug-ins deliberadamente com os seguintes sinalizadores do CMake:
BUILD_LADSPA_PLUGIN
BUILD_VST_PLUGIN
BUILD_VST3_PLUGIN
BUILD_LV2_PLUGIN
BUILD_AU_PLUGIN
(somente macOS)BUILD_AUV3_PLUGIN
(somente macOS)Por exemplo:
cmake -DBUILD_VST_PLUGIN=OFF -DBUILD_LV2_PLUGIN=OFF
Este projeto está licenciado sob a Licença Pública Geral GNU v3.0 - consulte o arquivo LICENSE para obter detalhes.
Bibliotecas usadas: