本文最先发布在我的CSDN上
市面上语音识别技术原理已经有很多很多了,然而很多程序员兄弟们想研究的时候却看的头大,一堆的什么转mfcc,然后获取音素啥的,对于非专业音频研究者或非科班出生的程序员来说,完全跟天书一样。
最近在研究相关的实现,并且学习了keras和tensorflow等。用keras做了几个项目之后,开始着手研究语音识别的功能,在网上下载了一下语音的训练文件,已上传到了百度云盘:https://pan.baidu.com/s/1Au85kI_oeDjode2hWumUvQ
目录如下,文件夹名就是里面的语音的标签,语音由很多不同年龄性别的人发音收集而来
拿到一个语音文件之后需要先转mfcc,这个操作很简单,不需要什么高深的内功。用python写一段函数专门用来获取语音文件的fmcc值。
参数为单个文件在磁盘的位置,mfcc是一堆的正数和负数组成的数组:
为了在训练的时候避免损失函数应为负数导致输出结果相差太大,需要把原始的mfcc全部转为正数,直接平方后在开方就是正值了。
我们可以把每个音频的mfcc值当做对应的特征向量,然后进行训练,我这里为了测试速度,取了seven 和 stop 两个语音类别来进行训练和识别,每个大概2700多个文件。并且分别从两个文件夹中剪切出来100个当做测试集,并每样拿出5个当做后面的试验集。
test1 中放置的是 100个 seven 语音,test2 中放置的是100个 stop 语音,trunk中放的是5个seven 和5个stop 语音。
如图1开头的都是seven , 2开头的都是stop 。
训练之前需要先读取数据创建数据集和标签集:
拿到数据集之后就可以开始进行神经网络的训练了,keras提供了很多封装好的可以直接使用的神经网络,我们先建立神经网络模型
训练之后的结果:
两个类型的文件一个4500多个,我本机使用CPU训练大概用时20多秒。
最后显示结果准确率为0.9050.也就是90.5%的准确率,这里可以加大数据集的数量和调参来加大准确率。
最后保存模型到文件:
保存之后会在文件夹中生成一个文件【95M】:
现在训练的模型已经有了,我们开始使用trunk中的文件进行试验:
先加载之前训练的模型:
然后获得当前需要试验的文件的mfcc。并且将数据封装成和训练时一样的维度。并且使用模型的predict函数输出结果:
结果输出:
可以看出结果是一个2个数的数组,里面返回的对应类别相似度,也就是说哪一个下标的值最大,就跟那个下标对应的标签最相似。
之前训练的时候,标签的集是:[seven , stop]
所以如图下标1的值达到了89.9%的相似度。
我们把试验文件换成 1b.wav
结果输出:
本机的试验的识别速度在2秒内。
本文相关的代码已上传github:https://github.com/BenShuai/kerasTfPoj/tree/master/kerasTfPoj/ASR