[vlc-devel] [PATCH 2/2] audio_filter: add RNNoise denoiser filter

Marvin Scholz epirat07 at gmail.com
Fri Jul 26 15:02:42 CEST 2019



On 26 Jul 2019, at 14:45, Tristan Matthews wrote:

> On Fri, Jul 26, 2019 at 3:03 AM Marvin Scholz <epirat07 at gmail.com> 
> wrote:
>>
>> On 26 Jul 2019, at 7:19, Tristan Matthews wrote:
>>
>>> ---
>>>  NEWS                             |   3 +
>>>  configure.ac                     |  15 +++++
>>>  modules/audio_filter/Makefile.am |   7 ++
>>>  modules/audio_filter/rnnoise.c   | 109
>>> +++++++++++++++++++++++++++++++
>>>  po/POTFILES.in                   |   1 +
>>>  5 files changed, 135 insertions(+)
>>>  create mode 100644 modules/audio_filter/rnnoise.c
>>>
>>> diff --git a/NEWS b/NEWS
>>> index 0f4f6d74c0..e364df7abe 100644
>>> --- a/NEWS
>>> +++ b/NEWS
>>> @@ -71,6 +71,9 @@ Video output:
>>>   * Remove RealRTSP plugin
>>>   * Remove Real demuxer plugin
>>>
>>> +Audio filter:
>>> + * Add RNNoise recurrent neural network denoiser
>>> +
>>>  Video filter:
>>>   * Update yadif
>>>   * Remove remote OSD plugin
>>> diff --git a/configure.ac b/configure.ac
>>> index ac818d8b83..c0f1f09dcb 100644
>>> --- a/configure.ac
>>> +++ b/configure.ac
>>> @@ -2901,6 +2901,21 @@ AS_IF([test "${enable_speex}" != "no"], [
>>>  ])
>>>  AM_CONDITIONAL([HAVE_SPEEXDSP], [test "$have_speexdsp" = "yes"])
>>>
>>> +AC_ARG_ENABLE([rnnoise],
>>> +  AS_HELP_STRING([--enable-rnnoise],
>>> +    [RNNoise denoiser filter (default auto)]))
>>> +have_rnnoise="no"
>>> +AS_IF([test "${enable_rnnoise}" != "no"], [
>>> +  PKG_CHECK_MODULES([RNNOISE], [rnnoise], [
>>> +    have_rnnoise="yes"
>>> +  ], [
>>> +    AS_IF([test "x${enable_rnnoise}" != "x"], [
>>> +      AC_MSG_ERROR([$RNNOISE_PKG_ERRORS.])
>>> +    ])
>>> +  ])
>>> +])
>>> +AM_CONDITIONAL([HAVE_RNNOISE], [test "${have_rnnoise}" = "yes"])
>>
>> Can't you use
>>
>> PKG_ENABLE_MODULES_VLC(VARIABLE-PREFIX,
>>                           VLC_MODULE_NAME  dnl (if empty, same as
>> VARIABLE-PREFIX)
>>                           PKG MODULES,
>>                           [DESCRIPTION], [DEFAULT],
>>                           [EXTRA_CFLAGS], [EXTRA_LIBS], 
>> [EXTRA_CPPFLAGS]
>>
>> here, i.e.:
>>
>> PKG_ENABLE_MODULES_VLC([RNNOISE], [], [RNNoise denoiser filter], 
>> [auto])
>
> I had tried something like this initially but the plugin was being
> built unconditionally.
>

You maybe forgot to adjust the Makefile.am too, like this:

librnnoise_plugin_la_SOURCES = audio_filter/rnnoise.c
librnnoise_plugin_la_CFLAGS = $(AM_CFLAGS) $(RNNOISE_CFLAGS)
librnnoise_plugin_la_LIBADD = $(RNNOISE_LIBS) $(LIBM)

audio_filter_LTLIBRARIES += $(LTLIBrnnoise)
EXTRA_LTLIBRARIES += librnnoise_plugin.la


>>
>>> +
>>>  dnl
>>>  dnl  Opus plugin
>>>  dnl
>>> diff --git a/modules/audio_filter/Makefile.am
>>> b/modules/audio_filter/Makefile.am
>>> index 309074c75b..a73ec822d1 100644
>>> --- a/modules/audio_filter/Makefile.am
>>> +++ b/modules/audio_filter/Makefile.am
>>> @@ -137,3 +137,10 @@ libspeex_resampler_plugin_la_LIBADD =
>>> $(SPEEXDSP_LIBS)
>>>  if HAVE_SPEEXDSP
>>>  audio_filter_LTLIBRARIES += libspeex_resampler_plugin.la
>>>  endif
>>> +
>>> +librnnoise_plugin_la_SOURCES = audio_filter/rnnoise.c
>>> +librnnoise_plugin_la_CFLAGS = $(AM_CFLAGS) $(RNNOISE_CFLAGS)
>>> +librnnoise_plugin_la_LIBADD = $(RNNOISE_LIBS) $(LIBM)
>>> +if HAVE_RNNOISE
>>> +audio_filter_LTLIBRARIES += librnnoise_plugin.la
>>> +endif
>>> diff --git a/modules/audio_filter/rnnoise.c
>>> b/modules/audio_filter/rnnoise.c
>>> new file mode 100644
>>> index 0000000000..ddf18870e7
>>> --- /dev/null
>>> +++ b/modules/audio_filter/rnnoise.c
>>> @@ -0,0 +1,109 @@
>>> +/*****************************************************************************
>>> + * rnnoise.c : Recurrent neural network for audio noise reduction
>>> +
>>> *****************************************************************************
>>> + * Copyright © 2019 Tristan Matthews
>>> + *
>>> + * This program is free software; you can redistribute it and/or
>>> modify it
>>> + * under the terms of the GNU Lesser General Public License as
>>> published by
>>> + * the Free Software Foundation; either version 2.1 of the License,
>>> or
>>> + * (at your option) any later version.
>>> + *
>>> + * This program is distributed in the hope that it will be useful,
>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>>> + * GNU Lesser General Public License for more details.
>>> + *
>>> + * You should have received a copy of the GNU Lesser General Public
>>> License
>>> + * along with this program; if not, write to the Free Software
>>> Foundation,
>>> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, 
>>> USA.
>>> +
>>> *****************************************************************************/
>>> +
>>> +#ifdef HAVE_CONFIG_H
>>> +# include "config.h"
>>> +#endif
>>> +
>>> +#include <vlc_common.h>
>>> +#include <vlc_aout.h>
>>> +#include <vlc_filter.h>
>>> +#include <vlc_plugin.h>
>>> +
>>> +#include <rnnoise.h>
>>> +
>>> +static int Open (vlc_object_t *);
>>> +static void Close (vlc_object_t *);
>>> +
>>> +typedef struct
>>> +{
>>> +    DenoiseState *p_st;
>>> +    bool b_first;
>>> +} filter_sys_t;
>>> +
>>> +vlc_module_begin ()
>>> +    set_shortname (N_("RNNoise"))
>>> +    set_description (N_("RNNoise filter"))
>>> +    set_category (CAT_AUDIO)
>>> +    set_subcategory (SUBCAT_AUDIO_AFILTER)
>>> +    set_capability ("audio filter", 0)
>>> +    set_callbacks( Open, Close )
>>> +vlc_module_end ()
>>> +
>>> +static block_t *Process (filter_t *, block_t *);
>>> +
>>> +static int Open (vlc_object_t *obj)
>>> +{
>>> +    filter_t *p_filter = (filter_t *)obj;
>>> +
>>> +    filter_sys_t *p_sys = p_filter->p_sys = malloc(
>>> sizeof(filter_sys_t) );
>>> +    if( unlikely(!p_sys) )
>>> +        return VLC_ENOMEM;
>>> +
>>> +    p_sys->b_first = true;
>>> +
>>> +    p_sys->p_st = rnnoise_create(NULL);
>>> +    if( unlikely(!p_sys->p_st) ) {
>>> +        free( p_sys );
>>> +        return VLC_ENOMEM;
>>> +    }
>>> +
>>> +    p_filter->fmt_in.audio.i_format = VLC_CODEC_FL32;
>>> +    aout_FormatPrepare(&p_filter->fmt_in.audio);
>>> +    p_filter->fmt_out.audio = p_filter->fmt_in.audio;
>>> +    p_filter->pf_audio_filter = Process;
>>> +    return VLC_SUCCESS;
>>> +}
>>> +
>>> +static void Close( vlc_object_t *obj )
>>> +{
>>> +    filter_t *p_filter  = (filter_t *)obj;
>>> +    filter_sys_t *p_sys = p_filter->p_sys;
>>> +    if( p_sys->p_st )
>>> +        rnnoise_destroy( p_sys->p_st );
>>> +    free( p_sys );
>>> +}
>>> +
>>> +#define FRAME_SIZE 480
>>> +
>>> +static block_t *Process (filter_t *p_filter, block_t *p_block)
>>> +{
>>> +    filter_sys_t *p_sys = p_filter->p_sys;
>>> +    float tmp[FRAME_SIZE];
>>> +    float *p_buffer = (float *)p_block->p_buffer;
>>> +    for ( int i_nb_samples = p_block->i_nb_samples; i_nb_samples > 
>>> 0;
>>> i_nb_samples -= FRAME_SIZE )
>>> +    {
>>> +        /* rnnoise process blocks of 480 samples, and expects input
>>> to be in the 32768 scale. */
>>> +        for (unsigned i = 0; i < FRAME_SIZE; i++) tmp[i] =
>>> p_buffer[i] * 32768;
>>> +
>>> +        rnnoise_process_frame(p_sys->p_st, tmp, tmp);
>>> +
>>> +        if( !p_sys->b_first )
>>> +        {
>>> +            for (unsigned i = 0; i < FRAME_SIZE; i++) p_buffer[i] =
>>> tmp[i] / 32768.;
>>> +        }
>>> +        else
>>> +        {
>>> +            p_sys->b_first = false;
>>> +        }
>>> +        p_buffer += FRAME_SIZE;
>>> +    }
>>> +    return p_block;
>>> +}
>>> diff --git a/po/POTFILES.in b/po/POTFILES.in
>>> index 1c2a5298a8..49b89067f4 100644
>>> --- a/po/POTFILES.in
>>> +++ b/po/POTFILES.in
>>> @@ -245,6 +245,7 @@ modules/audio_filter/resampler/soxr.c
>>>  modules/audio_filter/resampler/speex.c
>>>  modules/audio_filter/resampler/src.c
>>>  modules/audio_filter/resampler/ugly.c
>>> +modules/audio_filter/rnnoise.c
>>>  modules/audio_filter/scaletempo.c
>>>  modules/audio_filter/spatializer/spatializer.cpp
>>>  modules/audio_filter/stereo_widen.c
>>> --
>>> 2.20.1
>>>
>>> _______________________________________________
>>> vlc-devel mailing list
>>> To unsubscribe or modify your subscription options:
>>> https://mailman.videolan.org/listinfo/vlc-devel
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list