How can I remove silence from an MP3 programmatically?

23,333

Solution 1

sox inputfile.mp3 outputfile.mp3 silence 1 0.1 0.1% reverse silence 1 0.1 0.1% reverse

This will trim any silence longer than 0.1 second from your file. If you're only concerned about trimming the end, this can be simplified to:

sox inputfile.mp3 outputfile.mp3 reverse silence 1 0.1 0.1% reverse

A detailed look into how sox's silence works can be found here.

Solution 2

You probably are looking for a lossless solution, i.e. one that does not require re-encoding (which reduces quality).

I believe mp3splt is what you are looking for. It can be used from command line and GUI.

sudo aptitude install mp3splt mp3splt-gtk

should work on Debian and Ubuntu.

From the man page:

You can also try to split files automatically with silence detection (see -s option), trim files using silence detection (see -r option), or by a fixed time length (see -t option)

Solution 3

Have a look at the silencedetect FFmpeg audio filter:

Detect silence in an audio stream.

This filter logs a message when it detects that the input audio volume is less or equal to a noise tolerance value for a duration greater or equal to the minimum detected noise duration.

The printed times and duration are expressed in seconds.

It has parameters to adjust how quiet something has to be to be considered silence, and how long the silence needs to be to be noted.

Share:
23,333
Benjamin Oakes
Author by

Benjamin Oakes

Ruby, JavaScript, and Web. If I made a contribution that helped you, please consider Flattr logo http://api.flattr.com/button/flattr-badge-small.png leaving a tip via Flattr. Maid I maintain the open source Maid project: Be lazy. Let Maid clean up after you, based on rules you define. It's easy to install on a Mac or Linux. See instructions at http://rubygems.org/gems/maid TabCarousel I maintain an open source Chrome extension to help you keep tabs on info you want to monitor. Great for a TV or other external display. Install it from the Chrome Web Store.

Updated on December 31, 2020

Comments

  • Benjamin Oakes
    Benjamin Oakes over 3 years

    I have MP3 files that sometimes have silence at the end. I would like to remove this silence automatically. From what I can tell, it is "perfect" silence (0 amplitude), not background noise. The length of the content and the silence varies.

    I found some other questions about cropping to the first 30 seconds or cropping to X and X+N seconds using ffmpeg. I would think I could use a similar approach, as long as I have a way to find when the silence starts. How would I do that programatically?

    For example, one possible solution would be to have a command that finds the beginning of the "silence". I'd expect a sequence like this

    end=$(ffmpeg some-command-to-find-start-of-silence)
    ffmpeg -t "$end" -acodec copy -i inputfile.mp3 outputfile.mp3
    

    The solution does not have to use ffmpeg, but it does need to be available on Ubuntu.