【语音识别】基于GUI声纹识别【Matlab 500期】

一、简介

本文基于Matlab设计实现了一个文本相关的声纹识别系统,可以判定说话人身份。
1 系统原理
a.声纹识别
    这两年随着人工智能的发展,不少手机App都推出了声纹锁的功能。这里面所采用的主要就是声纹识别相关的技术。声纹识别又叫说话人识别,它和语音识别存在一点差别。
【语音识别】基于GUI声纹识别【Matlab 500期】_第1张图片
b.梅尔频率倒谱系数(MFCC)
梅尔频率倒谱系数(Mel Frequency Cepstrum Coefficient, MFCC)是语音信号处理中最常用的语音信号特征之一。
实验观测发现人耳就像一个滤波器组一样,它只关注频谱上某些特定的频率。人耳的声音频率感知范围在频谱上的不遵循线性关系,而是在Mel频域上遵循近似线性关系。
梅尔频率倒谱系数考虑到了人类的听觉特征,先将线性频谱映射到基于听觉感知的Mel非线性频谱中,然后转换到倒谱上。普通频率转换到梅尔频率的关系式为:
【语音识别】基于GUI声纹识别【Matlab 500期】_第2张图片
c.矢量量化(VectorQuantization)
本系统利用矢量量化对提取的语音MFCC特征进行压缩。
VectorQuantization (VQ)是一种基于块编码规则的有损数据压缩方法。事实上,在 JPEG 和 MPEG-4 等多媒体压缩格式里都有 VQ 这一步。它的基本思想是:将若干个标量数据组构成一个矢量,然后在矢量空间给以整体量化,从而压缩了数据而不损失多少信息。
3 系统结构
本文整个系统的结构如下图:
  –训练过程
首先对语音信号进行预处理,之后提取MFCC特征参数,利用矢量量化方法进行压缩,得到说话人发音的码本。同一说话人多次说同一内容,重复该训练过程,最终形成一个码本库。
  –识别过程
在识别时,同样先对语音信号预处理,提取MFCC特征,比较本次特征和训练库码本之间的欧氏距离。当小于某个阈值,我们认定本次说话的说话人及说话内容与训练码本库中的一致,配对成功。
【语音识别】基于GUI声纹识别【Matlab 500期】_第3张图片
4 测试实验
【语音识别】基于GUI声纹识别【Matlab 500期】_第4张图片
【语音识别】基于GUI声纹识别【Matlab 500期】_第5张图片
【语音识别】基于GUI声纹识别【Matlab 500期】_第6张图片
【语音识别】基于GUI声纹识别【Matlab 500期】_第7张图片
可以看到只有说话人及说话内容与码本库完全一致时才会显示“密码正确”,否则显示“密码错误”,实现了声纹锁的相关功能。

二、源代码

function varargout = test4(varargin)
% TEST4 MATLAB code for test4.fig
%      TEST4, by itself, creates a new TEST4 or raises the existing
%      singleton*.
%
%      H = TEST4 returns the handle to a new TEST4 or the handle to
%      the existing singleton*.
%
%      TEST4('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in TEST4.M with the given input arguments.
%
%      TEST4('Property','Value',...) creates a new TEST4 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before test4_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to test4_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help test4

% Last Modified by GUIDE v2.5 17-Mar-2019 09:58:00

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @test4_OpeningFcn, ...
                   'gui_OutputFcn',  @test4_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{
     1})
    gui_State.gui_Callback = str2func(varargin{
     1});
end

if nargout
    [varargout{
     1:nargout}] = gui_mainfcn(gui_State, varargin{
     :});
else
    gui_mainfcn(gui_State, varargin{
     :});
end
% End initialization code - DO NOT EDIT


% --- Executes just before test4 is made visible.
function test4_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to test4 (see VARARGIN)

% Choose default command line output for test4
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes test4 wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = test4_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{
     1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global thk1 thk2 thk3 
global tlc1 tlc2 tlc3
global tlyy1 tlyy2 tlyy3 
global tqs1 tqs2 tqs3
global tyqc1 tyqc2 tyqc3
global startpos len

startpos=601;
len=399;
[s,fs]=audioread('训练样本hk1.wav');
thk1= MFCC2par(s,fs);
thk1=thk1(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本hk2.wav');
thk2= MFCC2par(s,fs);
thk2=thk2(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本hk3.wav');
thk3= MFCC2par(s,fs);
thk3=thk3(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本lc1.wav');
tlc1= MFCC2par(s,fs);
tlc1=tlc1(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本lc2.wav');
tlc2= MFCC2par(s,fs);
tlc2=tlc2(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本lc3.wav');
tlc3= MFCC2par(s,fs);
tlc3=tlc3(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本lyy1.wav');
tlyy1= MFCC2par(s,fs);
tlyy1=tlyy1(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本lyy2.wav');
tlyy2= MFCC2par(s,fs);
tlyy2=tlyy2(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本lyy3.wav');
tlyy3= MFCC2par(s,fs);
tlyy3=tlyy3(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本qs1.wav');
tqs1= MFCC2par(s,fs);
tqs1=tqs1(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本qs2.wav');
tqs2= MFCC2par(s,fs);
tqs2=tqs2(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本qs3.wav');
tqs3= MFCC2par(s,fs);
tqs3=tqs3(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本yqc1.wav');
tyqc1= MFCC2par(s,fs);
tyqc1=tyqc1(startpos:startpos+len,1:12);

[s,fs]=audioread('训练样本yqc2.wav');
tyqc2= MFCC2par(s,fs);
tyqc2=tyqc2(startpos:startpos+len,1:12);
function getmfcc= MFCC2par( x,fs)
 %=========================================================
 % 无去噪及端点检测
 % Input:音频数据x,采样率fs
 % Output:(N,M)大小的特征参数矩阵  其中N为分帧个数,M为特征维度
 % 特征参数:M=24 倒谱系数12维,一阶差分12%=========================================================

%[x fs]=wavread(sound);
%取单声道信号
[~,etmp]=size(x);
if (etmp==2)
x=x(:,1);
end

%归一化mel滤波器组系数

bank=melbankm(24,256,fs,0,0.5,'m');%Mel滤波器的阶数为24,fft变换的长度为256,采样频率为8000Hz  

bank=full(bank);

bank=bank/max(bank(:));%[24*129]

 %设定DCT系数
 
for k=1:12

n=0:23;

dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));

end

%归一化倒谱提升窗口

w=1+6*sin(pi*[1:12]./12);

w=w/max(w);


%预加重滤波器

xx=double(x);

xx=filter([1-0.9375],1,xx);%预加重

xx=enframe(xx,256,80);%对x 256点分为一帧


%计算每帧的MFCC参数

for i=1:size(xx,1)

y=xx(i,:);%取一帧数据

s=y'.*hamming(256);

t=abs(fft(s));%fft快速傅立叶变换  幅度谱

t=t.^2; %能量谱

%对fft参数进行mel滤波取对数再计算倒谱
c1=dctcoef*log(bank*t(1:129));%对能量谱滤波及DCT %t(1:129)对一帧的前128个数(帧移为128)

c2=c1.*w';%归一化倒谱

%mfcc参数

m(i,:)=c2';

end

三、运行结果

【语音识别】基于GUI声纹识别【Matlab 500期】_第8张图片
【语音识别】基于GUI声纹识别【Matlab 500期】_第9张图片

四、备注

完整代码或者代写添加QQ912100926
往期回顾>>>>>>
【信号处理】基于GUI界面之处理录音与音频【Matlab 123期】
【信号处理】CDR噪声和混响抑制【含Matlab源码 198期】
【信号处理】最小二乘法解决稀疏信号恢复问题【Matlab 199期】
【信号处理】遗传算法的VST混响【Matlab 200期】
【信号处理】HMM的睡眠状态检测【Matlab 201期】
【信号处理】小波变换的音频水印嵌入提取【Matlab 202期】
【信号处理】ICA算法信号分离【Matlab 203期】
【信号处理】基于GUI界面的脉搏信号之脉率存档【Matlab 204期】
【信号处理】基于GUI界面的虚拟信号发生器(各种波形)【Matlab 205期】
【信号处理】基于GUI界面信号发生器之电子琴【Matlab 206期】
【信号处理】数字电子琴设计与实现【Matlab 207期】
【雷达通信】雷达数字信号处理【Matlab 214期】
【雷达通信】线性调频(LFM)脉冲压缩雷达仿真【Matlab 215期】
【雷达通信】距离多普勒(RD)、CS、RM算法的机载雷达成像【Matlab 216期】
【雷达通信】《现代雷达系统分析与设计》【Matlab 217期】
【语音处理】基于matlab GUI语音信号处理平台【含Matlab源码 218期】
【语音采集】基于GUI语音信号采集【Matlab 219期】
【语音调制】基于GUI语音幅度调制【Matlab 220期】
【语音合成】基于GUI语音合成【Matlab 221期】
【语音识别】基于GUI语音基频识别【Matlab 222期】
【语音加密】基于GUI语音信号加密解密【Matlab 223期】
【信号处理】小波变换的语音增强【Matlab 224期】
【信号处理】基于GUI语音去噪【Matlab 225期】
【语音增强】基于GUI维纳滤波之语音增强【Matlab 226期】
【音频处理】基于GUI语音信号处理【含Matlab 227期】
【雷达通信】基于GUI雷达定位【Matlab 244期】
【雷达通信】基于GUI雷达脉冲压缩【Matlab 245期】
【雷达通信】基于GUI雷达定位模拟【Matlab 246期】
【雷达通信】SVM识别雷达数据【Matlab 247期】
【信息处理】GUI数字波束的算法库【Matlab 249期】
【通信】OFDM-MIMO通信建模与仿真【Matlab 250期】
【通信】OFDM仿真【Matlab 251期】
【信号处理】窗函数法的FIR数字滤波器设计【Matlab 252期】
【通信】FIR低通数字滤波器设计【Matlab 253期】
【通信】FIR IIR数字滤波器设计【Matlab 254期】
【调制信号】基于GUI数字调制信号仿真【Matlab 255期】
【通信】扩频通信系统设计【Matlab 256期】
【通信】多径衰落信道的仿真【Matlab 257期】
【语音识别】基于BP神经网络的语音情感识别【Matlab 258期】
【信号处理】音频水印嵌入与提取【Matlab 259期】
【音频水印】小波变换的量化音频数字水印【Matlab 260期】
【语音去噪】低通和自适应滤波去噪【Matlab 261期】
【信号处理】8级m序列【Matlab 262期】
【情感识别】基于GUI语音情感分类识别【Matlab 263期】
【信号处理】FIR与IIR滤波器低通、高通、带通设计【Matlab 273期】
【语音处理】语音信号的预处理【Matlab 274期】
【语音识别】傅立叶变换0-9的数字语音识别【含Matlab 333期】
【语音识别】基于GUI DTW的0-9数字语音识别【Matlab 334期】
【语音播放】基于GUI MP3设计【Matlab 335期】
【语音处理】人耳掩蔽效应的语音增强算法信噪比计算【Matlab 336期】
【语音去噪】谱减法去噪【Matlab 337期】
【语音识别】带动量项的BP神经网络语音识别【Matlab 338期】
【语音隐写】LSB语音隐藏【Matlab 339期】
【语音识别】男女声识别【Matlab 365期】
【信号处理】基于GUI的PCM调制【Matlab 366期】
【语音处理】语音加噪和降噪处理【Matlab 367期】
【语音去噪】最小二乘法(LMS)自适应滤波器【Matlab 368期】
【语音增强】谱减法、最小均方和维纳滤波语音增强【Matlab 369期】
【通信】基于GUI数字频带(ASK、PSK、QAM)调制仿真 【Matlab 422期】
【信号处理】心电信号ECG滤波处理【Matlab 423期】
【语音播报】语音播报【Matlab 487期】
【语音处理】基于GUI双音多频(DTMF)信号检测【Matlab 488期】
【语音隐写】基于LSB实现语音信号的数字水印【Matlab 489期】
【语音处理】基于GUI语音时域频域频谱图分析【Matlab 490期】
【语音去噪】基于LMS、RLS算法语音去噪【Matlab 491期】
【语音去噪】基于LMS谱减法语音去噪【Matlab 492期】
【语音去噪】基于软阈值、硬阈值、折中阈值语音去噪【Matlab 493期】
【语音去噪】小波软阈值语音降噪【Matlab 494期】
【语音去噪】小波硬阈值语音降噪【Matlab 495期】
【语音识别】基于MFCC和SVM的特定人性别识别【Matlab 496期】
【语音识别】特定人的语音识别分辨【Matlab 497期】
【语音识别】基于MFCC的GMM语音识别【Matlab 498期】
【语音识别】基于VQ特定人孤立词语音识别【Matlab 499期】

你可能感兴趣的:(matlab,信号处理)