在python中加载音频波形文件。 ValueError:要解压缩的值太多

时间:2013-10-08 14:39:54

标签: python arrays audio

from scipy.io.wavfile import read

filepath = glob.glob('*.wav') #list

rate,data = [read(fp) for fp in filepath]

我得到了:

ValueError: too many values to unpack

但我一次只能加载一次。

像这样:

rate,data = read('001.wav')
print rate
print data      

我得到了:

44100
[0 0 0 ..., 0 0 0]

如何将速率和数据加载到两个数组中,如果我这样做:

datas = [read(fp) for fp in filepath]

我会得到:

[(44100, array([0, 0, 0, ..., 0, 0, 0], dtype=int16)), (44100, array([0, 0, 0, ..., 0, 0, 1], dtype=int16)), ..., (44100, array([0, 0, 0, ..., 0, 0, 0], dtype=int16))]

或者有任何方法可以在加载后将数据拆分为速率和数据。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用zip(*x)将其格式化为一个费率列表和一个数据列表列表。

raw_data = [read(fp) for fp in filepath]
rates, data = zip(*raw_data)

例如,

raw_data = zip(range(10), range(20, 30))
# [(0, 20), (1, 21), (2, 22), (3, 23), (4, 24), (5, 25), (6, 26), (7, 27), (8, 28), (9, 29)]

zip(*raw_data)
# [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), (20, 21, 22, 23, 24, 25, 26, 27, 28, 29)]

答案 1 :(得分:1)

您可以在加载后使用反向zip功能将其拆分(如this answer中所述):

In [13]: rate, data = zip(*datas)

In [14]: rate
Out[14]: (44100, 44100)

In [15]: data
Out[15]: (array([0, 0, 0, 0, 0, 0]), array([0, 0, 0, 0, 1]))

我想说在这种情况下这是一种可以接受的方式,虽然我认为使用更经典的for循环,在不使用列表理解的情况下附加到列表,会更清晰:

rates = []
datas = []
for fp in filepath:
    rate, data = read(fp)
    rates.append(rate)
    datas.append(data)

你在第一种情况下获得ValueError的原因是因为你正在将每个文件的所有元组列表(显然超过2个,给出错误消息)解包为两个变量 - 速率和数据