仅作为操作记录,大佬请跳过。
背景:博主的matlab 2019a 不能使用enframe函数,发现没有安装voice toolbox包,还是用python吧
流程
1、华为手机录一段语音,是.m4a格式。保存到电脑上。
2、需要转换成.wav格式
可在线转换,在这里先将M4A格式转MP3,再在这里将MP3转WAV格式
3、pycharm中写python代码
可直接运行
(博主的音频文件命名为了clear.wav,保存在E盘的document文件夹下)
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)
# print(len(str_data)) # 二进制数的长度 =十六进制长度*4
wave_data=np.fromstring(str_data,dtype=np.short) # 归一化 wave_data=wave_data/max(abs(wave_data))
# print(wave_data.shape);wave_data.shape=-1,2;print(wave_data.shape)
# print(len(wave_data))
wave_data.shape=-1,2
wave_data=wave_data.T
# wave_data.shape=2,-1
time=np.arange(0,nframes)*(1/framerate)
# plot(time,wave_data[0]);show()
subplot(211)
plot(time, wave_data[0])
subplot(212)
plot(time, wave_data[1], c="g")
xlabel("time (seconds)")
show()
print('ok')
即可
展示
发现与华为手机上的录音截屏基本一样:
————————————————————————————————————————————————————
注
(1)f.getparams()
可以直接分析出音频的采样率和采样点数
(2)f.readframes(nframes)得到音频的数字信息,是二进制数
(3)华为手机录的音是双声道,也就是左扬声器和右扬声器。也就是采样点数是256000,但实际点数是512000(左1右1左2右2左3右3左4……)(=256000*2)——所以画时频图时,选取一侧(左侧或右侧)的全部值进行显示即可。
华为手机是双声道,其他的录音器可能不是,由(1)中f.getparams()
算出的nchannel可知
(4)提取左侧全部值
一定要用:
wave_data.shape=-1,2
和wave_data=wave_data.T
的方式(这样是2,4,6,8……分隔提取)
不能用wave_data.shape=2,-1 ,这样是(2,3,4,5,6)提取。
参考
感谢大佬博主文章