✅作者简介:热爱科研的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.