第四堂课布置了一个Mission Impossible:如何利用Matlab完成数字1-9的语音识别
要事先准备好1-9数字的图片文件和声音文件。
任务的目标是:制作一个Matlab图形界面程序,它的核心控件是'录制语音'和'语音识别'按钮,主要是用来实现在线录制一段语音,比如'5'这个音,然后点击'语音识别'按钮,就会在程序的上方显示'5'这个数字图片,效果如下图所示:
准备1-9数字的图片文件:
准备1-9数字的声音文件:
接下来,我们来搭建一个Matlab GUI的框架:
它呈现出来的样子是这样的:
(a)左上方是工作目录:根据 .m 文件当前的位置,我们是可以获取当前的工作目录的(利用 fileparts函数和mfilename函数的嵌套可以获取当前工作目录,具体代码见初始化功能模块),然后把工作目录和语音文件所在的文件夹名称合并就可以get到默认的当前工作路径,在初始化的时候,这个路径信息会自动写在当前目录的编辑框中。
(b)左侧专门放置了一个Listbox,通过 Load All按钮可以把语音文件目录中所有文件都载入到 Listbox这个控件中来,如下图所示:
(c)增加了一个import和export两个功能按钮。为什么要这么操作?是因为作为模板的声音文件,最好还是要标准一点,所以语音文件的录制过程往往是需要反复的,录制,显示,播放,如果不满意要重新录制,如此循环直到最后的结果满意为止。等录制的效果令人满意了,你就可以点击'<<' 按钮把当前录制的语音另存为一个文件。可能在后来的使用过程中,对于先前录制的某个语音文件还不是很满意,可以通过 '>>' 载入之前的语音文件(在Listbox里选取的那个文件),听这个语音有什么问题,看看能不能重新录制达到更好的效果。
(d)右侧上方和右侧中间是识别后呈现的数字图片,和录制的语音显示出来的波形图。
(e)右侧下方是一排的按钮,分别实现语音的'录制','显示','播放','保存'和'识别'。(f)这排按钮的上方专门增加了两个文本编辑框(Tag和Label),这两个编辑框在保存语音文件的时候可以标记你保存的文件名。
*** **
这个语音识别程序的算法简单地说是:不管是刚刚录制的语音信息,还是已经录制好的语音文件,都可以通过Vad完成一次切割,然后利用mfcc函数将语音流转换成一个特征矩阵。利用dtw函数,可以计算刚录制的语音和已经生成好的一组语音的分数(当然是按照1-9的顺序排列的),取分数最小的即是识别的数字。
实现语音识别至少有3种实现方法,一种是(比如用Python)直接调用现成的网络API(谷歌的语音识别据说连川普都可以搞定)来实现语音的文本转换,获取语音对应的数字;第二种是dtw结合mfcc的方法,当前的Matlab程序就用的是