预处理数据(批量生成语谱图)
声谱图介绍:
处理语音信号很少直接利用录下來的整段语音波形(speech waveform),而是將波形沿着时间轴,每隔10毫秒切割出一小段长约20至30毫秒的波形來处理,称为短时段分析(short-term analysis),习惯上上把这些一小段波形称为「音框」(speech frame)。接着再针对每个音框进行傅里叶分析(Fourier analysis),傅里叶分析的主要目的在將时间上的波形拆解成数个不同頻率的弦波信号,利用这些弦波信号的振幅和相位來表示语音波形的特征;若将弦波信号的振幅绝对值取对数、並沿着頻率画圆,可得此音框的绝对值频率(magnitude spectrum)。將这些绝对值频率沿著时间排列,並以颜色深浅表示各弦波成份所佔的多少,我们即可得到声谱图(spectrogram)
语音信号预处理介绍:
主要预处理包括:
https://mp.weixin.qq.com/s?__biz=MzAwNTAyNzM5Ng%3D%3D&idx=6&mid=2652960998&sn=545b1589d6bd236ec2cb9f6fe2cd662f
---笔记
https://github.com/RockmanZheng/Digital-Speech-Recognizer/tree/4e96298c5830242673762bad29582dc1a739c3d9/0.3.8/src
---对应代码
python生成声谱图:
主要分为三部分,【批量数据预处理,生成语谱图,去白边保存】
1、批量数据预处理代码代码:
for 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+filename
f = wave.open(path_one,'rb')
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]#声道/量化数/采样频率/采样点数
strData = f.readframes(nframes)#读取音频,字符串格式
waveData = np.fromstring(strData,dtype=np.int16)#将字符串转化为int
waveData = waveData*1.0/(max(abs(waveData)))#wave幅值归一化
【注:COOKED_DIR即为wavs存储的文件夹】
2、生成语谱图:
plt.specgram( waveData , NFFT=512, Fs=44100,noverlap=384)
【注:这里还测试了参数 NFFT=1024, Fs=44100,noverlap=900;NFFT=2048, Fs=44100,noverlap=1536。结果没有上面的参数显示好】
3、去白边保存:
plt.axis('off')
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
fig = matplotlib.pyplot.gcf()
if "."in filename:
Filename = filename.split(".")[0]
plt.savefig(plotpath + Filename+'.jpg', dpi = 1200,bbox_inches = 'tight',pad_inches = 0)
plt.clf()
【注:主要是通过先隐藏坐标轴 plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False) ,再通过bbox_inches = 'tight',pad_inches = 0来去白边的】