一、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:segsZCRCounter = 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;endendZCR_Vector(t) = ZCRCounter;
end%短时平均幅度
Erg_Vector = zeros(1,segs);
for u = 1:segsnextIndex = (u-1)*o_sam+1;Energy = x(nextIndex:nextIndex+w_sam-1).*win;Erg_Vector(u) = sum(abs(Energy));
endIMN = 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:1if (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:NfMatrix1 = fMatrixall1{i,1};fMatrix1 = CMN(fMatrix1);Scores1(i) = myDTW(fMatrix1,rMatrix);
endfor j = 1:NfMatrix2 = fMatrixall2{j,1};fMatrix2 = CMN(fMatrix2);Scores2(j) = myDTW(fMatrix2,rMatrix);
end

三、运行结果

四、matlab版本及参考文献

1 matlab版本
2014a

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

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

  1. 【Matlab语音分析】语音信号分析【含GUI源码 1718期】

    一.代码运行视频(哔哩哔哩) [Matlab语音分析]语音信号分析[含GUI源码 1718期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊,郑铁 ...

  2. 【Matlab生物电信号】生物电信号仿真【含GUI源码 684期】

    一.代码运行视频(哔哩哔哩) [Matlab生物电信号]生物电信号仿真[含GUI源码 684期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]董兵,超于毅,李 ...

  3. 【Matlab身份证识别】身份证号码识别【含GUI源码 014期】

    一.代码运行视频(哔哩哔哩) [Matlab身份证识别]身份证号码识别[含GUI源码 014期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  4. 【Matlab车牌识别】停车计费系统【含GUI源码 735期】

    一.代码运行视频(哔哩哔哩) [Matlab车牌识别]停车计费系统[含GUI源码 735期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MATLA ...

  5. 【Matlab水果识别】自助水果超市【含GUI源码 594期】

    一.代码运行视频(哔哩哔哩) [Matlab水果识别]自助水果超市[含GUI源码 594期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]倪云峰,叶健,樊娇娇 ...

  6. Python语音基础操作--10.1基于动态时间规整(DTW)的孤立字语音识别试验

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  7. dynamic time warping matlab,动态时间规整(Dynamic Time Warping)

    本文知识简单的介绍DTW算法的目的和实现.具体的DTW可以参考一下文献: 离散序列的一致性度量方法:动态时间规整(DTW)  http://blog.csdn.net/liyuefeilong/art ...

  8. 【Matlab语音加密】语音信号加密解密(带面板)【含GUI源码 181期】

    一.代码运行视频(哔哩哔哩) [Matlab语音加密]语音信号加密解密(带面板)[含GUI源码 181期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆 ...

  9. 【Matlab语音处理】声音信号频谱分析仪【含GUI源码 325期】

    一.代码运行视频(哔哩哔哩) [Matlab语音处理]声音信号频谱分析仪[含GUI源码 325期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊, ...

  10. 【Matlab语音隐写】DCT+DWT音频数字水印嵌入提取【含GUI源码 836期】

    一.代码运行视频(哔哩哔哩) [Matlab语音隐写]DCT+DWT音频数字水印嵌入提取[含GUI源码 836期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1 ...

最新文章

  1. python四大软件-9个使用Python的世界级软件公司
  2. 精准控制PWM脉冲的频率和数量
  3. 算法练习day19——190410(数组中重复的数字、替换空格、从尾到头打印链表)
  4. 【Java代码】使用双冒号 :: 简洁代码及方法引用(静态方法+构造方法+实例方法+函数式编程举例)
  5. python程序移植到linux,如何使python或perl脚本可移植到Linux和Windows?
  6. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组
  7. c语言判断一个已知的二叉树是否是二叉排序树_10584 二叉树怎样序列化才能重建...
  8. 【JVM】通过javap命令分析Java汇编指令
  9. 深度学习《CGAN模型》
  10. 接力,智能指针也麻烦
  11. 如何利用nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查
  12. django允许跨域请求配置
  13. Eclipse开启或取消快速导航栏(toggle breadcrumb)
  14. python-最速下降法
  15. 苹果蓝牙耳机使用说明_苹果蓝牙耳机怎么用
  16. 根据Box-Muller变换原理利用均匀分布的随机变量生成二维柯西分布
  17. 扑克牌(ArrayList)
  18. 机器学习算法的要点(附 Python 和 R 代码)
  19. 计算机的隐藏游戏怎么找回,文件夹隐藏了怎么恢复,电脑屏幕上文件夹隐藏了怎么恢复...
  20. 开关电源空载吱吱声_开关电源变压器工作时为什么出现吱吱声?

热门文章

  1. windows部署PHP开发的cms系统
  2. Date类型之组件方法
  3. Oracle join连接的使用
  4. 2016项目经验总结
  5. 在Java中导出word、excel格式文件时JSP页面头的设置
  6. 算法与数据结构 第3章 高级排序算法中 归并算法改进
  7. matlab方差分析
  8. Atitit 为什么oracle这类大型数据库比mysql的性能机制目录1. 分区机制差别 11.1. Join算
  9. Atitit Java内容仓库(Java Content Repository,JCR)的JSR-170 文件存储api标准 目录 1. Java内容仓库 1 2. Java内容仓库 2 2.1.
  10. Atitit 软件运行环境平台的变迁 attilax大总结 1.1.Native os时代 1.2.Vm时代 java net php 1.3.Script时代 js node。js 1.4.B