python将批量音频信号(wav)转化为语谱图并保存(jpg/png)
1. 导入需要的函数库
import numpy as npimport waveimport matplotlib.pyplot as pltimport os
2. 读取wav格式的信号
COOKED_DIR = 'D:/proj1/Test1/cough/cough/'i = 0for root, dirs, files in os.walk(COOKED_DIR):print("Root = ", root, "dirs = ", dirs, "files = ", files)for filename in files:print(filename)path_one = COOKED_DIR + filenameprint(path_one)f = wave.open(path_one, 'rb')
3. 语音信号处理
params = f.getparams() # 一次性返回所有的音频参数,声道数、量化位数、采样频率、采样点数nchannels, sampwidth, framerate, nframes = params[:4] # 声道/量化数/采样频率/采样点数str_data = f.readframes(nframes) # 指定需要读取的长度(以取样点为单位),返回字符串类型数据waveData = np.frombuffer(str_data, dtype=np.int16) # 将字符串转化为intwaveData = waveData * 1.0 / (max(abs(waveData))) # wave幅值归一化
4.绘图
plt.specgram(waveData, NFFT=512, Fs=framerate, noverlap=500, scale_by_freq=True, sides='default')plt.ylabel('Frequency')plt.xlabel('Time(s)')
5. 保存绘图
plt.axis('off')name = str(i)# 做名字i += 1plt.savefig("filepath"+name+".jpg", bbox_inches='tight', pad_inches=0)# 后两项为去除白边plt.show()
6. 结果
另外:想要得到合适的图片像素做深度学习,可以设置:输出224的图片像素大小
plt.rcParams['figure.figsize'] = (4.48, 4.48) # 2.24, 2.24 设置figure_size尺寸plt.rcParams['savefig.dpi'] = 50 # 图片像素 这样输出的就是4.48*50=224
- 重点
params = f.getparams() 用于一次性返回音频文件的各项参数。plt.specgram()用于绘制语谱图。plt.savefig(“filepath”+name+".png", bbox_inches=‘tight’, pad_inches=0)用于保存图片。