基于matlab的语音识别系统设计

这是上学期跟老师做的一个创新实验项目,当时老师给我推荐了一本书好像叫“matlab扩展编程”,看了真是受益匪浅啊。

花了大半个月做出了这么个小东西,识别出语音命令,执行相应操作,比较幼稚,但识别率是相当高的,识别0到9九个数字

时除了2和8有时分不清外,其他都很好,识别开灯关灯之类的命令几乎没有错过。共享给大家参考参考吧。

这个是begin.m,必须先运行它,用来启动串口,我是用串口通过单片机控制灯亮灭的。

begin.m:

g=serial('com6');
g.InputBufferSize=4096;
g.timeout=0.6;
g.BaudRate=9600;
g.Parity='none';
g.StopBits=1;
g.Terminator='LF';
f.FlowControl='hardware';
fopen(g);
串口要选和单片机相连的口,我这是6。

还有语音命令录制文件

luzhi.m:

fs=8000;
mingling=('关灯开灯闪烁快闪狂闪脉冲');
display('即将录制参考模板语音,请做好准备。')
i=wavrecord(fs,fs);
help vad
help mfcc
clc
for i=1:6
   	fprintf('请说出"%s%s"……', mingling(i*2-1),mingling(i*2));
	yuyin=wavrecord(fs*2,fs,'int16');
    fprintf('正在计算%d的参数……',i-1)
	x = yuyin;
	[x1 x2] = vad(x);
	m = mfcc(x);
	m = m(x1-2:x2-2,:);
	ref(i).mfcc = m;
    clear yuyin x x1 x2
    fprintf('计算完成。\n')
end
clear i m x1 x2
save muban.mat
clear
根据屏幕提示做就行了,注意时间。


然后就可以进行语音识别了,运行shibie.m说出你刚才说的命令就可以了。

shibie.m:

load muban.mat
disp('请发出一个命令:');
x=wavrecord(fs*2,fs,'int16');
[x1 x2] = vad(x);
m = mfcc(x);
m = m(x1-2:x2-2,:);
xcanshu = m;
disp('录音结束');
disp('正在进行模板匹配...');
dist = zeros(1,6);
for j=1:6
    dist(1,j) = dtw(xcanshu, ref(j).mfcc);
end
disp('正在计算匹配结果...')
[d,j] = min(dist(1,:));
fprintf('语音输入的识别结果为:%s%s\n',mingling(2*j-1),mingling(2*j));
fwrite(g,47+j);               %发送命令
fwrite(g,47+j);               %发送命令
%out=fread(g,5,'uint8')      %接受5个数
fprintf('命令已发出');

玩够了别忘了把串口关掉。

tingzhi.m:

fclose(g);
delete(g);
clear

注意里面用到了一些voicebox工具箱的文件,分别是:dwt.m(动态弯折算法),enframe.m(分帧用的),melbank.m(好像是分段用的,我也忘了),mfcc.m(这个是核心文件,马尔科夫模型就在这里面),vad.m(这个好像是显示吧)。

voicebox工具箱网上都有的,我就不上传了,大家自己找找吧,很好找的。



### 基于MATLAB语音识别系统设计与实现 #### 1. 系统概述 语音识别系统的开发涉及多个关键技术环节,包括音频预处理、特征提取、模式匹配以及用户交互界面的设计。在基于MATLAB语音识别系统中,可以充分利用其强大的数值计算能力图形界面工具箱来完成这些任务。 #### 2. 音频预处理 音频预处理是语音识别的第一步,目的是清理原始信号中的噪声并统一数据格式。可以通过MATLAB加载音频文件,并对其进行标准化处理,例如调整采样率剪裁长度[^1]。如果需要进一步提高模型鲁棒性,还可以引入数据增强技术,比如音高移位时间拉伸等方法[^2]。 ```matlab % 加载音频文件 [audioData, fs] = audioread('example.wav'); % 调整采样率为固定值 (e.g., 16kHz) if fs ~= 16000 audioData = resample(audioData, 16000, fs); end % 截取前N秒的数据作为输入片段 segmentLength = round(3 * fs); % 取3秒钟 audioSegment = audioData(1:min(segmentLength, length(audioData))); ``` #### 3. 特征提取 有效的特征对于语音识别至关重要。传统的方法通常依赖声学特性指标,如Mel频率倒谱系数(MFCC)[^1]。现代深度学习框架则倾向于直接从时域波形或频谱图中自动抽取高层次抽象特征[^2]。以下是两种常见方式的具体实现: ##### 方法一:MFCC 提取 ```matlab % 设置 MFCC 参数 windowSize = 25; % ms hopSize = 10; % ms numCoeffs = 13; winSamples = round(windowSize / 1000 * fs); hopSamples = round(hopSize / 1000 * fs); % 使用 mfcc 函数获取特征向量矩阵 [mfccFeatures, ~, t] = mfcc(audioSegment, fs,... 'Window', hamming(winSamples),... 'OverlapLength', winSamples-hopSamples,... 'NumCoeffs', numCoeffs); disp(size(mfccFeatures)); % 显示维度大小 ``` ##### 方法二:梅尔频谱图生成 ```matlab % 创建短时傅里叶变换 STFT 的设置对象 stftParams = stftinit(fs,'Window',hamming(round(.02*fs)),'OverlapLength',round(.01*fs)); % 执行STFT操作得到频谱数据 spectrogramData = abs(stft(audioSegment,stftParams)); melSpectrogram = melSpectrum(spectrogramData,stftParams.fs); imagesc(log10(melSpectrogram')); colorbar; title('Log Mel Spectrogram'); xlabel('Time'); ylabel('Frequency Bands'); ``` #### 4. 模型训练与分类 针对不同的应用场景可以选择合适的建模策略。传统的统计模型如高斯混合模型(GMM)适用于较小规模的任务;而对于复杂场景,则推荐采用深度神经网络(DNN),特别是卷积层结构能很好地捕捉局部空间关联性。 ```matlab layers = [ imageInputLayer([size(melSpectrogram,1) size(melSpectrogram,2) 1]) convolution2dLayer(3,64,'Padding','same') batchNormalizationLayer() reluLayer() maxPooling2dLayer(2,'Stride',2) fullyConnectedLayer(128) softmaxLayer classificationLayer]; options = trainingOptions('sgdm',... 'MaxEpochs',20,... 'MiniBatchSize',32,... 'Shuffle','every-epoch',... 'ValidationData',{testImages,testLabels},... 'Plots','training-progress'); net = trainNetwork(trainImages,trainLabels,layers,options); ``` #### 5. GUI 开发 最后一步是创建友好的用户体验环境——即图形用户界面(GUI)。借助MATLAB自带的应用程序设计器(App Designer),开发者可轻松拖拽控件布局,并绑定后台逻辑脚本函数调用前述各模块流程[^1]。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值