我正在尝试从.wav文件中提取频率。所以我正在使用python wave和numpy,我快完成了!但是我遇到了一个错误..我遵循了这个网址的答案:Extracting frequencies from a wav file python
当我从按照该答案创建自己的.wav文件中提取频率时,它成功了。但是,当我从麦克风录制的.wav文件中提取频率时。它引发了一个错误:
struct.error:解压缩需要288768字节的缓冲区
以下是我的代码
import wave
import struct
import numpy as np
if __name__ == '__main__':
wf = wave.open('test6.wav', 'rb')
frame = wf.getnframes()
data_size = wf.getnframes()
frate = wf.getframerate()
data = wf.readframes(data_size)
wf.close()
duration = frame / float(frate)
data = struct.unpack('{n}h'.format(n=data_size), data)
data = np.array(data)
w = np.fft.fft(data)
freqs = np.fft.fftfreq(len(w))
print(freqs.min(), freqs.max())
# (-0.5, 0.499975)
# Find the peak in the coefficients
idx = np.argmax(np.abs(w))
freq = freqs[idx]
freq_in_hertz = abs(freq * frate)
print('freqiency: ',freq_in_hertz)
print('duration: ',duration)
错误消息中的 288768正好是data_size
的两倍。
因此,当我使用data_size=wf.getnframes()*2
时,它不会引发错误。但是,它会引发由代码创建的文件的错误。
我该怎么解决?
答案 0 :(得分:0)
鉴于缓冲区的大小恰好是data_size
的两倍,我想您用麦克风录制的.wav文件有两个通道而不是一个。您可以通过查看wf.getnchannels()
的输出来验证这一点。您的麦克风录音应该为2。
在这种情况下,您可以按照以下答案仅加载麦克风录音的一个通道: Read the data of a single channel from a stereo wave file in Python