What I want to do is simply
mp3 = read_mp3(mp3_filename)
audio_left = mp3.audio_channels[0]
where audio_left will contain raw PCM audio dat
I believe that the best to do this and that is also compatible with Python 3.x is:
https://pypi.python.org/pypi/mplayer.py/
I highly recommend that you look at Darwin M. Bautista's git or google code:
And here is an example from (as provided by him):
from mplayer import Player, CmdPrefix
# Set default prefix for all Player instances
Player.cmd_prefix = CmdPrefix.PAUSING_KEEP
# Since autospawn is True by default, no need to call player.spawn() manually
player = Player()
# Play a file
player.loadfile('mp3_filename')
# Pause playback
player.pause()
# Get title from metadata
metadata = player.metadata or {}
print metadata.get('Title', '')
# Print the filename
print player.filename
# Seek +5 seconds
player.time_pos += 5
# Set to fullscreen
player.fullscreen = True
# Terminate MPlayer
player.quit()
List of supported audio codecs:
To make it easier I'd convert with some tools mp3 to wav, either:
$ ffmpeg -i foo.mp3 -vn -acodec pcm_s16le -ac 1 -ar 44100 -f wav foo.wav
or
$ mpg123 -w foo.wav foo.mp3
Then read the WAV with one of the python WAV libraries. I'd recommend PySoundFile because it works with most generated WAV correctly and installed without issue (as opposed to scikits.audiolab
).
Note: Even though scipy.io.wavfile.read()
gave me a "WavFileWarning: Unfamiliar format bytes" warning, it also loaded the file properly.
I ended up using an mpg123 subprocess to convert the mp3 to wav, and then I use scipy.io.wavfile.read to read the wav file.
Can be done with pydub:
import array
from pydub import AudioSegment
from pydub.utils import get_array_type
sound = AudioSegment.from_file(file=path_to_file)
left = sound.split_to_mono()[0]
bit_depth = left.sample_width * 8
array_type = get_array_type(bit_depth)
numeric_array = array.array(array_type, left._data)
You could use librosa:
import librosa
y, sr = librosa.load('your_file.mp3')
Further information: https://github.com/librosa/librosa
I am considering using FFmpeg as a subprocess. There is a Python wrapper called pyffmpeg, but I had difficulty installing it on my system (OS X 10.7.3).
You may also want to look at the code here for calling FFmpeg as a subprocess from Python: https://github.com/albertz/learn-midi/blob/master/decode.py