【语音识别】基于matlab VQ特定人孤立词语音识别【含Matlab源码 536期】

举报
海神之光 发表于 2022/05/29 04:01:16 2022/05/29
【摘要】 一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【语音识别】基于matlab VQ特定人孤立词语音识别【含Matlab源码 536期】 获取代码方式2: 通过订阅紫极神光博客付费专栏,凭支...

一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【语音识别】基于matlab VQ特定人孤立词语音识别【含Matlab源码 536期】

获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、矢量量化(VQ)说话人识别简介

目前自动说话人识别的方法主要是基于参数模型的HMM的方法和基于非参数模型的VQ的方法。1992年, 日本人Matsui和Fur ui主要从对语声波动的鲁棒性方面对基于VQ的方法和各态历经的离散和连续的HMM方法进行了比较。他们发现连续的各态历经HMM方法比离散的各态历经HMM方法优越, 当可用于训练的数据量较小时, 基于VQ的方法比连续的HMM方法有更大的鲁棒性。同时, 基于VQ的方法比较简单, 实时性也较好。因此,直到目前为止,基于VQ的说话人识别方法,仍然是最常用的识别方法之一。
应用VQ的说话人识别系统如图8-3所示。完成这个系统有两个步骤:一是利用每个说话人的训练语音,建立参考模型码本;二是对待识别话者的语音的每一帧和码本码字之间进行匹配。由于VQ码本保存了说话人个人特性,这样我们就可以利用VQ法来进行说话人识别。在VQ法中模型匹配不依赖于参数的时间顺序, 因而匹配过程中无需采用DTW技术;
而且这种方法比应用DTW方法的参考模型存储量小, 即码本码字小。
在这里插入图片描述
我们可以将每个待识别的说话人看作是一个信源,用一个码本来表征,码本是从该说话
人的训练序列中提取的特征矢量聚类而生成的,只要训练的数据量足够,就可以认为这个码本有效地包含了说话人的个人特征,而与说话的内容无关。识别时,首先对待识别的语音段提取特征矢量序列,然后用系统已有的每个码本依次进行矢量量化,计算各自的平均量化失真。选择平均量化失真最小的那个码本所对应的说话人作为系统识别的结果。
应用VQ的说话人识别过程的步骤如下。
(1)训练过程
1)从训练语音提取特征矢量,得到特征矢量集。
2) 通过LBG算法生成码本。
3)重复训练修正优化码本。
4)存储码本。
(2)识别过程
1)从测试语音提取特征矢量序列X,X,,…,Xu。
2)由每个模板依次对特征矢量序列进行矢量量化,计算各自的平均量化误差
在这里插入图片描述
3)选择平均量化误差最小的码本所对应的说话人作为系统的识别结果。
由于人所发的语音是随着生理、心理和健康的状况变化的,不同时间下的语音会有所不
同。因此,如果说话人识别系统的训练时间与使用时间相差过长,会使系统的性能明显下
降。为了维护系统的性能,一种可取的办法是,当某次识别正确时,利用此次测试数据修正原来的模板,让系统自动跟踪说话人语音的变化。
在应用VQ法进行说话人识别时,失真测度的选择将直接影响到聚类结果,进而影响说话人识别系统的性能。失真测度的选择要根据所使用的参数类型来定,在说话人识别采用的矢量量化中,较常用的失真测度是在8.3.2节介绍的欧氏距离测度和加权欧氏距离测度。在基于矢量量化的说话人识别方法中,为了提高识别系统的性能,还必须考虑VQ码本的优化问题和快速搜索算法的应用,以此来提高系统的识别精度和识别速度。

二、部分源代码

17 / 18
% Demo script that generates all graphics in the report and demonstrates our results.
[s6 fs6] = wavread('s6.wav');
[s1 fs1] = wavread('s1.wav');
%Question 2
disp('> Question 2:画出原始语音波形');
t = 0:1/fs1:(length(s1) - 1)/fs1;
plot(t, s1), axis([0, (length(s1) - 1)/fs1 -0.4 0.5]);
title('原始语音s1的波形');
xlabel('时间/s');
ylabel('幅度')
pause 
close all
%Question 3 (linear)
disp('> Question 3: 画出线性谱');
M = 100;%当前帧数
N = 256;%帧长
frames = blockFrames(s1, fs1, M, N);%分帧
t = N / 2;
tm = length(s1) / fs1;
subplot(121);
imagesc([0 tm], [0 fs1/2], abs(frames(1:t, :)).^2), axis xy;
title('能量谱(M = 100, N = 256)');
xlabel('时间/s');
ylabel('频率/Hz');
colorbar;
%Question 3 (logarithmic)
disp('> Question 3: 画出对数谱');
subplot(122);
imagesc([0 tm], [0 fs1/2], 20 * log10(abs(frames(1:t, :)).^2)), axis xy;
title('对数能量谱(M = 100, N = 256)');
xlabel('时间/s');
ylabel('频率/Hz');
colorbar;
D=get(gcf,'Position');
set(gcf,'Position',round([D(1)*.5 D(2)*.5 D(3)*2 D(4)*1.3]))
pause
close all
%Question 4
disp('> Question 4: 画出不同帧长语谱图');
lN = [128 256 512];
u=220;
for i = 1:length(lN)
    N = lN(i);
    M = round(N / 3);
    frames = blockFrames(s1, fs1, M, N);
    t = N / 2;
    temp = size(frames);
    nbframes = temp(2);
    u=u+1;
    subplot(u)
    imagesc([0 tm], [0 fs1/2], 20 * log10(abs(frames(1:t, :)).^2)), axis xy;
    title(sprintf('能量对数谱(第 = %i帧, 帧长 = %i, 帧数 = %i)', M, N, nbframes));
    xlabel('时间/s');
    ylabel('频率/Hz');
    colorbar
end
D=get(gcf,'Position');
set(gcf,'Position',round([D(1)*.5 D(2)*.5 D(3)*1.5 D(4)*1.5]))
pause
close all
%Question 5
disp('> Question 5: Mel空间');
plot(linspace(0, (fs1/2), 129), (melfb(20, 256, fs1))');
title('Mel滤波');
xlabel('频率/Hz');
pause
close all
%Question 6
disp('> Question 6: 修正谱');
M = 100;
N = 256;
frames = blockFrames(s1, fs1, M, N);
n2 = 1 + floor(N / 2);
m = melfb(20, N, fs1);
z = m * abs(frames(1:n2, :)).^2;
t = N / 2;
tm = length(s1) / fs1;
subplot(121)
imagesc([0 tm], [0 fs1/2], abs(frames(1:n2, :)).^2), axis xy;
title('原始能量谱');
xlabel('时间/s');
ylabel('频率/Hz');
colorbar;
subplot(122)
imagesc([0 tm], [0 20], z), axis xy;
title('通过mel倒谱修正后的能量谱');
xlabel('时间/s');
ylabel('滤波器数目');
colorbar;
D=get(gcf,'Position');
set(gcf,'Position',[0 D(2) D(3)*2 D(4)])
pause
close all
%Question 7
disp('> Question 7: 2D plot of accustic vectors');
c1 = mfcc(s1, fs1);
c2 = mfcc(s2, fs2);
plot(c1(5, :), c1(6, :), 'or');
hold on;
plot(c2(5, :), c2(6, :), 'xb');
xlabel('5th Dimension');
ylabel('6th Dimension');
legend('说话人1', '说话人2');
title('2D plot of accoustic vectors');
pause
close all
%Question 8
disp('> Question 8: 画出已训练好的VQ码本')
d1 = vqlbg(c1,16);
d2 = vqlbg(c2,16);
plot(c1(5, :), c1(6, :), 'xr')
hold on

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019.
[2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/114877155

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。