aubio
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: silence detection
- To: aubio@piem.org
- Subject: Re: silence detection
- From: Paul Brossier <piem@altern.org>
- Date: Mon, 31 Oct 2005 03:47:58 +0000
- Cc: dankajh <dankajh@gmail.com>
- In-reply-to: <1130664028.6834.1.camel@lido.localdomain>
- References: <1130664028.6834.1.camel@lido.localdomain>
- User-agent: Mutt/1.5.11
Hi dankajh, hi all On Sun, Oct 30, 2005 at 10:20:28AM +0100, dankajh wrote: > I don't know too much about sound, but I was looking for a tool (for > linux and GPL :) to detect silence for weeks, and all the times I turn > back to aubio. > I was looking for documentation or examples to detect silence from a > sound file or from real time (from /dev/audio or /dev/dsp) inside aubio, > but I haven't found anything. such a tool doesn't exist as is yet (and aubio isn't much documented yet). aubiocut can slice at silences, but that's not really enough. > I'm sure it haven't to be so complicated, but I have't found the way I > should exec the command aubiox. well, here's aubioquiet.c, carved into aubioonset.c (see attachment). aubioquiet should print "NOISY: <timestamp>" when a change from silence to non-silence is detected, and "QUIET: <timestamp>" when a change from non-silence to silence is found. i guess this is the kind of output you are looking for. for real time, well aubioquiet works too, but nothing is printed on the console. not sure what kind of output you would need. a midi output would probably be good to have. > I would be very gratheful if somebody could help my. > Thanks in advance. the patch can be applied on a freshly untarred 0.2.0 tarball with: $ cd /path/to/aubio-0.2.0 $ patch -p1 < /path/to/aubioquiet-patch.diff $ ./configure --enable-maintainer-mode && make clean all you can change the silence threshold with the -s option (value is in dB, default is -90). let us know how it works for you. it looks to me like a useful thing to have, and aubioquiet should probably be in the next version. cheers, piem
--- orig/examples/Makefile.am +++ mod/examples/Makefile.am @@ -11,6 +11,7 @@ bin_PROGRAMS = \ aubioonset \ aubiotrack \ + aubioquiet \ aubionotes EXTRA_DIST = utils.h @@ -19,7 +20,9 @@ aubioonset_SOURCES = aubioonset.c utils.c aubionotes_SOURCES = aubionotes.c utils.c aubiotrack_SOURCES = aubiotrack.c utils.c +aubioquiet_SOURCES = aubioquiet.c utils.c aubioonset_LDADD = @JACK_LIBS@ aubionotes_LDADD = @JACK_LIBS@ aubiotrack_LDADD = @JACK_LIBS@ +aubioquiet_LDADD = @JACK_LIBS@ --- /dev/null +++ mod/examples/aubioquiet.c @@ -0,0 +1,76 @@ +/* + Copyright (C) 2003 Paul Brossier + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "utils.h" + +unsigned int pos = 0; /*frames%dspblocksize*/ +sint_t wassilence = 1, issilence; +uint_t usepitch = 0; + +int aubio_process(float **input, float **output, int nframes); +int aubio_process(float **input, float **output, int nframes) { + unsigned int i; /*channels*/ + unsigned int j; /*frames*/ + for (j=0;j<nframes;j++) { + if(usejack) { + for (i=0;i<channels;i++) { + /* write input to datanew */ + fvec_write_sample(ibuf, input[i][j], i, pos); + /* put synthnew in output */ + output[i][j] = fvec_read_sample(obuf, i, pos); + } + } + /*time for fft*/ + if (pos == overlap_size-1) { + /* test for silence */ + if (aubio_silence_detection(ibuf, threshold2)==1) { + if (wassilence==1) issilence = 1; + else issilence = 2; + wassilence=1; + } else { + if (wassilence<=0) issilence = 0; + else issilence = -1; + wassilence=0; + } + /* end of block loop */ + pos = -1; /* so it will be zero next j loop */ + } + pos++; + } + return 1; +} + +void process_print (void); +void process_print (void) { + int curframes = (frames - 4) > 0 ? frames -4 : 0; + if (issilence == -1) { + outmsg("NOISY: %f\n",curframes*overlap_size/(float)samplerate); + } else if (issilence == 2) { + outmsg("QUIET: %f\n",curframes*overlap_size/(float)samplerate); + } +} + +int main(int argc, char **argv) { + examples_common_init(argc,argv); + examples_common_process(aubio_process,process_print); + examples_common_del(); + debug("End of program.\n"); + fflush(stderr); + return 0; +} +
- References:
- silence detection
- From: dankajh <dankajh@gmail.com>
- silence detection
- Prev by Date: silence detection
- Next by Date: Re: [Freewheeling-user] Nudge loops / sync
- Previous by thread: silence detection
- Next by thread: Re: [Freewheeling-user] Nudge loops / sync
- Index(es):