首页 > 其他分享 >基于MATLAB的说话人语音识别

基于MATLAB的说话人语音识别

时间:2024-10-24 18:47:36浏览次数:9  
标签:说话 end 语音 fs MATLAB 信号 识别

基于MATLAB的说话人语音识别   

             

     目录

  • 系统设计任务及要求………………………………………………3
  • 语音识别的简介……………………………………………………3

三、语音识别原理………………………………………………………3

3.1语音识别系统总体框架……………………………………………4

3.2语音信号预处理……………………………………………………4

  3.3特征参数的提取…………………………………………………6

  3.4用矢量量化聚类法生成码本……………………………………7

  3.5 VQ的说话人识别 ………………………………………………8

  • 仿真实现……………………………………………………………9
  • 总结……………………………………………………………………9

附录1………………………………………………………………………10

附录2………………………………………………………………………14

一.系统设计任务及要求

1.用MATLAB实现50个特定人的语音识别功能;

  2.语音识别的正确率在百分之九十以上;

二.语音识别的简介

说话人识别就是根据说话人的语音信号来判别说话人的身份。语音是人的自然属性之一,由于说话人发音器官的生理差异以及后天形成的行为差异,每个人的语音都带有强烈的个人色彩,这就使得通过分析语音信号来识别说话人成为可能。用语音来鉴别说话人的身份有着许多独特的优点,如语音是人的固有的特征,不会丢失或遗忘;语音信号的采集方便,系统设备成本低;利用电话网络还可实现远程客户服务等。因此,近几年来,说话人识别越来越多的受到人们的重视。与其他生物识别技术如指纹识别、手形识别等相比较,说话人识别不仅使用方便,而且属于非接触性,容易被用户接受,并且在已有的各种生物特征识别技术中,是唯一可以用作远程验证的识别技术。因此,说话人识别的应用前景非常广泛:今天,说话人识别技术已经关系到多学科的研究领域,不同领域中的进步都对说话人识别的发展做出了贡献。说话人识别技术是集声学、语言学、计算机、信息处理和人工智能等诸多领域的一项综合技术,应用需求将十分广阔。

说话人识别系统设计中的根本问题是如何从语音信号中提取表征人的基本特征。即语音特征矢量的提取是整个说话人识别系统的基础,对说话人识别的错误拒绝率和错误接受率有着极其重要的影响。同语音识别不同,说话人识别利用的是语音信号中的说话人信息,而不考虑语音中的字词意思,它强调说话人的个性。因此,单一的语音特征矢量很难提高识别率,所以语音信号的时候如何提取信号中关键的成分尤为重要。语音信号的特征参数的好坏直接导致了辨别的准确性。

系统在说话人的识别中采用基于Mel的频率倒谱系数的模板匹配的说话人识别方法。具体的实现过程当中,采用了matlab软件来帮助完成这个项目。在matlab中实现采集,分析,特征提取,配对,识别。

三.语音识别原理

3.1 语音识别系统总体框架

说话人识别系统的总体结构如图1所示。首先通过语音的录制作为输入信号,输入的模拟语音信号要进行预处理,包括预滤波、采样和量化、加窗、端点检测、预加重等等。经过预处理后,接下来就是重要的一环:特征参数提取。具体要求是:

  1. 提取的特征参数要能有效地代表语音特征,具有很好的区分性。
  2. 各阶参数之间有良好的独立性。
  3. 特征参数要计算方便,最好有高效的计算方法,以保证语音识别的实时实现。

图1  说话人语音识别系统总体框图

考虑到数据量、实时性以及识别率的问题,本文采用基于矢量量化的方法识别语音。对于特征参数的选取,我们使用mfcc的方法来提取。

3.2语音信号预处理

3.2.1 滤波

在模/数转换之前,通常要进行滤波处理,滤波的作用主要有两个:一是用高通滤波器抑制50Hz电源噪声的干扰;二是用低通滤波器滤除语音信号中频率分量超过采样频率一半的部分,防止采样信号的混叠。

3.2.2 模数转换

将原始采集得来的语音模拟信号转换为计算机能够处理的数字信号,就需要对其进行数字化,此过程成为数/模转换,最常见的方式就是脉冲编码调制(Palse

Code Modulation ),它的过程分为采样、量化和编码;

采样是对模拟信号进行周期性的扫描,将实际上连续变化的信号转换为时间上离散的信号,从而便于表示为计算机的语言。根据Nyquist采样定理,当采样频率高于信号最高频率的一倍时,原来的连续信号就可以从采样样本中完全重建出来。人耳可以分辨的声音频率范围为(20Hz,20KHz),因此,当采样的频率高于40KHz时,采样的过程就不会丢失信息,但考虑到设备的实际性能,且说话人语音频率主要集中在3.4KHz,故本系统以8KHz为采样率。 量化就是把经过采样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示出来,最终用整数倍的数字表示的过程。经过时间上的采样后,连续的模拟信号变成了离散信号,再经过振幅的量化,把量化好的采样值用二进制代码表示出来,就转换成了数字信号。

编码:就是用一组二进制码组来表示每一个有固定电平的量化值。然而,实际上量化是在编码过程中同时完成的,故编码过程也就称为模/数转换,

该系统以实验者50人的声音为分析样本,将语音信号都保存为符合RIFF规范的wav文件格式,便于在windows环境下处理。语音信号是利用PC机录制,音频文件采用8000kHz采样频率、16bit量化、单声道的PCM录  音,用MATLAB本身wavread函数来读取语音文件,直接将语音数据转化为数字信号。 

3.2.3预加重、分帧及加窗

   预处理是指对语音信号的特殊处理:预加重,分帧处理。预加重的目的是提升高频部分,使信号的频谱变得平坦,以便于进行频谱分析或声道参数分析。用具有 6dB/倍频程的提升高频特性的预加重数字滤波器实现。虽然语音信号是非平稳时变的,但是可以认为是局部短时平稳。故语音信号分析常分段或分帧来处理。

在语音参数计算之前,一般要将其通过一个预加重滤波器,预加重目的是为了对语音的高频部分进行加重增加其高频分辨率,其函数为:

x=filter([1 -0.9375],1,x);

“帧”,将语音信号截断的过程称之为“分帧”。为了保持帧之间的平滑过渡,常相邻的两帧之间有少部分的重叠,这些重叠的部分叫做帧移。在以后的语音信号识别过程中,都是依赖于每一帧多对应的数据序列所描述的语音信号特征来处理。

分帧操作主要是提取语音短时特性便于建模,一般取帧长30ms,帧移10ms;在对语音信号进行截断处理形成帧后,通常会产生泄露( Gibbs)现象,为了防止此种现象的发生,我们通常运用一个长度有限的窗函数w(n)对语音短段进行变换或运算。对于语音信号的每一帧来说,窗函数的宽度会影响语音信号的平滑性。越宽的窗函数,对信号的平滑作用就会越显著,效果越好,窗函数过窄,则基本

对信号不起作用。语音信号经过加窗处理后,两端的坡度会减小,窗口边缘两端也不会引起急剧变化,截取出的语音波形两端就会缓慢的过渡为零,这就有

效的减小语音帧的截断效应。

因此对于语音信号时域分析来说,窗函数的选择很重要,虽说矩形窗平滑比较好,但是容易丢失波形细节,并有可能造成泄漏现象。而Hamming窗可以有效的克服泄漏现象。所以在加窗方面常以Hamming窗为主,即:

3.3特征参数的提取

对于特征参数的选取,我们使用mfcc的方法来提取。

MFCC(Mel-sealed Cepstrum Coefficients),即Mel频率倒谱参数,也叫做Mel尺度倒谱参数。MFCC参数是基于人的听觉特性利用人听觉的屏蔽效应,在Mel标度频率域提取出来的倒谱特征参数。 这个参数的提取是将语音从时域变换至倒谱域,通过构造人的听觉模型,用滤波器组模仿人耳的滤波,语音通过滤波器组的输出为语音基本特征参数,然后做傅里叶变换

在语音识别处理信号过程中,MFCC参数是按照帧计算的。其特征提取及计算过程如图2所示。

图2 MFCC特征提取及计算流程

MFCC参数的提取过程如下:

1. 对输入的语音信号进行分帧、加窗,然后作离散傅立叶变换,获得频谱分布信息。 设语音信号的DFT为:

(1)

其中式中x(n)为输入的语音信号,N表示傅立叶变换的点数。

2. 再求频谱幅度的平方,得到能量谱。

3. 将能量谱通过一组Mel尺度的三角形滤波器组。

我们定义一个有M个滤波器的滤波器组(滤波器的个数和临界带的个数相近),采用的滤波器为三角滤波器,中心频率为f(m),m=1,2,3,···,M,本系统取M=100。

 

MFCC系数个数通常取20—30,常常不用0阶倒谱系数,因为它反映的是频谱能量,故在一般识别系统中,将称为能量系数,并不作为倒谱系数,本系统选取20阶倒谱系数。

3.4用矢量量化聚类法生成码本

在识别(匹配)阶段,我们用VQ方法计算平均失真测度(本系统在计算距离d时,采用欧氏距离测度),从而判断说话人是谁。

基于VQ的说话人识别系统,矢量量化起着双重作用。在训练阶段,把每一个说话者所提取的特征参数进行分类,产生不同码字所组成的码本。我们将每个待识的说话人看作是一个信源,用一个码本来表征。码本是从该说话人的训练序列中提取的MFCC特征矢量聚类而生成。只要训练的序列足够长,可认为这个码本有效地包含了说话人的个人特征,而与讲话的内容无关。

其中m从1变化到当前的码本的码字数,ε是分裂时的参数,本文ε=0.01。

    4. 重新计算各个区域的新型心,得到新的码书,转第3步。

5. 重复2 ,3 和4步,直到形成有M个码字的码书(M是所要求的码字数),其中D0=10000。

3.5 VQ的说话人识别

 四.仿真实现

我们的系统分为两部分:第一部分是先把50个人的声音保存成.wav的格式,放在一个文件夹中,作为说话人的声音模板检测的数据库。第二部分是对检测者实行识别对已经保存的50个数字的语音提取mfcc特征者,进行辨别和实时的判断说话人是否为同一人。

在train.m调用Vqlbg.m获取训练录音的vq码本,而vqlbg.m调用mfcc.m获取单个录音的mel倒谱系数,接着mfcc.m调用melfb.m---将能量谱通过一组Mel尺度的三角形滤波器组。

在test.m函数文件中调用disteu.m计算训练录音(提供vq码本)与测试录音(提供mfcc)mel倒谱系数的距离,即判断两声音是否为同一录音者提供。Disteu.m调用mfcc.m获取单个录音的mel倒谱系数。mfcc.m调用Melfb.m---将能量谱通过一组Mel尺度的三角形滤波器组。

五 总结

在matlab环境下实现基于矢量量化的说话人识别系统。在实时录音的情况下,利用该说话人识别系统,对不同的人的1s~7s的语音进行辨识。实现与文本无关的自动说话人确认的实时识别。

实验表明,该系统能较好地进行语音的识别,识别正确率达90%以上。同时,基于矢量量化技术 (VQ)的语音识别系统具有分类准确,存储数据少,实时响应速度快等综合性能好的特点.

附录1

附录2

function M3 = blockFrames(s, fs, m, n)

% blockFrames:

%        Puts the signal into frames  分帧函数

% Inputs:

%       s contains the signal to analize   语音信号

%       fs is the sampling rate of the signal   语音采样频率

%       m is the distance between the beginnings of two frames   两帧之间的距离

%       n is the number of samples per frame   每帧的采样点数

% Output:

%       M3 is a matrix containing all the frames   数组形式,包含了所有的帧

l = length(s);  %语音信号的长度

nbFrame = floor((l - n) / m) + 1;  %帧数

for i = 1:n   

    for j = 1:nbFrame

        M(i, j) = s(((j - 1) * m) + i);  %逐帧扫描

    end

end

h = hamming(n);

M2 = diag(h) * M;   %加汉明窗

for i = 1:nbFrame

    M3(:, i) = fft(M2(:, i));  %短时傅立叶变换

End

function code = train(traindir, n)

% 计算wav文件的VQ码码本

% Speaker Recognition: Training Stage

% Input:

%       traindir : string name of directory contains all train sound files

%       n        : number of train files in traindir

% Output:

%       code     : trained VQ codebooks, code{i} for i-th speaker

% Note:

%       Sound files in traindir is supposed to be:

%                       s1.wav, s2.wav, ..., sn.wav

% Example:

%       >> code = train('C:\data\train\', 8);

k = 16;                         % number of centroids required

for i = 1:n                     % train a VQ codebook for each speaker

    file = sprintf('%ss%d.wav', traindir, i);           

    disp(file);

    [s, fs] = wavread(file);    

    v = mfcc(s, fs);            % Compute MFCC's   

    code{i} = vqlbg(v, k);      % Train VQ codebook

end

function d = disteu(x, y)

% DISTEU Pairwise Euclidean distances between columns of two matrices  测试失真度

% Input:

%       x, y: Two matrices whose each column is an a vector data.

% Output:

%       d: Element d(i,j) will be the Euclidean distance between two column vectors X(:,i) and Y(:,j)

% Note:

%       The Euclidean distance D between two vectors X and Y is:

%       D = sum((x-y).^2).^0.5

[M, N] = size(x);

[M2, P] = size(y);

if (M ~= M2)

    error('不匹配!')

end

d = zeros(N, P);

if (N < P)

    copies = zeros(1,P);

    for n = 1:N

        d(n,:) = sum((x(:, n+copies) - y) .^2, 1);

    end

else

    copies = zeros(1,N);

    for p = 1:P

        d(:,p) = sum((x - y(:, p+copies)) .^2, 1)';

    end

end

d = d.^0.5;

function m = melfb(p, n, fs)

% MELFB         Determine matrix for a mel-spaced filterbank

% Inputs:       p   number of filters in filterbank   滤波器数

%               n   length of fft     FFT变换的点数

%               fs  sample rate in Hz    采样频率

% Outputs:      x   a (sparse) matrix containing the filterbank amplitudes

%                   size(x) = [p, 1+floor(n/2)]

% Usage:        For example, to compute the mel-scale spectrum of a

%               colum-vector signal s, with length n and sample rate fs:

%

%               f = fft(s);

%               m = melfb(p, n, fs);

%               n2 = 1 + floor(n/2);

%               z = m * abs(f(1:n2)).^2;

%

%               z would contain p samples of the desired mel-scale spectrum

%

%               To plot filterbanks e.g.:

%

%               plot(linspace(0, (12500/2), 129), melfb(20, 256, 12500)'),

%               title('Mel-spaced filterbank'), xlabel('Frequency (Hz)');

f0 = 700 / fs;

fn2 = floor(n/2);

lr = log(1 + 0.5/f0) / (p+1);

% convert to fft bin numbers with 0 for DC term

bl = n * (f0 * (exp([0 1 p p+1] * lr) - 1));

b1 = floor(bl(1)) + 1;

b2 = ceil(bl(2));

b3 = floor(bl(3));

b4 = min(fn2, ceil(bl(4))) - 1;

pf = log(1 + (b1:b4)/n/f0) / lr;

fp = floor(pf);

pm = pf - fp;

r = [fp(b2:b4) 1+fp(1:b3)];

c = [b2:b4 1:b3] + 1;

v = 2 * [1-pm(b2:b4) pm(1:b3)];

m = sparse(r, c, v, p, 1+fn2);

function r = mfcc(s, fs)   %   s声音信号的向量   fs取样频率

% MFCC

% Inputs: s contains the signal to analize

%         fs is the sampling rate of the signal

% Output: r contains the transformed signal

m = 100;

n = 256;

l = length(s);

nbFrame = floor((l - n) / m) + 1;

for i = 1:n

    for j = 1:nbFrame

        M(i, j) = s(((j - 1) * m) + i);

    end

end

h = hamming(n);

M2 = diag(h) * M;

for i = 1:nbFrame

    frame(:,i) = fft(M2(:, i));

end

t = n / 2;

tmax = l / fs;

m = melfb(20, n, fs);

n2 = 1 + floor(n / 2);

z = m * abs(frame(1:n2, :)).^2;

r = dct(log(z));

function r = vqlbg(d,k)

% VQLBG Vector quantization using the Linde-Buzo-Gray algorithme   使用LBG算法

%

% Inputs:

%       d contains training data vectors (one per column)

%       k is number of centroids required

% Output:

%       r contains the result VQ codebook (k columns, one for each centroids)

e = .01;

r = mean(d, 2);

dpr = 10000;

for i = 1:log2(k)

    r = [r*(1+e), r*(1-e)];

    while (1 == 1)

        z = disteu(d, r);

        [m,ind] = min(z, [], 2);

        t = 0;

        for j = 1:2^i

            r(:, j) = mean(d(:, find(ind == j)), 2);

            x = disteu(d(:, find(ind == j)), r(:, j));

            for q = 1:length(x)

                t = t + x(q);

            end

        end

        if (((dpr - t)/t) < e)

            break;

        else

            dpr = t;

        end

    end

end

function test(testdir, n, code)

% Speaker Recognition: Testing Stage

% Input:

%       testdir : string name of directory contains all test sound files  

%       n       : number of test files in testdir  音频文件数目

%       code    : codebooks of all trained speakers  说话人的训练码本

% Note:

%       Sound files in testdir is supposed to be:

%               s1.wav, s2.wav, ..., sn.wav

% Example:

%       >> test('C:\data\test\', 8, code);

for k = 1:n                     % 读出音频文件

    file = sprintf('%ss%d.wav', testdir, k);

    [s, fs] = wavread(file);   

    

    v = mfcc(s, fs);            % 计算MFCC's

   

    distmin = inf;

    k1 = 0;

    

    for l = 1:length(code)      % 计算每个训练码本的失真度

        d = disteu(v, code{l});

        dist = sum(min(d,[],2)) / size(d,1);

      

        if dist < distmin

            distmin = dist;

            k1 = l;

        end      

    end

    msg = sprintf('Speaker %d matches with speaker %d', k, k1);

    disp(msg);

end

标签:说话,end,语音,fs,MATLAB,信号,识别
From: https://blog.csdn.net/2401_84170369/article/details/143216810

相关文章