一、案例简介

本文基于Matlab设计实现了一个文本相关的声纹识别系统,可以判定说话人身份。
1 系统原理
a 声纹识别
这两年随着人工智能的发展,不少手机App都推出了声纹锁的功能。这里面所采用的主要就是声纹识别相关的技术。声纹识别又叫说话人识别,它和语音识别存在一点差别。

b 梅尔频率倒谱系数(MFCC)
梅尔频率倒谱系数(Mel Frequency Cepstrum Coefficient, MFCC)是语音信号处理中最常用的语音信号特征之一。
实验观测发现人耳就像一个滤波器组一样,它只关注频谱上某些特定的频率。人耳的声音频率感知范围在频谱上的不遵循线性关系,而是在Mel频域上遵循近似线性关系。
梅尔频率倒谱系数考虑到了人类的听觉特征,先将线性频谱映射到基于听觉感知的Mel非线性频谱中,然后转换到倒谱上。普通频率转换到梅尔频率的关系式为:

c 矢量量化(VectorQuantization)
本系统利用矢量量化对提取的语音MFCC特征进行压缩。
VectorQuantization (VQ)是一种基于块编码规则的有损数据压缩方法。事实上,在 JPEG 和 MPEG-4 等多媒体压缩格式里都有 VQ 这一步。它的基本思想是:将若干个标量数据组构成一个矢量,然后在矢量空间给以整体量化,从而压缩了数据而不损失多少信息。
3 系统结构
本文整个系统的结构如下图:
3.1 训练过程
首先对语音信号进行预处理,之后提取MFCC特征参数,利用矢量量化方法进行压缩,得到说话人发音的码本。同一说话人多次说同一内容,重复该训练过程,最终形成一个码本库。
3.2 识别过程
在识别时,同样先对语音信号预处理,提取MFCC特征,比较本次特征和训练库码本之间的欧氏距离。当小于某个阈值,我们认定本次说话的说话人及说话内容与训练码本库中的一致,配对成功。

4 测试实验




可以看到只有说话人及说话内容与码本库完全一致时才会显示“密码正确”,否则显示“密码错误”,实现了声纹锁的相关功能。

二、部分源代码

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 07-Jan-2022 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});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_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 lenstartpos=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:12n=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

三、运行结果

四、matlab版本及参考文献

1 matlab版本
2014a

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

【语音识别】基于matlab GUI声纹识别(带面板)【含Matlab源码 537期】相关推荐

  1. 【病虫害识别】基于matlab GUI SVM病虫害识别系统【含Matlab源码 2429期】

    ⛄一.基于机器视觉的农作物病害识别技术 1 叶片图像采集 进行农作物病害自动检测与识别首先要对病害叶片的图像进行采集.自动识别的前提是获得数字图像, 数字图像质量的好坏决定着之后叶片病害的识别特征能否 ...

  2. 【图像处理】基于matlab GUI多功能图像处理系统【含Matlab源码 1876期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像处理]基于matlab GUI多功能图像处理系统[含Matlab源码 1876期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  3. 【机械仿真】基于matlab GUI曲柄摇杆机构运动仿真【含Matlab源码 1608期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI曲柄摇杆机构运动仿真[含Matlab源码 1608期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  4. 【光学】基于matlab GUI光栅条纹投影生成【含Matlab源码 2118期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI光栅条纹投影生成[含Matlab源码 2118期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  5. 【机械仿真】基于matlab GUI直齿圆柱齿轮应力计算【含Matlab源码 2077期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI直齿圆柱齿轮应力计算[含Matlab源码 2077期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

  6. 【天体学】基于matlab GUI太阳天顶角计算【含Matlab源码 2229期】

    一.⛄获取代码方式 获取代码方式1: 完整代码已上传我的资源:[天体学]基于matlab GUI太阳天顶角计算[含Matlab源码 2229期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  7. 基于matlab的声纹识别技术(matlabR2021b版)

    文章目录 宏观理解 技术细节 声纹识别发展流程 传统方法 深度学习的方法 多看:声纹识别技术简介--化繁为简的艺术,深入浅出了解声纹识别. 宏观理解 1.困难在哪? 不同的人说话语音波形不同,但是相同 ...

  8. 基于Tensorflow实现声纹识别

    前言 本章介绍如何使用Tensorflow实现简单的声纹识别模型,首先你需要熟悉音频分类,没有了解的可以查看这篇文章<基于Tensorflow实现声音分类>.基于这个知识基础之上,我们训练 ...

  9. [声纹识别]基于MFCC的声纹识别算法

    Mel频率倒谱系数(melfrequency cepstral coefficients,MFCC)是声音的短期功率谱的表示,基于非线性频谱上的对数功率谱的线性余弦变换.在自动语音识别领域,MFCC是 ...

  10. 【语音去噪】基于matlab GUI IIR滤波器语音去噪【含Matlab源码 1864期】

    一.语音处理简介 语言是人们获得各类有效信息的主要途径, 而语音是语言的表现形式.语音在一定程度上可影响人们的生活, 因此, 语音信号的研究对科学领域和人们日常生活具有一定的研究价值和意义.噪声广泛存 ...

最新文章

  1. 解题报告:SP1043 GSS4 - Can you answer these queries III(GSS线段树八部曲之三)(区间最大连续子段和)
  2. python自动测试p-python自动化测试_6
  3. hdu 1166 敌兵布阵
  4. k8s Pod亲和性:pod与pod的亲和性
  5. FileItem API详解及演示
  6. 1574: [Usaco2009 Jan]地震损坏Damage
  7. P3639-[APIO2013]道路费用【最小生成树】
  8. python循环报数游戏_报数游戏python 解答
  9. objective-c block 讲解
  10. 中国科学院大学计算机研究生拟录取名单,2019中国科学院大学硕士考研研究生拟录取名单全部(2)...
  11. 第七章 面向对象分析
  12. 常用邮件客户端软件的代理服务器设置
  13. 计算机安装固态硬盘后启动不稳定,完美解决win7系统安装固态硬盘后开机慢的解决方法...
  14. Java 对接快递100 实现快递实时查询 (自动识别快递公司)
  15. 高德地图发布Q2交通报告
  16. 12306余票查询(六)——优化页面结构,加入js请求数据部分
  17. JVM学习笔记 之 JVM概述
  18. 2.1.1队列——雏形(初始版本)
  19. ei检索的cpss_我想查EI会议论文检索情况,请问是如何查询的呢?
  20. Dynamic Slicing for Deep Neural Networks

热门文章

  1. 单层感知机实现或运算
  2. Entity Framework 5.0
  3. 初恋 张润贞 吉他谱
  4. DC概论三之setup time 与 hold time 之二
  5. V-rep学习笔记:转动关节1
  6. Flexsim 视觉类 平面 plane仿真对象模块化
  7. 2020-12-05
  8. 181219每日一句
  9. 目录 1. 常见mime类型 1 1.1. 2.1.1. Type application 2 2.1.2. Type audio 22.1.3. Type image 32.1.4. Type t
  10. Atitit 项目高扩展法 目录 1. 提升语言级别 1 1.1. 脚本化 dsl化 免编译 2 1.2. 提升语言级别到4gl 2 1.3. 语言的代际关系 sql 》script 》java 2