市面上语音识别技术原理已经有很多很多了,然而很多程序员兄弟们想研究的时候却看的头大,一堆的什么转mfcc,然后获取音素啥的,对于非专业音频研究者或非科班出生的程序员来说,完全跟天书一样。
最近在研究相关的实现,并且学习了keras和tensorflow等。用keras做了几个项目之后,开始着手研究语音识别的功能,在网上下载了一下语音的训练文件,已上传到了百度云盘:https://pan.baidu.com/s/1Au85kI_oeDjode2hWumUvQ
目录如下,文件夹名就是里面的语音的标签,语音由很多不同年龄性别的人发音收集而来
拿到一个语音文件之后需要先转mfcc,这个操作很简单,不需要什么高深的内功。用python写一段函数专门用来获取语音文件的fmcc值。
def get_wav_mfcc(wav_path):
f = wave.open(wav_path,'rb')
params = f.getparams()
# print("params:",params)
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幅值归一化
waveData = np.reshape(waveData,[nframes,nchannels]).T
f.close()
### 对音频数据进行长度大小的切割,保证每一个的长度都是一样的
#【因为训练文件全部是1秒钟长度,16000帧的,所以这里需要把每个语音文件的长度处理成一样的】
data = list(np.array(waveData[0]))
# print(len(data))
while len(data)>16000:
del data[len(waveData[0])-1]
del data[0]
# print(len(data))
while len(data)<16000:
data.append(0)
# print(len(data))
data=np.array(data)
# 平方之后,开平方,取正数,值的范围在 0-1 之间
data