He identificado dos maneras decentes de hacer esto.
Método 1: utilizar el módulo WAVEFILE
Utilice este método si no te importa la instalación de algunas bibliotecas adicionales que implicaron un poco de andar por ahí en mi Mac, pero que era fácil en mi servidor de Ubuntu.
https://github.com/vokimon/python-wavefile
import wavefile
# returns the contents of the wav file as a double precision float array
def wav_to_floats(filename = 'file1.wav'):
w = wavefile.load(filename)
return w[1][0]
signal = wav_to_floats(sys.argv[1])
print "read "+str(len(signal))+" frames"
print "in the range "+str(min(signal))+" to "+str(min(signal))
Método 2: utilizando el módulo de onda
Utilice este método si desea instalar el módulo menos molestias.
Lee un archivo wav del sistema de archivos y lo convierte en flotantes en el rango de -1 a 1. Funciona con archivos de 16 bits y si son> 1 canal, intercalará las muestras de la misma manera en que se encuentran en el archivo. Para otras profundidades de bits, cambiar la 'h' en el argumento de struct.unpack acuerdo con la tabla en la parte inferior de esta página:
https://docs.python.org/2/library/struct.html
que no funcionará para los archivos de 24 bits ya que no hay datos escriba que es de 24 bits, por lo que no hay forma de decirle a struct.unpack qué hacer.
import wave
import struct
import sys
def wav_to_floats(wave_file):
w = wave.open(wave_file)
astr = w.readframes(w.getnframes())
# convert binary chunks to short
a = struct.unpack("%ih" % (w.getnframes()* w.getnchannels()), astr)
a = [float(val)/pow(2, 15) for val in a]
return a
# read the wav file specified as first command line arg
signal = wav_to_floats(sys.argv[1])
print "read "+str(len(signal))+" frames"
print "in the range "+str(min(signal))+" to "+str(min(signal))
¿No debería ser esta la respuesta aceptada? –
Si obtiene 'OSError' o' wave.Error' intente utilizar el comando ffmpeg 'ffmpeg -i song.mp3 song.wav' mediante cli para convertir el archivo de audio. Debería funcionar entonces ([src] (https://stackoverflow.com/a/36571441/3854436)) –