HSV is a Hubbub Suppression for Voice tool, written in pure C.
HSV - это библиотека шумоочистки/улучшения голоса в реальном времени, написанная без зависимостей на чистом C99 и легко встраиваемая в FFmpeg и MPV. Она является моей выпускной квалификационной работой с кафедры "Теоретической информатики и компьютерных технологий" МГТУ им Н. Э. Баумана.
Библиотека HSV предоставляет блочно-последовательную обработку звуковых данных через внутренний кольцевой буфер. Для детектирования шума используется алгоритм MCRA-2
Лойзю-Рангачари, для непосредственной шумоочистки могут быть использованы алгоритм спектрального вычитания Берути-Шварца или различные модификации алгоритма винеровской фильтрации Скалара. Для вычисления дискретного преобразования Фурье и обратного дискретного преобразования Фурье используются алгоритмы Кули-Тьюки и Блюштейна.
Для сборки и запуска библиотеки HSV необходимы С99
-совместимый компилятор, утилита Make и unix
-совместимая ОС.
Библиотека HSV может быть легко перенесена на C89, для этого необходимо лишь реализвовать некоторые библиотечные функции <math.h>, добавленные в стандарте C99
. Обратная совместимость обеспечивается объявлением всех переменных строго в начале блоков и использованием только "классических" типов данных.
Для сборки HSV и тестового примера необходимо выполнить следующую последовательность команд:
$ git clone https://github.com/masyagin1998/HSV.git
$ cd HSV
$ make
Чтобы не увеличивать и без того немалый объем кода алгоритмами работы с wav
, параметры входных и выходных wav
-файлов строго задаются в примере examples/example.c
.
Запуск тестового примера осуществляется следующим образом:
$ ./bin/example --wiener examples/in.wav examples/out.wav
где --wiener
- один из видов алгоритмов шумоподавления;
examples/in.wav
- входной wav
-файл;
examples/out.wav
- выходной wav
-файл;
На сегодяшний день FFmpeg
является одной из наиболее активно используемых библиотек для обработки аудио- и видеопотоков в реальном времени. На данный момент в ней отсутствуют методы для непосредственного подавления шума/улучшения голоса, поэтому было решено встроить в неё HSV.
Чтобы собрать FFmpeg
с поддержкой HSV необходимо выполнить следующие шаги:
- скачать зависимости для сборки
FFmpeg
:
$ sudo apt-get update -qq && sudo apt-get -y install autoconf automake build-essential cmake git-core \
$ libass-dev libfreetype6-dev libgnutls28-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev \
$ libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget yasm zlib1g-dev
- создать папки для сборки
FFmpeg
:
$ mkdir -p ~/ffmpeg_sources ~/bin
- скачать архив с исходным кодом
FFmpeg
и распаковать его:
$ cd ~/ffmpeg_sources
$ wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
$ tar xjvf ffmpeg-snapshot.tar.bz2
- применить патч
hsvden.patch
из папкиHSV/ffmpeg/patches
или добавить/заменить файлы исходного кодаFFmpeg
файлами изHSV/ffmpeg/src
:
$ cp -r HSV/ffmpeg/* ~/ffmpeg_sources
$ ./apply_patches.sh
- выполнить сборку "пропатченного"
FFmpeg
(возможно, Вам придётся отключитьgnutls
иlibaom
):
$ cd ffmpeg
$ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" \
$ --pkg-config-flags="--static" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
$ --extra-libs="-lpthread -lm" --bindir="$HOME/bin" --enable-gpl --enable-gnutls --enable-libaom --enable-libass \
$ --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-nonfree
$ PATH="$HOME/bin:$PATH" make -j8
$ make install -j8
- после этого в папке
~/bin
должна появиться сборкаFFmpeg
с поддержкой библиотекиHSV
. Для запускаFFmpeg
с одним из фильтровHSV
необходимо выполнить следующую команду:
$ ./bin/ffmpeg -i examples/in.wav -af "[aid1] hsvden=mode=tsnrg [ao]" examples/out.wav
где wiener
- один из видов алгоритмов шумоподавления;
examples/in.wav
- входной wav
-файл;
examples/out.wav
- выходной wav
-файл;
При использовании HSV в FFmpeg
можно задавать следующие флаги:
-
mode
(m
) - режим работы шумоподавления:specsub
- спектральное вычитание Берути-Шварца;wiener
- винеровская фильтрация Скалара;tsnr
- двухшаговая фильтрация Скалара;tsnrg
- двухшаговая фильтрация Скалара с "усилением";rtsnr
- двухщаговая фильтрация Шифенга;rtsnrg
- двухшаговая фильтрация Шифенга с "усилением";
-
frame
(f
) - размер одного обрабатываемого фрейма в сэмплах. Рекомендуются значения2.0 * sr / 100.0
или близкие к ним степени двойки; -
overlap
(o
) - величина перекрытия фреймов в процентах. Рекумендуются значения 50-75%; -
dft
(d
) - размер дискретного преобразования Фурье в сэмплах. Рекомендуется брать как удвоенный размер фрейма для увеличения частотного разрешения.; -
cap
(c
) - вместимость кольцевого буфера в байтах. Должна быть кратна 2 и достаточно велика для упреждения задержек;
Флаги задаются через :
, например:
$ ./bin/ffmpeg -i examples/in.wav -af "[aid1] hsvden=mode=tsnrg:o=50:cap=32768 [ao]" examples/out.wav
MPV
- это компактный свободный кроссплатформенный медиаплеер, основанный на MPlayer/mplayer2
. Он крайне активно используется и развивается с 2012 года по сей день. Встраивание HSV в MPV
является наглядной демонстрацией работы библиотеки шумоочистки в реальном времени, так как при воспроизведении аудио- или видеопотока HSV имеет доступ лишь к текущим фреймам звука и не должна вносить существенной задержки в воспроизведение.
Чтобы собрать MPV
с поддержкой HSV, необходимо выполнить следующие шаги:
- скачать официальный набор скриптов сборки
MPV
и выполнить сборку чистогоMPV
. Сборка автоматические подтянет все зависимости:
$ git clone https://github.com/mpv-player/mpv-build.git
$ cd mpv-build
$ ./rebuild -j8
- далее нужно очистить оригинальный
MPV
от результатов прошлой сборки и удалить скачанныйFFmpeg
:
$ cd mpv-build
$ ./clean
$ rm -rf ffmpeg
- затем аналогично пункту про встраивание в
FFmpeg
нужно скачать архив с кодомFFmpeg
, распаковать его и пропатчить, но не собирать (!!!). Далее пропатченный исходный кодFFmpeg
следует поместить в папкуmpv-build
:
$ mkdir -p ~/ffmpeg_sources
$ cd ~/ffmpeg_sources
$ wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
$ tar xjvf ffmpeg-snapshot.tar.bz2
$ cp -r HSV/ffmpeg/* ~/ffmpeg_sources
$ ./apply_patches.sh
cp -r ~/ffmpeg_sources/ffmpeg ~/mpv-build
- после этого необходимо заменить файл
rebuild
вmpv-build
на файл, лежащий в папкеHSV/mpv
. После этого выполнить пересборкуMPV
:
$ cp HSV/mpv/rebuild mpv-build/rebuild
$ cd mpv-build
$ ./rebuild -j8
- после этого в папке
~/mpv-build/mpv/build
должна появиться сборкаMPV
с поддержкой библиотекиHSV
. Для запускаMPV
с одним из фильтровHSV
необходимо выполнить следующую команду:
$ ./mpv-build/mpv/build/mpv examples/in.wav -af lavfi="[hsvden=m=rtsnr]"
где wiener
- один из видов алгоритмов шумоподавления;
examples/in.wav
- входной wav
-файл;
examples/out.wav
- выходной wav
-файл;
В целом использование HSV в MPV
совпадает с использованием HSV в FFmpeg
.
Все комментарии к библиотеке HSV совместимы с Doxygen. Чтобы сгенерировать и открыть документацию в формате HTML необходимо выполнить следующие шаги:
$ doxygen docs/doxygen.conf
$ firefox doxygen/html/index.html
Для проведения тестов эффективности как HSV, так и других алгоритмов шумоочистки, в папке scripts
имеются скрипты для вычисления ОСШ, сегментного ОСШ и PESQ.
Чем выше значения SNR
и PESQ
по сравнению с зашумленным сигналом, тем выше качество шумоочистки. Замечу, что повышение одной метрики зачастую не гарантирует повышение другой.
В папке data
можно найти примеры работы всех алгоритмов шумоочистки на мультишумовом примере. Также доступен архив с более чем 500 мегабайтами тестовых данных и сравнением разработанного алгоритма с WebRTC
и Speex
по данной ссылке. Эффективность шумоочистки может быть оценена скриптами для вычисления ОСШ
, сегментного ОСШ
и PESQ
из папки scripts
.
- Loizou P. C. Speech Enhancement. Theory and Practice. Second Edition // CRC Press, 2013 г. - лучшая книга, вводящая в теорию шумоочистки речевых сигналов;
- Cohen I., Berdugo B. Noise Estimation by Minima Controlled Recursive Averaging for Robust Speech Enhancement // Lamar Signal Processing Ltd., 2002 г. - оригинальный алгоритм детектирования шума MCRA;
- Scalart P., Filho J. V. Speech enhancement based on a priori SNR estimator // Acoustics, Speech and Signal Processing, 1996 г. - оригинальный алгоритм винеровской фильтрации, предложенный Скаларом;
- Scalart P., Plapous C. A two-step noise reduction technique // Acoustics, Speech and Signal Processing, 2004 г. - улучшенный вариант алгоритма винеровской фильтрации, также известный как
TSNR
; - Shifeng Ou, Chao G., Ying G. Improve a priori SNR estimator for speech enhancement incorporating speech distortion component // Yantai Univercity, 2013 г. - улучшенный вариант алгоритма винеровской фильтрации, также известный как
RTSNR
; - Тропченко А. Ю., Тропченко А. А. Цифровая обработка сигналов // ИТМО, 2009 г. - книга с хорошим описанием алгоритма БПФ Кули-Тьюки;
- Кренёв А. Н., Артёмова Т. К. Цифровой анализ сигналов // ЯГУ, 2003 г. - книга с хорошим описанием алгоритма БПФ Блюштейна;
- Fukane A. R., Shashikant L. S. Noise Estimation Algorithms for Speech Enhancement in highly non-stationary environments // 2011 г. - сравнительный анализ алгоритмов детектирвоания шума;
- Shrawankar U., Thakare V. M. Performance Analysis of Noise Filters and Speech Enhancement Techniques // 2012 г. - сравнительный анализ множества алгоритмов шумоочистки;
- Игорю Эдуардовичу Вишнякову и Олегу Александровичу Одинцову - моим научными руководителям;