仅作为操作保存,大佬请跳过。
关于手机录一段声音,用python分析——加载和显示
可参考博主另一篇博文传送门
直接上代码
import wave
import numpy as np
from matplotlib.pyplot import *
f=wave.open(r'E:\document\clear.wav','rb')
params=f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data=f.readframes(nframes)
wave_data=np.fromstring(str_data,dtype=np.short) # 归一化
wave_data=wave_data/max(abs(wave_data))
wave_data.shape=-1,2
wave_data=wave_data.T
wave_data=wave_data[0]
wlen=512
inc=128
signal_length=len(wave_data) #信号总长度
if signal_length<=wlen: #若信号长度小于一个帧的长度,则帧数定义为1
nf=1
else: #否则,计算帧的总长度
nf=int(np.ceil((1.0*signal_length-wlen+inc)/inc))
pad_length=int((nf-1)*inc+wlen) #所有帧加起来总的铺平后的长度
zeros=np.zeros((pad_length-signal_length,)) #不够的长度使用0填补,类似于FFT中的扩充数组操作
pad_signal=np.concatenate((wave_data,zeros)) #填补后的信号记为pad_signal
indices=np.tile(np.arange(0,wlen),(nf,1))+np.tile(np.arange(0,nf*inc,inc),(wlen,1)).T
# indices1=np.tile(np.arange(0,wlen),(nf,1))
# indices2=np.tile(np.arange(0,nf*inc,inc),(wlen,1))
# print(indices[:3])
indices=np.array(indices,dtype=np.int32) #将indices转化为矩阵
frames=pad_signal[indices] #得到帧信号
a=frames[168]
# b=a.size
time=np.arange(0,a.size)*(1/framerate)
plot(time,a.T);show()
print('ok')
即可
——————————————————————————————————————————————————