文章正文
使用Python进行语音识别二
获得MEL滤波器
本来这一篇就想把识别做完的,但是搜了一些文献,发现如果简单的使用能量和过零率识别率不高,而如果直接使用原生采样数据计算量有点大,所以就准备按照大多数文献说的将MFCC作为其中的一种特征参数,从而使用K临近算法好了,识别率会不会好不知道,这篇文章就简单的说一下如何用python获得MEL滤波器吧,后面的东西后面在做。
直接贴代码:
#encoding=utf-8 import wave import pylab as pl import numpy as np samprate=44100 filterNum=12 def mel2freq(mel_vec): '''mel频率变为线性频率''' freq_filter=[] for i in mel_vec: freq_filter.append((np.power(10,i/2595)-1)*700) return freq_filter def get_datMel(): frequency=samprate*1.0/2 melf=2595*np.log10(1+(frequency/700)) dat_mel=melf/(filterNum+1) return dat_mel def get_Mel(): index=range(0,filterNum) print index dat=get_datMel() print dat melfrequency_start=np.dot(index,dat) melfrequency_mid=np.dot(np.add(index,1),dat) melfrequency_end=np.dot(np.add(index,2),dat) freq=(mel2freq(melfrequency_start),mel2freq(melfrequency_mid),mel2freq(melfrequency_end)) #plot filter for i in xrange(len(index)): pl.plot([freq[0][i],freq[1][i],freq[2][i]],[0,1,0]) pl.show() return freq if __name__=='__main__': print get_Mel()
基本的过程如下:
1、 使用采样率得到最大音频频率;
2、 然后使用公式f=2595*log10(1+f/700)得到最大mel频率
3、 根据要放的mel滤波器的个数得到mel频率间隔,从而得到每个滤波器的开始,中心以及结尾频率。
4、 使用上面公式的反函数得到对应的线性频率的值,从而得到线性频率下的滤波器。
得到的线性频率的滤波器如下图:
April 8, 2015, 9:44 p.m. 作者:zachary 分类:语音识别 阅读(1856) 评论(0)
评论列表:
评论: