python处理带有wave和numpy的wav文件

时间:2018-09-12 13:08:35

标签: python numpy

我正在尝试从.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时,它不会引发错误。但是,它会引发由代码创建的文件的错误。 我该怎么解决?

1 个答案:

答案 0 :(得分:0)

鉴于缓冲区的大小恰好是data_size的两倍,我想您用麦克风录制的.wav文件有两个通道而不是一个。您可以通过查看wf.getnchannels()的输出来验证这一点。您的麦克风录音应该为2。

在这种情况下,您可以按照以下答案仅加载麦克风录音的一个通道: Read the data of a single channel from a stereo wave file in Python