werman / noise-suppression-for-voice

Noise suppression plugin based on Xiph's RNNoise
GNU General Public License v3.0
4.86k stars 230 forks source link
au-plugin auv3-plugin ladspa lv2-plugin noise-cancellation voice vst-plugin vst2 vst3-plugin

Real-time Noise Suppression Plugin

VST2, VST3, LV2, LADSPA, AU, AUv3

[![Licence][licence]][licence-url] [![Latest][version]][version-url]

A real-time noise suppression plugin for voice based on Xiph's RNNoise. More info about the base library.

The plugin is meant to suppress a wide range of noise origins (from original paper): computer fans, office, crowd, airplane, car, train, construction.

From my tests mild background noise is always suppressed, loud sounds, like clicking of mechanical keyboard, are suppressed while there is no voice however they are only reduced in volume when voice is present.

Please note that this plugin could not improve the voice quality with bad microphone, it even could make things worse by misclassifying the voice as a noise which would reduce already not-so-good voice quality.

The plugin works with one or more channels, 16 bit, 48000 Hz audio input.

:exclamation: :exclamation: :exclamation: Do NOT use any other sample rates, use ONLY 48000 Hz, make sure your audio source is 48000 Hz and force it to be 48000 Hz if it is not.

There is a minimalistic GUI with all parameters and diagnostic stats:

GUI of the plugin

Releases

Latest releases

How-to

Plugin Settings

Windows + Equalizer APO (VST2)

To check or change mic settings go to "Recording devices" -> "Recording" -> "Properties" of the target mic -> "Advanced".

To enable the plugin in Equalizer APO select "Plugins" -> "VST Plugin" and specify the plugin dll.

See detailed guide provided by @bssankaran.

Linux

PipeWire

Since version 0.3.45 PipeWire uses Split-File Configuration, making it extremely easy to set up plugins and tweak configuration.

For older PipeWire version you'd have to copy /usr/share/pipewire/pipewire.conf into ~/.config/pipewire/pipewire.conf and then append the configuration below to already existing context.modules.

For PipeWire >= 0.3.45 you should:

For more information consult PipeWire documentation on Filter-Chains

Troubleshooting:

Alternative solutions for PipeWire/PulseAudio configuration which also use RNNoise:

PulseAudio

TLDR: Use PipeWire... or follow the instructions below.

Instructions (click me) The idea is: - Create a sink from which apps will take audio later and which will be the end sink in the chain. - Load the plugin which outputs to already created sink (`sink_master` parameter) and has input sink (`sink_name` parameter, sink will be created). - Create loopback from microphone (`source`) to input sink of plugin (`sink`) with 1 channel. For example, to create a new mono device with noise-reduced audio from your microphone, first, find your mic name using e.g.: ```sh pactl list sources short ``` Then, create the new device using: ```sh 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= sink=mic_raw_in channels=1 source_dont_move=true sink_dont_move=true ``` This needs to be executed every time PulseAudio is launched. You can automate this by creating file in `~/.config/pulse/default.pa` with the content: ``` .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 ``` The order of settings in `control=50,200,0,0,0` is: `VAD Threshold (%)`, `VAD Grace Period (ms)`, `Retroactive VAD Grace Period (ms)`, `Placeholder1`, `Placeholder2`. If you are absolutely sure that you want a stereo input use these options instead: - `label=noise_suppressor_stereo` - `channels=2` If you have problems with audio crackling or high / periodically increasing latency, adding `latency_msec=1` to the loopback might help: ``` 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 ``` :warning: Chrome and other Chromium based browsers will ignore monitor devices and you will not be able to select the "Monitor of Null Output". To work around this, either use pavucontrol to assign the input to Chrome, or remap this device in PulseAudio to create a regular source: ```sh pacmd load-module module-remap-source source_name=denoised master=mic_denoised_out.monitor channels=1 ``` You may still need to set correct input for application, this can be done in audio mixer panel (if you have one) in 'Recording' tab where you should set 'Monitor of Null Output' as source. Further reading: - Useful detailed info about PulseAudio logic [toadjaune/pulseaudio-config](https://github.com/toadjaune/pulseaudio-config). - The [thread](https://bugs.freedesktop.org/show_bug.cgi?id=101043) which helped me with how to post-process mic output and make it available to applications.

MacOS

TODO, contributions are welcomed!

Status

The plugin is tested with:

I'm not associated with the original RNNoise work and do NOT have any understanding of recurrent neural networks it is based upon.

Contributing

External dependencies are vendored via git-subrepo. So that there is no need to use submodules, and patching subrepos is easy (at the moment we have several patches for JUCE).

Improvements are welcomed! Though if you want to contribute anything sizeable - open an issue first.

Compiling

Compiling for x64:

cmake -Bbuild-x64 -H. -GNinja -DCMAKE_BUILD_TYPE=Release
ninja -C build-x64

Compiling for x32:

cmake -D CMAKE_CXX_FLAGS=-m32 -D CMAKE_C_FLAGS=-m32 -Bbuild-x32 -H. -GNinja -DCMAKE_BUILD_TYPE=Release
ninja -C build-x32

Cross-compiling for Windows x64 (MinGW builds are failing at the moment due to certain incompatibilities in JUCE):

cmake -Bbuild-mingw64 -H. -GNinja -DCMAKE_TOOLCHAIN_FILE=toolchains/toolchain-mingw64.cmake -DCMAKE_BUILD_TYPE=Release
ninja -C build-mingw64

Compiling only selected plugins

By default, all plugins supported for a platform are being built. You can deliberately turn off plugins with the following CMake flags:

For example:

cmake -DBUILD_VST_PLUGIN=OFF -DBUILD_LV2_PLUGIN=OFF

License

This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.

Used libraries: