【语音识别】基于matlab动态时间规整(DTW)孤立字语音识别【含Matlab源码 573期】

举报
海神之光 发表于 2022/05/29 23:00:20 2022/05/29
【摘要】 一、DTW简介 一个应用DTW的说话人识别系统如图8-4所示。它是与文本有关的说话人确认系统。它采用的识别特征是BP FG(附听觉特征处理) , 匹配时采用DTW技术。其特点为:①在结构上基本沿用语音识...

一、DTW简介

一个应用DTW的说话人识别系统如图8-4所示。它是与文本有关的说话人确认系统。它采用的识别特征是BP FG(附听觉特征处理) , 匹配时采用DTW技术。其特点为:①在结构上基本沿用语音识别的系统。②利用使用过程中的数据修正原模板,即当在某次使用过程
中某说话人被正确确认时使用此时的输人特征对原模板作加权修改(一般用1/10加权)。
这样可使模板逐次趋于完善。
在这里插入图片描述
采样时间间隔为2.5ms,所存的字音模板数为15x16,即15个说话人各自的16个规定音。建立模板时,每个说话人对各字音各发音10次再经适当平均得到上述的各模板。在确认过程中,要求待确认者在他已知的116个字音中任选2~4个。先任选2个字,将2个字所得的“计分”(距离的倒数)相加,若已超过判决逻辑中所设定的阈值则予以肯定。否则,令待确认者另选16个字中其它字音并将计分加权累计,直到共发4个字音。若仍未达到阈值,则给以拒绝。
这里提供一个典型的实验结果:对于1732个真的待确认者,经此系统的错误拒绝率为
0.6%;对于630个假的待证实者,错误接受率为0.3%。当然,适当改变阈值可以调整这
两种比率。

二、部分源代码

function trimmed_X = my_vad(x)
%端点检测;输入为录入语音,输出为有用信号

Ini = 0.1;          %初始静默时间
Ts = 0.01;          %窗的时长
Tsh = 0.005;        %帧移时长
Fs = 16000;         %采样频率
counter1 = 0;       %以下四个参数用来寻找起始点和结束点
counter2 = 0;
counter3 = 0;
counter4 = 0;
ZCRCountf = 0;      %用于存储过零率检测结果
ZCRCountb = 0;     
ZTh = 40;           %过零阈值
w_sam = fix(Ts*Fs);                   %窗口长度
o_sam = fix(Tsh*Fs);                  %帧移长度
lengthX = length(x);
segs = fix((lengthX-w_sam)/o_sam)+1;  %分帧数
sil = fix((Ini-Ts)/Tsh)+1;            %静默时间帧数
win = hamming(w_sam);

Limit = o_sam*(segs-1)+1;             %最后一帧的起始位置

FrmIndex = 1:o_sam:Limit;             %每一帧的起始位置
ZCR_Vector = zeros(1,segs);           %记录每一帧的过零点数
                                     
%短时过零点
for t = 1:segs
    ZCRCounter = 0; 
    nextIndex = (t-1)*o_sam+1;
    for r = nextIndex+1:(nextIndex+w_sam-1)
        if (x(r) >= 0) && (x(r-1) >= 0)
         
        elseif (x(r) > 0) && (x(r-1) < 0)
         ZCRCounter = ZCRCounter + 1;
        elseif (x(r) < 0) && (x(r-1) < 0)
         
        elseif (x(r) < 0) && (x(r-1) > 0)
         ZCRCounter = ZCRCounter + 1;
        end
    end
    ZCR_Vector(t) = ZCRCounter;
end

%短时平均幅度
Erg_Vector = zeros(1,segs);
for u = 1:segs
    nextIndex = (u-1)*o_sam+1;
    Energy = x(nextIndex:nextIndex+w_sam-1).*win;
    Erg_Vector(u) = sum(abs(Energy));
end

IMN = mean(Erg_Vector(1:sil));  %静默能量均值(噪声均值)
IMX = max(Erg_Vector);          %短时平均幅度的最大值
I1 = 0.03 * (IMX-IMN) + IMN;    %I1,I2为初始能量阈值
I2 = 4 * IMN;
ITL = 100*min(I1,I2);            %能量阈值下限,前面系数根据实际情况更改得到合适结果
ITU = 10* ITL;                  %能量阈值上限
IZC = mean(ZCR_Vector(1:sil));  
stdev = std(ZCR_Vector(1:sil)); %静默阶段过零率标准差

IZCT = min(ZTh,IZC+2*stdev);    %过零率阈值
indexi = zeros(1,lengthX);      
indexj = indexi;               
indexk = indexi;
indexl = indexi;

%搜寻超过能量阈值上限的部分
for i = 1:length(Erg_Vector)
    if (Erg_Vector(i) > ITU)
        counter1 = counter1 + 1;
        indexi(counter1) = i;
    end
end
ITUs = indexi(1);        %第一个能量超过阈值上限的帧

%搜寻能量超过能量下限的部分
for j = ITUs:-1:1
    if (Erg_Vector(j) < ITL)
        counter2 = counter2 + 1;
        indexj(counter2) = j;
    end
end
start = indexj(1)+1;    %第一级判决起始帧

Erg_Vectorf = fliplr(Erg_Vector);%将能量矩阵关于中心左右对称,如果是一行向量相当于逆序 

%重复上面过程相当于找结束帧
for k = 1:length(Erg_Vectorf)
    if (Erg_Vectorf(k) > ITU)
        counter3 = counter3 + 1;
        indexk(counter3) = k;
    end
end
%初始化DTW判别矩阵
Scores1 = zeros(1,N);                
Scores2 = zeros(1,N);
Scores3 = zeros(1,N);


%加载模板数据
s1 = load('Vectors1.mat');
fMatrixall1 = struct2cell(s1);
s2 = load('Vectors2.mat');
fMatrixall2 = struct2cell(s2);
s3 = load('Vectors3.mat');
fMatrixall3 = struct2cell(s3);


%计算DTW
for i = 1:N
    fMatrix1 = fMatrixall1{i,1};
    fMatrix1 = CMN(fMatrix1);
    Scores1(i) = myDTW(fMatrix1,rMatrix);
end

for j = 1:N
    fMatrix2 = fMatrixall2{j,1};
    fMatrix2 = CMN(fMatrix2);
    Scores2(j) = myDTW(fMatrix2,rMatrix);
end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

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

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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