How can I remove silence from an MP3 programmatically?
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.
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, 2020Comments
-
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.