【语音识别】基于适量量化(VQ)实现说话人门禁识别附GUI

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

说话人识别技术是语音识别领域的一项重要研究内容,它能够根据提取的有效反映人个性特征的参数进行身份识别.说话人识别的过程为:语音信号的预处理,语音信号的特征提取,说话人模型的建立与模型匹配,判决.基于VQ的语音识别技术在孤立词语的语音识别系统中有较高的识别能力.本文采用LBG算法设计每个待识别语音的码本,码本是从该说话人的训练序列中提取MFCC特征矢量聚类而生成.通过计算其所有帧的VQ失真累积值,把具有最小累积失真值的输入语音信号对应的参考类别作为识别判定的结果,从而识别特定人的语音.与典型的HMM和NN识别算法相比,该方法复杂度低,系统资源消耗少而识别率高,适合在手机,PDA等资源有限的系统中使用.

⛄ 部分代码

function new_create_vq_books()

% clc,clear

%完成说话人识别的训练和匹配

k=8;%LBG算法产生k个中心,这里根据lbg算法原理,只能设置为2^n 形式,比如4,8,16,32,...数值越大计算越慢

files=dir('./data/train/');

files_names={files.name};

N=length(files_names)-2;

% N=23;%N个说话人

%文件路径为:./data/train/

for i=1:N

    s=['./data/train/ID',num2str(i),'.wav'];

    [x,fs]=audioread(s);

    x=x/max(x);%对语音归一化

    %预加重,消除直流分量

    mel=my_mfcc(x,fs)';%每列为一个数据,返回一个39*352的mfcc矩阵

    v=lbg(mel,k);

    u{i}=[v(1:k).mea];

end

save vq_books.mat u

% fprintf('VQ码表生成完毕,请继续运行  vq_speaker_test.m  文件测试说话人识别结果~~~\n')

%其他操作函数,用于计算 欧氏距离 和 lbg 聚类

function v=lbg(x,k)

%lbg:完成lbg均值聚类算法

% lbg(x,k) 对输入样本x,分成k类,即聚类中心。其中,x为row*col矩阵,每一列为一个样本,

% 每个样本有row个元素。

% [v1 v2 v3 ...vk]=lbg(...)返回k个分类,其中vi为结构体,vi.num为该类

% 中含有元素个数,vi.ele(i)为第i个元素值,vi.mea为相应类别的均值

[row,col]=size(x);

%u=zeros(row,k);%每一列为一个中心值

epision=0.03;%选择epision参数

delta=0.01;     %LBG算法的阈值 sigma

%u2=zeros(row,k);

%LBG算法产生k个中心

u=mean(x,2);%第一个聚类中心,总体均值,即对每一维mfcc参数求均值,其数值为39*1

for i3=1:log2(k)

    %分裂,这里log2(k)表示 分裂几次

    u=[u*(1-epision),u*(1+epision)];%分裂的过程

    %time=0;

    D=0;

    DD=1;

    %开始迭代,看是否满足条件

    while abs(D-DD)/DD>delta   %sum(abs(u2(:).^2-u(:).^2))>0.5&&(time<=80)   %u2~=u

        DD=D;

        for i=1:2^i3            %初始化

            v(i).num=0;

            v(i).ele=zeros(row,1);

        end

        for i=1:col %第i个样本

            distance=dis(u,x(:,i));%第i个样本到各个中心的距离

            [val,pos]=min(distance);

             v(pos).num=v(pos).num+1;%元素的数量加1

            if v(pos).num==1    %ele为空

                v(pos).ele=x(:,i);

            else

                v(pos).ele=[v(pos).ele,x(:,i)];

            end

        end

        for i=1:2^i3 

            u(:,i)=mean(v(i).ele,2);%新的均值中心

            for m=1:size(v(i).ele,2)

                D=D+sum((v(i).ele(m)-u(:,i)).^2);

            end

        end

    end

end

%u=u;

for i=1:k  %更新数值

    v(i).mea=u(:,i);

end

function dis=dis(u,xi)

%DIS:计算欧式距离

% dis=dis(u,xi):计算xi到u的各个列向量的欧式距离,返回到dis中

% u的行数和向量xi的维数必须一致

if isvector(xi)&&(size(u,1)~=length(xi))

    error('xi必须为向量且维数必须等于u的行数')

end

k=size(u,2);

xi=xi(:);

dis=zeros(1,k);

for i=1:k

    ui=u(:,i);

    dis(i)=sum((xi-ui).^2);

end

⛄ 运行结果

⛄ 参考文献

[1] 张玉娇. 基于矢量量化(VQ)的说话人识别的研究[D]. 南京理工大学, 2015.

[2] 吕晶晶, 陈娟, 张培,等. 基于VQ的语音识别技术研究[J]. 伺服控制, 2011(4):68-69.

[3] 张欢, 麻鑫, 吴玲玲,等. 一种基于语音识别的门禁系统[J]. 中国科技期刊数据库 工业A, 2021(10):3.​

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值