2012-02-26 5 views
20

Quello che voglio fare è semplicementeLeggi MP3 in Python 3

mp3 = read_mp3(mp3_filename) 
audio_left = mp3.audio_channels[0] 

dove audio_left conterrà i dati audio grezzi PCM.

Stavo guardando Play a Sound with Python, ma la maggior parte dei moduli suggeriti non sono ancora portati su Python 3. Se possibile mi piacerebbe evitare di dover installare una libreria di sviluppo di giochi a tutti gli effetti.

Sono un principiante completo Python, quindi mi piacerebbe iniziare con Python 3.

+0

Vuoi canale sinistro solo per qualche motivo particolare, o vuoi solo l'audio in generale – Daenyth

+0

@Daenyth, voglio solo un segnale monofonico, quindi se posso avere mp3.audio. toMono(), ancora meglio :) –

+0

Si potrebbe voler vedere qui: http://stackoverflow.com/questions/8064784/mono-playback-of-mp3s-in-python-or-c – Daenyth

risposta

4

ho finito per usare un sottoprocesso mpg123 per convertire il MP3 in WAV, e poi io uso scipy.io. wavfile.read per leggere il file wav.

8

Per facilitare sarei convertito con alcuni strumenti MP3 in WAV, sia:

$ ffmpeg -i foo.mp3 -vn -acodec pcm_s16le -ac 1 -ar 44100 -f wav foo.wav 
or 
$ mpg123 -w foo.wav foo.mp3 

Quindi leggere il WAV con one of the python WAV libraries. Io raccomanderei PySoundFile perché funziona correttamente con la maggior parte dei WAV generati e installato senza problemi (al contrario di scikits.audiolab).

Nota: anche se scipy.io.wavfile.read() mi ha fornito un avviso "WavFileWarning: non conoscono i byte di formato", ha anche caricato correttamente il file.

1

Credo che la migliore per fare questo e quello è anche compatibile con Python 3.x è:

https://pypi.python.org/pypi/mplayer.py/

mi raccomando che si guarda al di Darwin M. Bautista git o google code:

E qui è un esempio da (come previsto da lui):

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() 

Elenco dei codec audio supportati:

  • MPEG layer 1, 2, e 3 audio (MP3)
  • AC3/A52, E-AC3, DTS (Dolby Digital) audio (software o SP/DIF)
  • AAC (MPEG-4 audio)
  • WMA (DivX audio) v1, v2
  • WMA 9 (WMAv3), Voxware audio, ACELP.netta ecc (utilizzando DLL x86)
  • RealAudio: COOK, SIPRO, ATRAC3 (utilizzando librerie Real)
  • RealAudio: DNET e codec anziani
  • QuickTime: Qclp, Q-Design QDMC/QDM2, MACE 3/6 (utilizzando le librerie QT), ALAC
  • Ogg Vorbis audio
  • VIVO audio (G723, Vivo sirena) (utilizzando x86 DLL)
  • alaw/ulaw, (ms) GSM, PCM, * ADPCM e altri semplici formati audio vecchi
+0

Puoi dare un esempio di codice che risolva il problema nella domanda? Cioè, codice che estrae i dati PCM da un file di input pronto per ulteriori analisi? – detly

+0

In realtà, sembra che non soddisfi il requisito di "nessun sottoprocesso invocazione". Termina semplicemente un processo MPlayer, che cerca come 'mplayer', e ho il sospetto che sia piuttosto fragile su Windows. – detly

1

Può essere d uno con 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)