13
votes

I would like to do basic audio mixing in python.

To give an example: I would like to take two mp3 files and add them together and return one mp3 file. Another example: I would like to take the first ten seconds of one mp3 file and add it to the beginning of another mp3 file.

What is the best way to accomplish these tasks? I would like to use built in python functions like audioop but can not find any good tutorials or sample code out there for using the built in functions.

I am going through the docs but I am pretty confused and cannot figure out how to do things like this. I am not even sure that the python libraries like mp3's. Most of the stuff I have looked at seem to refer to WAV files. So, if this is the case, I guess a follow up question would be is there an easy way to convert an mp3 to a WAV for manipulation and back again?

3
In almost any case I can think of you MUST convert to WAV before processing. mp3 is a compressed format, which must be decompressed first in order to manipulate PCM data.Michael Berkowski
sorry should have made the last question more clear: "is there an easy way to convert an mp3 to a WAV for manipulation and back again in python?"user439299

3 Answers

24
votes

You can do this pretty easily using pydub:

from pydub import AudioSegment

sound1 = AudioSegment.from_mp3("/path/to/file1.mp3")
sound2 = AudioSegment.from_mp3("/path/to/file1.mp3")

# mix sound2 with sound1, starting at 5000ms into sound1)
output = sound1.overlay(sound2, position=5000)

# save the result
output.export("mixed_sounds.mp3", format="mp3")
1
votes

You could check out some of the code in the python audiotools project. It is a collection of command-line utilities which make use of a common python package. There is a utility included with audiotools (trackcat) which can con*cat*enate two or more audio tracks; another (tracksplit) can split an audio track (using a .cue file). These, as well as the numerous other included utilities, can work with audio files of various encodings, including mp3.

0
votes

The way I've done this in the past is just use subprocess. and call sox.

E.g. subprocess.call(["sox", "in.1.mp3", "in.2.mp3", "out.mp3"])