Я определил два достойных способа сделать это.
Метод 1: использование модуля волнового файла
Используйте этот метод, если вы не возражаете установить некоторые дополнительные библиотеки, в которых было немного возни на моем Mac, но это было легко на моем сервере 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))
Способ 2: использование волнового модуля
Используйте этот метод, если вы хотите меньше проблем с установкой модуля.
Считывает файл wav из файловой системы и преобразует его в числа с плавающей запятой в диапазоне от -1 до 1. Он работает с 16-битными файлами и, если они> 1 канал, будет чередовать сэмплы так же, как они находятся в файл. Для других битовых глубин измените 'h' в аргументе на struct.unpack в соответствии с таблицей внизу этой страницы:
https://docs.python.org/2/library/struct.html
Он не будет работать для 24-битных файлов, так как нет типа данных, который является 24-битным, поэтому нет способа сообщить struct.unpack, что делать.
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))