silence detection

Paul Brossier piem at altern.org
Mon Oct 31 04:47:58 CET 2005


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
-------------- next part --------------
--- 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;
+}
+


More information about the aubio-user mailing list