2012-02-26 34 views
20

Lo que quiero hacer es simplementeLeer MP3 en Python 3

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

donde audio_left contendrá datos de audio PCM en bruto.

Estaba viendo Play a Sound with Python, pero la mayoría de los módulos sugeridos aún no se han portado a Python 3. De ser posible, me gustaría evitar tener que instalar una biblioteca de desarrollo de juegos completamente desarrollada.

Soy un principiante de Python completa, así que me gustaría empezar usando Python 3.

+0

¿Quieres canal izquierdo por alguna razón en particular, o hacer lo que desea el audio en general – Daenyth

+0

@Daenyth, sólo quiero una señal monofónica, por lo que si puedo tener mp3.audio. toMono(), aún mejor :) –

+0

Es posible que desee ver aquí: http://stackoverflow.com/questions/8064784/mono-playback-of-mp3s-in-python-or-c – Daenyth

Respuesta

4

Terminé usando un subproceso mpg123 para convertir el MP3 a WAV, y luego utilizo scipy.io. wavfile.read para leer el archivo wav.

8

Para que sea más fácil me gustaría convertir con algunas herramientas de MP3 a WAV, ya sea:

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

Luego lea el WAV con one of the python WAV libraries. Recomendaría PySoundFile porque funciona correctamente con la mayoría de los WAV generados e instalados sin problemas (a diferencia de scikits.audiolab).

Nota: Aunque scipy.io.wavfile.read() me dio una advertencia de "WavFileWarning: bytes de formato desconocido", también cargó el archivo correctamente.

1

Creo que la mejor manera de hacer esto y que también es compatible con Python 3.x es:

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

le recomiendo que mire de Darwin M. Bautista git o google code:

Y aquí es un ejemplo de (conforme a lo dispuesto por él):

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

lista de códecs de audio compatibles:

  • capa de MPEG 1, 2 y 3 de audio (MP3)
  • AC3/A52, E-AC3, DTS (Dolby Digital) de audio (software o SP/DIF)
  • AAC (MPEG-4 audio)
  • WMA (DivX audio) v1, v2
  • WMA 9 (WMAv3), Voxware de audio, ACELP.neta etc (usando DLL x86)
  • RealAudio: COOK, SIPRO, ATRAC3 (usando bibliotecas Real)
  • RealAudio: DNET y codecs de más edad
  • QuickTime: Qclp, Q-Design QDMC/QDM2, MACE 3/6 (utilizando librerías QT), ALAC
  • Ogg Vorbis de audio
  • VIVO audio (G723, Vivo Siren) (usando DLL x 86)
  • alaw/ulaw, (ms) gsm, PCM, * viejos formatos de audio simples ADPCM y otros
+0

¿Puedes dar un ejemplo de código que resuelva el problema en la pregunta? Es decir, ¿código que extrae los datos PCM de un archivo de entrada listo para un análisis posterior? – detly

+0

En realidad, parece que no cumple el requisito de "no invocación de subproceso". Simplemente envuelve un proceso de MPlayer, que busca como 'mplayer', y sospecho que será bastante frágil en Windows. – detly

1

Can be 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)