第四堂课布置了一个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程序就用的是这种方法;第三种方法就是李开复在微软实现的,利用VC可以调用微软自带的已经开发好的工具包。

我们直接切入正题,关键是初始化的时候要做的工作,'录制语音','显示'语音的波形图,保存语音文件和'语音识别'这几个模块的信息。

初始化功能模块:

我们程序的名字叫做DigitRecognization,所以需要预置的一些变量和最初生成界面的一些操作都是在

DigitRecognization_OpeningFcn(hObject, eventdata, handles, varargin)这个函数中完成

% --- Executes just before DigitRecognization is made visible.

function DigitRecognization_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn.

% hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% varargin command line arguments to DigitRecognization (see VARARGIN)

handles.CWPath = fileparts(mfilename('fullpath'));

handles.ImageFolderName = 'DigitImages';

handles.ImagePath = sprintf('%s\%s', handles.CWPath, handles.ImageFolderName);

handles.SoundFolderName = 'DigitSounds';

handles.SoundPath = sprintf('%s\%s', handles.CWPath, handles.SoundFolderName);

set(handles.edit_CWPath, 'String', handles.SoundPath);

%

handles.TagSaving = 'digit';

handles.LabelSaving = '8';

imgFileName = sprintf('%s_%s.bmp', handles.TagSaving, handles.LabelSaving);

imgPathName = sprintf('%s\%s\%s', handles.CWPath, handles.ImageFolderName, imgFileName);

ImgInitialize = imread(imgPathName, 'bmp');

ImgA = im2double(ImgInitialize);

h = image('CData', ImgA);

set(handles.axes_DigitImage, 'visible', 'off');

set(handles.axes_DigitImage, 'ydir', 'reverse');

% set(handles.axes_DigitImage, 'xlim', [0 200], 'ylim', [0 200]);

% Choose default command line output for DigitRecognization

handles.output = hObject;

% Update handles structure

guidata(hObject, handles);

简单的说,以上代码是要确定当前程序的目录,图片文件夹和声音文件夹,然后一开始要讨个吉利,呈现一个'8' O(∩_∩)O~

录制语音功能模块:

% --- Executes on button press in pushbutton_Recording.

function pushbutton_Recording_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton_Recording (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

ChannelNo = 1;

Fs = 16000;

TimePeriod = 2;

handles.DataRecord = wavrecord(TimePeriod * Fs, Fs, ChannelNo);

handles.Fs16000 = Fs;

% Update handles structure

guidata(hObject, handles);

这个模块要先设置好录制语音的格式参数,比如,单个通道,采样频率是16000Hz,时间是2秒,然后利用 wavrecord函数来录制256比特率的wav文件。我们找到的语音识别工具包,往往会针对特定的比特率开发的,因此在录制的时候在参数设置上最好能保证录制的语音文件和之前找到的语音识别工具包里边的语音文件的格式是一致的,尤其是这个比特率要保持一致。

显示波形图功能模块:

录制好语音文件之后,最好是能把它show出来,'显示'语音的波形图会是一件相当酷的事情。

% --- Executes on button press in pushbutton_Showing.

function pushbutton_Showing_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton_Showing (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

FS = handles.Fs16000;

Y = handles.DataRecord;

Y_length = length(handles.DataRecord);

t=0:1/FS:(Y_length-1)/FS;

plot(handles.axes_MonoSound,t,Y);

set(handles.axes_MonoSound,'Xlim',[0 2],'Ylim',[-1 1]) %通过句柄操作

语音文件保存功能模块:

% --- Executes on button press in pushbutton_Saving.

function pushbutton_Saving_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton_Saving (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

FS = handles.Fs16000;

Y = handles.DataRecord;

TagSaving = get(handles.edit_Tag, 'String');

LabelSaving = get(handles.edit_Label, 'String');

wavFileName = sprintf('%s%s.wav', TagSaving, LabelSaving);

wavPathName = sprintf('%s\%s', handles.SoundPath, wavFileName);

fprintf('%s',wavPathName)

wavwrite(Y,FS,wavPathName);

语音识别功能模块:

% --- Executes on button press in pushbutton_Recognizing.

function pushbutton_Recognizing_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton_Recognizing (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

%

ncoeff = 13;

FS = handles.Fs16000;

Y = handles.DataRecord;

speechIn_VAD = myVAD(Y); %Speech endpoint trimming

yes_mfccMatrix = mfccf(ncoeff, speechIn_VAD, FS); %MFCC coefficients are

WavPathNames = sprintf('%s\*.wav', handles.SoundPath);

dStruct = dir(WavPathNames);

dtwScores = zeros(1,length(dStruct)) - 1;

for i = 1:length(dStruct)

tmpWavPathName = sprintf('%s\%s', handles.SoundPath, dStruct(i).name);

fprintf('%s ', tmpWavPathName)

[tmpSpeechIn, tmpFS] = wavread(tmpWavPathName);

tmpSpeechIn_VAD = myVAD(tmpSpeechIn);

tmp_mfccMatrix = mfccf(ncoeff, tmpSpeechIn_VAD, tmpFS);

dtwScores(1,i) = myDTW(yes_mfccMatrix, tmp_mfccMatrix);

end

minScore = min(dtwScores);

recognizeNumber = find(dtwScores == minScore)

imgFileName = sprintf('digit_%d.bmp', recognizeNumber);

imgPathName = sprintf('%s\%s', handles.ImageFolderName, imgFileName);

ImgInitialize = imread(imgPathName, 'bmp');

ImgA = im2double(ImgInitialize);

h = image('CData', ImgA);

set(handles.axes_DigitImage, 'visible', 'off');

set(handles.axes_DigitImage, 'ydir', 'reverse');

这段代码的意思是,先把录制的语音信息转换成一个特征矩阵,然后在循环里依次与已经录制的语音文件转换得到的特征矩阵进行dtw的计算,然后取这一组数据中的最小值对应的位置即是我们要找的数字(dir获取的结构体里边的文件名是按照digit1.wav digit2.wav ... digit9.wav的顺序排好的,所以哪个位置值最小就说明是哪个数字。这也可以用来解释为什么我没有做排序,以及为什么我把digit0.wav给删了)。

这里的参数ncoeff 为什么是13?这个13是LCJ告诉我的,据说他和YX两个人用了整整两天时间才试出来这个参数应该怎么修改,膜拜!! mfcc最后得到的矩阵是39列,因此这里用的是13,(其实我们也不知道为什么是13,这可能是Matlab语音识别工具包最难的难点了)。

三个关键词,第一个是 'dtw',第二个是'vad',第三个是'mfcc'。一起百度下这三个关键词会有如下发现:

DTW主要是应用在孤立词识别的算法,用来识别一些特定的指令比较好用,这个算法是基于DP(动态规划)的算法基础上发展而来的。

Vad函数是用来判断语音的开始和结束时间点的,判断方法就是通过音量的大小做一个阈值判定,在时域上很简单就能判定,如下图所示。

在进行语音识别的时候,我们需要寻找一个特征矢量,在语音识别中很多采用MFCC,也就是梅尔倒谱这个参数作为特征矢量。

这里最关键的是找到靠谱的涉及到 dtw, vad, 和 mfcc的工具包。我是在LCJ的推荐下,从Matlab中文论坛上找到的这个工具包,网址如下:

http://www.ilovematlab.cn/thread-22231-1-1.html

具体需要用到的函数如下图所示:

这里有一个小的trick,就是那些数字图片是怎么批量制作的,我用的是VS2010开发的文本转图片的小程序,上个图:

[本帖最后由 psybestwish 于 2015-10-15 15:22 编辑]

如何利用Matlab完成数字1-9的语音识别相关推荐

  1. 对时域连续信号用matlab离散,数字信号处理上机实验一 离散时间信号的时域分析...

    实验1 离散时间信号的时域分析 一.实验目的 (1)了解MATLAB语言的主要特点及作用: (2)熟悉MATLAB主界面,初步掌握MATLAB命令窗和编辑窗的操作方法: (3)了解常用时域离散信号及其 ...

  2. python猜数字1001untitled_如何利用Matlab GUI制作猜数字游戏

    第二堂课布置了一个Mission Impossible:如何利用Matlab GUI制作猜数字游戏 这个任务对很多人来说会非常困难,首先要面对的是 Matlab GUI的机制,这是完全未知的机制,在面 ...

  3. 数字图像处理拓展题目——利用Matlab实现动态目标检测 二帧差法、ViBe法、高斯混合模型法,可应用于学生递东西行为检测

    1.二帧差法实现动态目标检测 先上效果图: 利用GUI界面显示出来效果图为: 实现流程 1.利用matlab中的VideoReader函数读取视频流. 2.帧差法:获得视频帧数,用for循环对图像每相 ...

  4. matlab对图像进行增强,利用matlab对图像进行增强处理.doc

    利用matlab对图像进行增强处理.doc 郑州轻工业学院课程设计任务书题目利用MATLAB对图像进行增强处理专业.班级电子信息工程07级学号姓名主要内容.基本要求.主要参考资料等:主要内容:在图像形 ...

  5. 坎蒂雷赋权法 matlab,干货 | 利用MATLAB实现FMCW雷达中的常用角度估计方法

    其中在介绍角度估计中,通过对接收差频信号在快慢时间维度的扩展,增加了空域的信息.扩展后的接收差频信号可以表示为 其中k表示接收天线的个数,d为天线间距. 在"干货|利用MATLAB实现FMC ...

  6. idft重建图像 matlab_利用 MATLAB 编程,打开一幅图像,对其进行 DFT 变换,并置其不同区域内的系数为零,进行 IDFT ,观察其输出效果。_学小易找答案...

    [连线题]请对正确的快键键连线 [判断题]板书是指教师在课堂黑板或白板上书写,将教学内容形象.直观.简洁地传授给学生.清晰.流畅.快速的粉笔书写是课堂板书的基本功. [其它]利用 MATLAB 编程, ...

  7. 基于matlab的绘图设计,matlab课程设计---利用MATLAB仿真软件进行绘图

    matlab课程设计---利用MATLAB仿真软件进行绘图 课程设计任务书课程设计任务书 题题 目目 利用利用 MATLABMATLAB 仿真软件进行绘图仿真软件进行绘图 初始条件初始条件 仿真软件 ...

  8. 利用MATLAB对数据进行切片并绘制图表

    利用MATLAB对数据进行切片并绘制图表 文章目录 利用MATLAB对数据进行切片并绘制图表 1 读取txt文件 2 对矩阵进行切片,提取信息 3 使用MATLAB绘图 4 附录--完整代码 1 读取 ...

  9. matlab逻辑电路图,基于.matlab的数字逻辑电路仿真.doc

    技术资料 技术资料 共享知识 共享知识 PAGE II XXX 毕业设计(论文) 专 业: 题 目: 作 者 姓 名: 导师及职称: 导师所在单位: 2011年 6 月 15 日 XXX 本科毕业设计 ...

最新文章

  1. 软件破解工具整理收集
  2. java连接kafka api_Kafka-JavaAPI(Producer And Consumer)
  3. LeetCode 78 子集 中等难度
  4. Android的Application的生命周期方法
  5. 把数据保存到数据库附加表 `XX_addonarticle` 时出错,Duplicate entry 'X' for key 'PRIMARY'...
  6. poj-1659-Frogs Neighborhood-(图论-是否可图)
  7. 节约里程法java代码_患者,男,70岁,有多年排尿困难,呈淋漓状,近2年来双侧腹股沟区出现半年圆形肿块,站立时明显,平卧后消失,体检时压迫内环肿块仍出现,诊断为...
  8. C/C++ ltoa函数 - C语言零基础入门教程
  9. linux内核makefile详解,linux kernel编译Makefile和Kconfig,make menuconfig详解
  10. 【Java】关于Java编程软件idea快捷键的使用
  11. vue 打印出git提交信息_VUE项目构建打包生成Git信息(VERSION和COMMITHASH文件)
  12. Linux Kernel代码艺术——数组初始化
  13. 系统升级时,数据库脚本执行注意事项,血的教训
  14. 动态将ASPX生成HTML网页并将网页导出PDF
  15. 台式电脑怎么组装步骤_详细教您台式电脑如何快速组装
  16. 【兴趣书签】让人深陷其中的科幻小说
  17. 计算机主机内有的硬件有哪些,电脑主机内有哪些硬件
  18. 如何进行产品运营数据分析?
  19. toFixed() is not a function toFixed方法数字类型才能使用
  20. 计算机excel怎么添加实线边框,Excel中自动添加边框线条的方法!学会效率翻倍!你确定不学?...

热门文章

  1. 分布式链路追踪(Sleuth、Zipkin)
  2. CSS 小结笔记之伸缩布局 (flex)
  3. JAVA受检异常和非受检异常举例
  4. addLoadEvent方法解析
  5. java中得到文件MIME类型的几种方法(转)
  6. (转)C# Color类图示
  7. 父窗口、子窗口和Silverlight之间的相互调用
  8. I00020 计算卡特兰数函数
  9. 试除法计算最小的N个素数
  10. matlab 高阶(二) —— 数值、溢出问题的解决