dbklim / RNNoise_Wrapper

A simple Python wrapper for audio noise reduction RNNoise. Simplifies work with it, adds new trained models and detailed instructions for training.
Apache License 2.0
138 stars 39 forks source link
audio audio-processing denoise denoiser denoising dsp ml nlp noise noise-algorithms noise-reduction noise-suppression python-wrapper rnn rnnoise rnnoise-training rnnoise-wrapper rtc wav

RNNoise Wrapper

Это простая обёртка на Python для шумоподавления RNNoise. Поддерживается только Python 3. Код основан на issue от snakers4 из репозитория RNNoise, за что ему отдельное спасибо.

RNNoise - это рекуррентная нейронная сеть с ячейками GRU, предназначенная для подаления шума в аудиозаписи в реальном времени (работает даже на Raspberry Pi). Стандартная модель обучена на 6.4Гб зашумленных аудиозаписей и полностью готова к использованию.

RNNoise написан на C и имеет методы для шумоподавления одного фрейма длиной 10 миллисекунд. Фрейм должен быть с частотой дискретизации 48000Гц, моно, 16 бит.

RNNoise_Wrapper упрощает работу с RNNoise:

RNNoise_Wrapper содержит 2 новые более качественные модели (обученные веса и скомпилированные бинарники RNNoise для Linux). Для обучения использовался датасет от Microsoft DNS Challenge.

  1. librnnoise_5h_ru_500k — обучена на 5 часах русской речи (с подмешиванием эмоциональной речи и пения на английском языке), полученной скриптом из репозитория с датасетом. Обученные веса находятся в train_logs/weights_5h_ru_500k.hdf5, скомпилированный RNNoise в rnnoise_wrapper/libs/librnnoise_5h_ru_500k.so.0.4.1 (только для Linux)

  2. librnnoise_5h_b_500k — обучена на 5 часах смешанной речи на английском, русском, немецком, французском, итальянском, испанском языках и мандаринского наречия китайского языка (с подмешиванием эмоциональной речи и пения на английском языке). Датасет для каждого языка предварительно был обрезан по самому наименьшему из них (меньше всего данных для русского языка, около 47 часов). Финальная обучающая выборка получена скриптом из репозитория с датасетом. Обученные веса находятся в train_logs/weights_5h_b_500k.hdf5, скомпилированный RNNoise в rnnoise_wrapper/libs/librnnoise_5h_b_500k.so.0.4.1 (только для Linux)

  3. librnnoise_default — стандартная модель от авторов RNNoise

Модели librnnoise_5h_ru_500k и librnnoise_5h_b_500k имеют практически одинаковое качество шумоподавления. librnnoise_5h_ru_500k больше всего подходит для работы с русской речью, а librnnoise_5h_b_500kдля смешанной речи либо речи на не русском языке, она более универсальна.

Сравнительные примеры работы новых моделей со стандартной доступны в test_audio/comparative_tests.

Данная обёртка на CPU Intel i7-10510U работает в 28-30 раз быстрее реального времени при шумоподавлении целой аудиозаписи, и в 18-20 раз быстрее реального времени при работе в потоковом режиме (т.е. обработки фрагментов аудио длиной 20 мс). При этом было задействовано только 1 ядро, нагрузка на которое составила около 80-100%.

Установка

Данная обёртка имеет следующие зависимости: pydub и numpy.

Установка с помощью pip:

pip install git+https://github.com/Desklop/RNNoise_Wrapper

ВНИМАНИЕ! Перед использованием обёртки, RNNoise необходимо скомпилировать. Если вы используете Linux или Mac, вы можете использовать заранее скомпилированный RNNoise (в ОС Ubuntu 19.10 64 bit), который поставляется с пакетом (он так же работает в Google Colaboratory). Если стандартный бинарный файл у вас не работает, попробуйте вручную скомпилировать RNNoise. Для этого необходимо сначала подготовить вашу ОС (предполагается, что gcc уже установлен):

sudo apt-get install autoconf libtool

И выполнить:

git clone https://github.com/Desklop/RNNoise_Wrapper
cd RNNoise_Wrapper
./compile_rnnoise.sh

После этого в папке rnnoise_wrapper/libs появится файл librnnoise_default.so.0.4.1. Путь к данному бинарному файлу нужно передать при создании объекта класса RNNoise из данной обёртки (подробнее см. ниже).

Если вы используете Windows, то вам нужно вручную скомпилировать RNNoise. Вышеописанная инструкция не будет работать, воспользуйтесь данными ссылками: один, два. После компиляции путь к бинарному файлу нужно передать при создании объекта класса RNNoise из данной обёртки (подробнее см. ниже).

Использование

1. В коде Python

Подавление шума в аудиозаписи test.wav и сохранение результата как test_denoised.wav:

from rnnoise_wrapper import RNNoise

denoiser = RNNoise()

audio = denoiser.read_wav('test.wav')
denoised_audio = denoiser.filter(audio)
denoiser.write_wav('test_denoised.wav', denoised_audio)

Подавление шума в потоковом аудио (размер буфера равен 20 миллисекунд, т.е. 2 фрейма) (в примере используется имитация потока путём обработки аудиозаписи test.wav по частям с сохранением результата как test_denoised_stream.wav):

audio = denoiser.read_wav('test.wav')

denoised_audio = b''
buffer_size_ms = 20

for i in range(buffer_size_ms, len(audio), buffer_size_ms):
    denoised_audio += denoiser.filter(audio[i-buffer_size_ms:i].raw_data, sample_rate=audio.frame_rate)
if len(audio) % buffer_size_ms != 0:
    denoised_audio += denoiser.filter(audio[len(audio)-(len(audio)%buffer_size_ms):].raw_data, sample_rate=audio.frame_rate)

denoiser.write_wav('test_denoised_stream.wav', denoised_audio, sample_rate=audio.frame_rate)

Больше примеров работы с обёрткой можно найти в rnnoise_wrapper_functional_tests.py и rnnoise_wrapper_comparative_test.py.

Класс RNNoise содержит следующие методы:

Подробная информация о поддерживаемых аргументах и работе каждого метода находится в комментариях в исходном коде этих методов.

По умолчанию используется модель librnnoise_5h_b_500k. При создании объекта класса RNNoise из обёртки с помощью аргумента f_name_lib можно указать другую модель (бинарник RNNoise):

denoiser_def = RNNoise(f_name_lib='librnnoise_5h_ru_500k')
denoiser_new = RNNoise(f_name_lib='path/to/librnnoise.so.0.4.1')

Особенности основного метода filter():

2. В качестве инструмента командной строки

python3 -m rnnoise_wrapper.cli -i input.wav -o output.wav

или

rnnoise_wrapper -i input.wav -o output.wav

Где:

Обучение

Инструкция по обучению RNNoise на своих данных находится в TRAINING.md.


Если у вас возникнут вопросы или вы хотите сотрудничать, можете написать мне на почту: vladsklim@gmail.com или в LinkedIn.