2012-02-26 21 views
20

Co chcę zrobić, to po prostuCzytaj MP3 w Pythonie 3

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

gdzie audio_left zawierają surowe dane audio PCM.

Patrzyłem na Play a Sound with Python, ale większość sugerowanych modułów nie jest jeszcze przeniesiona do Pythona 3. Jeśli to możliwe, chciałbym uniknąć konieczności instalowania w pełni rozwiniętej biblioteki gier.

jestem kompletnym Początkujący Python, więc chciałbym, aby rozpocząć przy użyciu Python 3.

+0

Chcesz lewy kanał tylko dla jakiegoś konkretnego powodu, czy chcesz po prostu dźwięk w ogólnym – Daenyth

+0

@Daenyth, chcę tylko sygnał monofoniczny, więc jeśli mogę mieć mp3.audio. toMono(), jeszcze lepiej :) –

+0

Możesz zobaczyć tutaj: http://stackoverflow.com/questions/8064784/mono-playback-of-mp3s-in-python-or-c – Daenyth

Odpowiedz

4

skończyło się za pomocą podprocesów mpg123 do konwertowania mp3 do wav, a następnie użyć scipy.io. wavfile.read, aby przeczytać plik wav.

8

aby łatwiej bym przekonwertować z niektórych narzędzi MP3 do WAV, albo:

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

Następnie przeczytaj WAV z one of the python WAV libraries. Polecam PySoundFile, ponieważ działa poprawnie z większością wygenerowanych WAV i jest instalowany bez problemu (w przeciwieństwie do scikits.audiolab).

Uwaga: mimo że scipy.io.wavfile.read() dała mi ostrzeżenie "WavFileWarning: Unfamiliar format bytes", to również załadował plik poprawnie.

1

Uważam, że najlepiej to zrobić i to jest również zgodne z Python 3.x jest:

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

Gorąco polecam, że spojrzeć na Darwin M. Bautista git lub google code:

a oto przykład z (dostarczone przez niego):

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 obsługiwanych kodeków audio:

  • MPEG layer 1, 2 i 3 (MP3) dźwięku
  • AC3/A52, E-AC3, DTS (Dolby Digital) Audio (oprogramowanie lub SP/DIF)
  • AAC (MPEG-4 audio)
  • WMA (DivX audio) v1, v2
  • WMA 9 (WMAv3) Voxware audio ACELP.etc netto (przy użyciu biblioteki DLL x86)
  • RealAudio: COOK, SIPRO, ATRAC3 (używając prawdziwych bibliotek)
  • RealAudio: DNET i starszych kodeków
  • QuickTime: Qclp, Q-Design QDMC/QDM2, MACE 3/6 (przy użyciu biblioteki QT), ALAC
  • Ogg Vorbis audio
  • VIVO audio (g723, Vivo Siren) (używając x86 DLL)
  • alaw/ulaw (ms) gsm, PCM, * ADPCM i inne stare, proste formaty audio
+0

Czy możesz podać przykład kodu, który rozwiązuje problem z pytaniem? To znaczy, że kod wyodrębnia dane PCM z pliku wejściowego do dalszej analizy? – detly

+0

W rzeczywistości wygląda na to, że nie spełnia wymagania "bez wywołania podprocesowego". Po prostu owija proces MPlayera, który wygląda jak "mplayer", i podejrzewam, że będzie on dość kruchy w systemie Windows. – detly

1

Może być jeden z 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)