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 echo
ed 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
Leave a Reply