How To Find (and Delete) Silent Audio Files

Posted on February 6, 2013 by David Hilowitz

The Problem

If you’re anything like me, you have a ton of audio files on your hard drive. When I’m working on music (or an audio synthesis project), I will export out songs that I’m working on in one piece of software in order to import them into another. I keep the intermediary tracks in my Dropbox so that I can use and reuse the little snippets when I’m building my compositions. Life has gotten much easier for me in the past few years as most modern audio sequencers (Cubase, Live, PreSonus Studio One) now offer the possibility of exporting all the component tracks of a composition. The problem is, if you have 12 tracks in your song file and only 4 of them are actually being used in the section of song you are exporting, you’ll end up with 12 audio files—8 of which will be blank. If only there were some easy way of find and deleting those blank files so that they didn’t take up so much of my valuable Dropbox space…

The Solution

Luckily, if you’re using a Mac/Linux box, it’s possible to find (and yes, delete) silent audio files en masse using the command-line. It’s undoubtedly possible in Windows, too, using Cygwin, but I haven’t tried it. NOTE: This is very much a use-at-your-own-risk solution. When I do this, I never delete the files directly. I always just use this system to generate a file list. Then I drop the list of files into Winamp and have a relaxing “silent file listening session.” In other words, I check to make sure they are, in fact, actually silent.

OK, so how does it work?

For starters, you will need to install a super useful tool call SoX. SoX is a command-line tool which can be used to perform conversions from one audio file format to another, to apply filters to your files, as well as to generate useful statistics about your audio. In OS X, you can install it via MacPorts (simply type “sudo port install sox” at the Terminal) and on Linux via apt-get. You can also go the old-fashioned route by downloading the source files and compiling it.

Once you have it installed, try it out. Open up a Terminal window, cd into a directory that contains some audio files, and type this:

sox <name_of_audio_file> -n stat

You should get a response that looks like this:

~/loops $ sox <name_of_audio_file> -n stat
Samples read: 2596058
Length (seconds): 13.521135
Scaled by: 2147483647.0
Maximum amplitude: 0.848263
Minimum amplitude: -0.943067
Midline amplitude: -0.047402
Mean norm: 0.083552
Mean amplitude: -0.000062
RMS amplitude: 0.120734
Maximum delta: 0.157007
Minimum delta: 0.000000
Mean delta: 0.024596
RMS delta: 0.034412
Rough frequency: 4354
Volume adjustment: 1.060

We can see from the output that this .wav file is definitely not silent. If it were silent, the Max, Min, and Midline amplitudes would all be 0.000000.

OK, now that we’ve seen what SoX provides us with, how do we find the silent files?

Open up your favorite text editor and paste this into a text file:

#!/bin/bash

## A quick hack like script to list all the files that have
## a low amplitude.
##
## Input is a bash file list or glob.
##
## $ find_silent_audio_files *.wav
##
## Each time the script runs it will remove the output list
## and regenerate it. Stderr will output each file and it's
## amplitude.

Max=0.0 # Any amplitude greater than this will NOT be listed
OutList=~/output.list # The name of the file that contains a
# list of file names only of all the
# low-amplitude files.

# rm $OutList
for each in "$@"
do amplitude=$(sox "$each" -n stat 2>&1 | grep "Maximum amplitude" | cut -d ":" -f 2 | sed 's/ g')
if [[ $(echo "if (${amplitude} > ${Max}) 1 else 0" | bc) -eq 0 ]]
then echo "$each --> $amplitude" >&2
echo "$each" >> $OutList
fi
done

Save this as find_silent_audio_files somewhere in your PATH (maybe in /usr/local/bin or a ~/bin directory if you have one). chmod it so that it’s executable (chmod +x ./find_silent_audio_files).

Great. You are now ready to use this tool. Run it as follows:

dave:~ dhilowitz$ cd ~/wave_files
dave:wave_files dhilowitz$ find_silent_audio_files *.wav
202_what_you_working_on_chorus 13-Audio.wav --> 0.000000
202_what_you_working_on_chorus 2 - 12 C HEND.wav --> 0.000000
202_what_you_working_on_chorus A-Return.wav --> 0.000000
202_what_you_working_on_chorus B-Return.wav --> 0.000000
202_what_you_working_on_chorus MIDI Tracks.wav --> 0.000000
202_what_you_working_on_chorus MOOG.wav --> 0.000000
202_what_you_working_on_verse 13-Audio.wav --> 0.000000
202_what_you_working_on_verse 2 - 12 C HEND.wav --> 0.000000
202_what_you_working_on_verse A-Return.wav --> 0.000000
202_what_you_working_on_verse B-Return.wav --> 0.000000
202_what_you_working_on_verse MIDI Tracks.wav --> 0.000000
202_what_you_working_on_verse MOOG.wav --> 0.000000

The output of the command will be echoed to stdout as well as to a file in your user directory called ~/output.list. As you can see from the code listing above, this file name can be changed. Once you know the names of the files, it should be pretty easy to delete them. Obviously, changing “echo” to “rm” in the script above will accomplish this, but, as I said before, I wouldn’t recommend it unless you have backups or really don’t care.

OK. That’s about it. Good luck! I hope this is useful to someone out there.

–David