• 【VS开发】【智能语音处理】特定人语音识别算法—DTW算法


    DTW(动态时间弯折)算法原理:基于动态规划(DP)的思想,解决发音长短不一的模板匹配问题。相比HMM模型算法,DTW算法的训练几乎不需要额外的计算。所以在孤立词语音识别中,DTW算法仍得到广泛的应用。

    在训练和识别阶段,首先采用端点检测算法确定语音的起点和终点。对于参考模板{R(1),R(2),…,R(m),…,R(M)}R(m)为第m帧的语音特征矢量。对于测试模板{T(1),T(2),…,T(n),…,T(N)}T(n)为测试模板的第n帧的语音特征矢量。参考模板与测试模板一般采用类型的特征矢量、相同的帧长、相同的窗函数和相同的帧移。

    对于测试和参考模板TR,它们之间的相似度之间的距离D[TR],距离越小则相似度越高。在DTW算法中通常采用欧氏距离表示。对于NM不相同的情况,需要考虑T(n)R(m)对齐。一般采用动态规划(DP)的方法将实现TR的映射。

    将测试模板的各个帧号n=1~N在一个二维直角坐标系中的横轴上标出,参考模板的各帧号m=1~M在纵轴上标出,通过这些表示帧号的整数坐标画出一些纵横线即可形成一个网格,网格中的每一个交叉点(n,m)表示测试模式中某一帧与训练模式中某一帧的交汇点。DP算法可以归结为寻找一条通过此网格中若干格点的路径,路径通过的格点即为测试和参考模板中进行距离计算的帧号。所选的路径必定是从左下角出发,在右上角结束。

    为了使路径不至于过分倾斜,可以约束斜率在0.5~2的范围内,如果路径已通过格点特定人语音识别算法—DTW算法

    特定人语音识别算法—DTW算法

    搜索路径的方法如下:搜索从特定人语音识别算法—DTW算法点出发,计算每条路径达到特定人语音识别算法—DTW算法点时的总的积累距离,具有最小累积距离者即为最佳路径。若用特定人语音识别算法—DTW算法代表此格点,并将通过该格点之路径延伸而通过特定人语音识别算法—DTW算法,这些此路径的积累距离为:

    特定人语音识别算法—DTW算法

    这样就可以从特定人语音识别算法—DTW算法=(1,1)出发搜索特定人语音识别算法—DTW算法,再搜索特定人语音识别算法—DTW算法…..,对每个特定人语音识别算法—DTW算法都存储相应的前一格点特定人语音识别算法—DTW算法及相应的帧匹配距离特定人语音识别算法—DTW算法。搜索到特定人语音识别算法—DTW算法时,只保留一条最佳路径。如果有必要的话,通过逐点向前寻找就可以求得整条路径。这套DP算法便是DTW算法。

    0~9的数字语音进行测试和识别,识别结果如下:

    正在进行模板匹配...

    正在计算匹配结果...

    测试模板1的识别结果为:1

    测试模板2的识别结果为:8

    测试模板3的识别结果为:3

    测试模板4的识别结果为:4

    测试模板5的识别结果为:5

    测试模板6的识别结果为:6

    测试模板7的识别结果为:7

    测试模板8的识别结果为:8

    测试模板9的识别结果为:9

    测试模板10的识别结果为:10

    由上可知,除测试模板2误判外,其它数字语音都能正确识别。

    DTW算法的MATLAB程序:

    function dist = dtw( t,r )

    n=size(t,1);

    m=size(r,1);

    %%帧匹配距离距阵

    d=zeros(n,m);

     

    for i=1:n

        for j=1:m

            d(i,j)=sum((t(i,:)-r(j,:)).^2);

        end

    end

     

    %%累积距离矩阵

    D=ones(n,m)*realmax;

    D(1,1)=d(1,1);

    %%动态规划

    for i=2:n

        for j=1:m

            D1=D(i-1,j);

            if j>1

                D2=D(i-1,j-1);

            else

                D2=realmax;

            end

           

            if j>2

                D3=D(i-1,j-2);

            else

                D3=realmax;

            end

            D(i,j)=d(i,j)+min([D1,D2,D3]);

        end

    end

    dist=D(n,m);

    end

     

    测试程序:

    disp('正在计算参考模板的参数...')

    for i=1:10

        fname=sprintf('test1\�.wav',i-1);

        [x fs]=wavread(fname);

        [x1 x2]=vad(x,fs);

        m=mfcc(x);

        m=m(x1-2:x2-2,:);

        ref(i).mfcc=m;

    end

     

    disp('正在计算测试模板的参数...')

    for i=1:10

        fname=sprintf('train1\�.wav',i-1);

        [x fs]=wavread(fname);

        [x1 x2]=vad(x,fs);

        m=mfcc(x);

        m=m(x1-2:x2-2,:);

        test(i).mfcc=m;

    end

     

    disp('正在进行模板匹配...')

    dist=zeros(10,10);

    for i=1:10

        for j=1:10

            dist(i,j)=dtw(test(i).mfcc,ref(j).mfcc);

        end

    end

     

    disp('正在计算匹配结果...')

    for i=1:10

        [d,j]=min(dist(i,:));

        fprintf('测试模板%d的识别结果为:%d ',i,j);

    end

  • 相关阅读:
    C语言文法
    实验一
    词法分析
    py中文词频统计
    py字符串练习
    py画了个国旗
    熟悉常用的Linux操作
    大数据概述
    实验三、 递归下降分析程序实验
    简易c语言LL(1)文法
  • 原文地址:https://www.cnblogs.com/huty/p/8518447.html
Copyright © 2020-2023  润新知