nnnoiseless
is a rust crate for suppressing audio noise. It is a rust port of
the RNNoise
C library, and is based on a recurrent
neural network.
While nnnoiseless
is meant to be used as a library, a simple command-line
tool is provided as an example. It operates on WAV files or RAW PCM files.
Run
cargo install nnnoiseless
to install it (you might need to install rust first).
Once nnnoiseless
is installed, you can run it like
nnnoiseless input.wav output.wav
or, for more advanced usage, try
nnnoiseless --help
Except for the C API described below, nnnoiseless
is mostly written in safe
rust. It currently uses unsafe
in two places, to cast arrays of f32
s to
arrays of Complex<f32>
s with half the length; this delivers a small but
measurable performance improvement. If a future version of
RustFFT
has built-in support for
real-only FFTs, this unsafe code will be removed.
It is possible to install nnnoiseless
as a library usable from C
, with an
RNNoise
-compatible header.
$ cargo install cargo-c
$ mkdir staging-nnnoiseless
$ cargo cinstall --destdir staging-nnnoiseless
$ sudo cp -a staging-nnnoiseless/* /
nnnoiseless
is based on a neural network. There's one built in, but you can
also swap out the built-in network for your own. (This might be useful, for
example, if you have a particular kind of noise that you want to filter out and
nnnoiseless
's built-in network doesn't do a good enough job.)
Let's suppose that you've already trained (or downloaded from somewhere) your
neural network weights, and that they are in the file weights.rnn
. You can use
these weights for the nnnoiseless
binary by passing in the --model
option:
nnnoiseless --model=weights.rnn input.wav output.wav
On the other hand, if you're using nnnoiseless
as a library, you can load your
neural network weights using RnnModel::from_bytes
or RnnModel::from_static_bytes
.
Some people have already made their own neural network weights for RNNoise
(for example, here). These
weights can be used in nnnoiseless
also, but you'll need to first convert them
from the (text-based) RNNoise
format to the (binary) nnnoiseless
format. There
is a script in the train
directory that can do this for you: just run
python train/convert_rnnoise.py input_file.txt output_file.rnn
This is a little involved, but at least it's documented now. See train/README.md
for
more information.