37,721
社区成员
发帖
与我相关
我的任务
分享
import wave
import numpy as np
import pylab as plt
#打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。
f = wave.open(r"D:\\img\\hello.wav", "rb")
#读取格式信息
#一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
#读取波形数据
#读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)
str_data = f.readframes(nframes)
f.close()
#将波形数据转换成数组
#需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组
wave_data = np.frombuffer(str_data,dtype = np.short)
wave_data = wave_data*1.0/(max(abs(wave_data)))#wave幅值归一化
print("wave",len(wave_data))
print("nframes",nframes)
print("framerate",framerate)
#通过取样点数和取样频率计算出每个取样的时间。
time=np.arange(0,nframes)/framerate
len_time = 14239
am = time[0:len_time]
#time 也是一个数组,与wave_data[0]或wave_data[1]配对形成系列点坐标
plt.figure()
plt.subplot(5,1,1)
plt.plot(am,wave_data)
plt.show()