【特征提取】基于matlab语音端点检测【含Matlab源码 552期】

一、简介

语音端点检测一般用于鉴别音频信号当中的语音出现(speech presence)和语音消失(speech absence)。这里将提供一个简单的VAD方法,当检测到语音时输出为1,否则,输出为0。
语音是否出现或者在背景噪声上是否平坦决定了VAD方法的检测是否稳定(The job of a VAD is to reliably determine if speech is present or not even in background noise)。在纯净背景噪声环境下(clean conditions),即使简单的能量检测方法也能够得到较好的语音检测效果,然而,一般情况下,我们得到的音频信号均会存在背景噪声。这就意味着,我们的VAD方法必须对噪声具有较好的鲁棒性。
在这里插入图片描述
1 VAD的总体步骤如下:
将音频信号进行分帧处理;
从每一帧数据当中提取特征;
在一个已知语音和静默信号区域的数据帧集合上训练一个分类器;
对未知的分帧数据进行分类,判断其属于语音信号还是静默信号。
通常,一个VAD算法会将音频信号划分为发音部分(voiced)、未发音部分(unvoiced)和静默部分(silence)。这里介绍的特征能够很好的适用于这种分类任务,但是分类器的分类类别是3类而非两类(voiced speech,unvoiced speech and silence)。

2 预处理
第一步是将音频信号通过一个高通滤波器,截止频率大约为(200Hz)。这一步的目的是移除信号当中的直流偏置分量和一些低频噪声。虽然在低于(200Hz)的部分仍然有部分语音信息,但是不会对语音信号造成很大的影响。

在特征提取之前,我们首先要对音频信号进行长度为(20-40ms)的分帧,一般帧与帧之间的重叠为(10ms)。举例来说,如果我们的音频信号采样率为(16kHz),取窗口大小为(25ms),这种情况下,每一帧数据的所包含的数据点为:(0.025*16000=400)采样点。令帧之间重叠为(10ms)来计算,第一帧的数据起始点为(sample 0),第二帧数据的起始点为(sample 160)。

3 特征提取
分帧完成之后,就可以对每一帧数据进行特征提取。在下面的讨论中,(x(n))为音频数据的一帧数据,其中(n)的范围为(1 \rightarrow L)((L)为每一帧数据的长度)。对每一帧数据进行下面五种特征的提取:

4 对数帧能量(logarithm of frame energy):
[
E=log(\sum\limits_{n=1}{L}x(n)2)
]
过零率(zero crossing rate):每一帧数据穿过零点的次数
在延迟一个位置处标准化自相关系数(normalised autocorrelation coefficient at lag 1):
[
C=\frac{\sum\limits_{n=1}{L-1}x(n)x(n-1)}{\sqrt{(\sum\limits_{n=1}{L-1}x(n)2)(\sum\limits_{n=1}{L-1}x(n-1)^2)}}
]
(P_{th})阶线性预测的第一个系数
(P_{th})阶线性预测误差的对数
在本文中,我们使用(P=12),也就是说线性预测器的阶数为(12)。

5 分类
上面介绍的特征,单一使用时无法有效的对音频信号进行端点检测,但是我们可以使用多种特征的组合,来有效的解决这一问题,并且降低错误分类的概率。
Rabiner使用一个推测(calculating)静默信号特征均值和方差;语音信号特征均值和方差的贝叶斯分类器来进行分类。为了对一个未知数据帧进行分类,我们计算该数据帧来自每一个标签数据的似然,假设数据分布服从多变量高斯分布。然后,选择最大似然所对应的模型作为该数据帧的标签。

我们也可以选择discriminative classifier,如:支持矢量机,神经网络等。这里有一个SVM库libsvm,能够简单的训练一个SVM分类器来用于语音信号和静默信号的分类。

6 训练
训练分类器需要足够的带标签数据,这就要求人们进行人工标注数据。具体的,在VAD应用当中,要求对音频信号中的语音部分和静默部分进行划分。一般来说,带标签数据越多,训练得到的分类器分类效果越好。一个重要的细节是:在训练数据当中的背景噪声要尽量与测试数据当中的背景噪声相匹配,否则会引起噪声失配问题。如果你无法对训练和测试数据当中的噪声类型进行确定,那么尽量使用多种噪声和多种(SNR)(信噪比)数据对分类器进行训练。

如果你想要应用VAD到一个实际应用当中,如:电话语音数据,很重要的一点是:进行训练的数据需要在相同的通道(channel)获取,训练所获取数据的channel和应用场景的channel相同。这样可以降低训练数据集和测试数据集的失配问题。一旦训练完成之后,你可以获得一个可以预测未知数据标签的模型。

7 Putting it All Together
模型训练完成之后,我们可以使用该模型对未知数据帧的标签进行预测。随着数据中噪声的增加,可以推测到,VAD模型的准确率会下降。

有时,预测标签在speech present和speech abscent之间剧烈震荡,这种情况是我们所不愿意看到的。在这种情况下,我们可以对预测标签使用中值滤波Median Filter进行处理。

扫描二维码关注公众号,回复: 12739740 查看本文章

二、源代码

% 双门限法端点检测
clear all; clc; close all;

[x,fs]=wavread('C4_1_y.wav');                    % 读入数据文件
x=x/max(abs(x));                        % 幅度归一化
N=length(x);                            % 取信号长度
time=(0:N-1)/fs;                        % 计算时间
subplot 311
plot(time,x,'k');         
title('双门限法的端点检测');
ylabel('幅值'); axis([0 max(time) -1 1]); 
xlabel('时间/s');
wlen=200; inc=80;                       % 分帧参数
IS=0.1; overlap=wlen-inc;               % 设置IS
NIS=fix((IS*fs-wlen)/inc +1);           % 计算NIS
fn=fix((N-wlen)/inc)+1;                 % 求帧数
frameTime=FrameTimeC(fn, wlen, inc, fs);% 计算每帧对应的时间
[voiceseg,vsl,SF,NF,amp,zcr]=vad_TwoThr(x,wlen,inc,NIS);  % 端点检测
subplot 312
plot(frameTime,amp,'k');         
ylim([min(amp) max(amp)])
title('短时能量');
ylabel('幅值'); 
xlabel('时间/s');
subplot 313
plot(frameTime,zcr,'k');     
ylim([min(zcr) max(zcr)])
title('短时过零率');
ylabel('幅值'); 
xlabel('时间/s');
for k=1 : vsl                           % 画出起止点位置
    subplot 311
    nx1=voiceseg(k).begin; nx2=voiceseg(k).end;
    nxl=voiceseg(k).duration;
    line([frameTime(nx1) frameTime(nx1)],[-1.5 1.5],'color','r','LineStyle','-');
    line([frameTime(nx2) frameTime(nx2)],[-1.5 1.5],'color','b','LineStyle','--');
    subplot 312
    line([frameTime(nx1) frameTime(nx1)],[min(amp) max(amp)],'color','r','LineStyle','-');
    line([frameTime(nx2) frameTime(nx2)],[min(amp) max(amp)],'color','b','LineStyle','--');    
    subplot 313
    % 自相关法端点检测
clear all; clc; close all;
IS=0.25;                                % 设置前导无话段长度
wlen=200;                               % 设置帧长为25ms
inc=80;                                 % 求帧移

[xx,fs]=wavread('C4_1_y');                   % 读入数据
xx=xx-mean(xx);                         % 消除直流分量
x=xx/max(abs(xx));                      % 幅值归一化
N=length(x);                            % 取信号长度
time=(0:N-1)/fs;                        % 设置时间
wnd=hamming(wlen);                      % 设置窗函数
NIS=fix((IS*fs-wlen)/inc +1);           % 求前导无话段帧数

% y=enframe(x,wnd,inc)';             % 分帧
% fn=size(y,2);                           % 求帧数
th1=1.1;
th2=1.3;
[voiceseg,vsl,SF,NF,Rum]=vad_corr(x,wnd,inc,NIS,th1,th2);% 自相关函数的端点检测
fn=length(SF);
frameTime=FrameTimeC(fn, wlen, inc, fs);% 计算各帧对应的时间
% 作图
subplot 211; plot(time,x,'k');
title('纯语音波形');
ylabel('幅值'); axis([0 max(time) -1 1]);
subplot 212; plot(frameTime,Rum,'k');
title('短时自相关函数'); axis([0 max(time) 0 1]);
xlabel('时间/s'); ylabel('幅值'); 
for k=1 : vsl                           % 标出语音端点
    nx1=voiceseg(k).begin; nx2=voiceseg(k).end;
    subplot 211; 
    line([frameTime(nx1) frameTime(nx1)],[-1 1],'color','r','LineStyle','-');
    line([frameTime(nx2) frameTime(nx2)],[-1 1],'color','b','LineStyle','--');
    % 谱熵法端点检测
clear all; clc; close all;
IS=0.25;                                % 设置前导无话段长度
wlen=200;                               % 设置帧长为25ms
inc=80;                                 % 求帧移

[xx,fs]=wavread('C4_1_y');                   % 读入数据
xx=xx-mean(xx);                         % 消除直流分量
x=xx/max(abs(xx));                      % 幅值归一化
N=length(x);                            % 取信号长度
time=(0:N-1)/fs;                        % 设置时间
wnd=hamming(wlen);                      % 设置窗函数
overlap=wlen-inc;                       % 求重叠区长度
NIS=fix((IS*fs-wlen)/inc +1);           % 求前导无话段帧数
% 比例法端点检测
clear all; clc; close all;
IS=0.25;                                % 设置前导无话段长度
wlen=200;                               % 设置帧长为25ms
inc=80;                                 % 求帧移

[xx,fs]=wavread('C4_1_y');                   % 读入数据
xx=xx-mean(xx);                         % 消除直流分量
x=xx/max(abs(xx));                      % 幅值归一化
N=length(x);                            % 取信号长度
time=(0:N-1)/fs;                        % 设置时间
wnd=hamming(wlen);                      % 设置窗函数
overlap=wlen-inc;                       % 求重叠区长度
NIS=fix((IS*fs-wlen)/inc +1);           % 求前导无话段帧数
mode=2;
if mode==1
% 基于对数频谱距离的端点检测
clear all; clc; close all;

IS=0.25;                                % 设置前导无话段长度
wlen=200;                               % 设置帧长为25ms
inc=80;                                 % 求帧移
SNR=10;                                 % 设置信噪比

[xx,fs]=wavread('C4_1_y.wav');                   % 读入数据
xx=xx-mean(xx);                         % 消除直流分量
x=xx/max(abs(xx));                      % 幅值归一化
N=length(x);                            % 取信号长度
time=(0:N-1)/fs;                        % 设置时间
signal=awgn(x,SNR,'measured','db');                % 叠加噪声

wnd=hamming(wlen);                      % 设置窗函数
overlap=wlen-inc;                       % 求重叠区长度
NIS=fix((IS*fs-wlen)/inc +1);           % 求前导无话段帧数

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

完整代码或者代写添加QQ 1564658423
往期回顾>>>>>>
【特征提取】基于matlab小波变换的音频水印嵌入提取【含Matlab源码 053期】
【语音处理】基于matlab GUI语音信号处理【含Matlab源码 290期】
【语音采集】基于matlab GUI语音信号采集【含Matlab源码 291期】
【语音调制】基于matlab GUI语音幅度调制【含Matlab源码 292期】
【语音合成】基于matlab GUI语音合成【含Matlab源码 293期】
【语音加密】基于matlab GUI语音信号加密解密【含Matlab源码 295期】
【语音增强】基于matlab小波变换的语音增强【含Matlab源码 296期】
【语音识别】基于matlab GUI语音基频识别【含Matlab源码 294期】
【语音增强】基于matlab GUI维纳滤波之语音增强【含Matlab源码 298期】
【语音处理】基于matlab GUI语音信号处理【含Matlab源码 299期】
【信号处理】基于matlab的语音信号频谱分析仪【含Matlab源码 325期】
【调制信号】基于matlab GUI数字调制信号仿真【含Matlab源码 336期】
【情感识别】基于matlab BP神经网络的语音情感识别【含Matlab源码 349期】
【语音隐写】基于matlab小波变换的量化音频数字水印【含Matlab源码 351期】
【特征提取】基于matlab音频水印嵌入与提取【含Matlab源码 350期】
【语音去噪】基于matlab低通和自适应滤波去噪【含Matlab源码 352期】
【情感识别】基于matlab GUI语音情感分类识别【含Matlab源码 354期】
【基础处理】基于matlab语音信号的预处理【含Matlab源码 364期】
【语音识别】基于matlab 傅立叶变换0-9的数字语音识别【含Matlab源码 384期】
【语音识别】基于matlab GUI DTW的0-9数字语音识别【含Matlab源码 385期】
【语音播放】基于matlab GUI MP3设计【含Matlab源码 425期】
【语音处理】基于人耳掩蔽效应的语音增强算法信噪比计算【含Matlab源码 428期】
【语音去噪】基于matlab谱减法去噪【含Matlab源码 429期】
【语音识别】基于matlab带动量项的BP神经网络语音识别【含Matlab源码 430期】
【语音隐写】基于matlab LSB语音隐藏【含Matlab源码 431期】
【语音识别】基于matlab男女声识别【含Matlab源码 452期】
【语音处理】基于matlab语音加噪和降噪处理【含Matlab源码 473期】
【语音去噪】基于matlab最小二乘法(LMS)自适应滤波器【含Matlab源码 481期】
【语音增强】基于matlab谱减法、最小均方和维纳滤波语音增强【含Matlab源码 482期】
【通信】基于matlab GUI数字频带(ASK、PSK、QAM)调制仿真 【含Matlab源码 483期】
【信号处理】基于matlab心电信号ECG滤波处理【含Matlab源码 484期】
【语音播报】基于matlab语音播报【含Matlab源码 507期】
【信号处理】基于matlab小波变换脑电信号特征提取【含Matlab源码 511期】
【语音处理】基于matlab GUI双音多频(DTMF)信号检测【含Matlab源码 512期】
【语音隐写】基于matlab LSB实现语音信号的数字水印【含Matlab源码 513期】
【语音增强】基于matlab匹配滤波器的语音识别【含Matlab源码 514期】
【语音处理】基于matlab GUI语音时域频域频谱图分析【含Matlab源码 527期】
【语音去噪】基于matlab LMS、RLS算法语音去噪【含Matlab源码 528期】
【语音去噪】基于matlab LMS谱减法语音去噪【含Matlab源码 529期】
【语音去噪】基于matlab 软阈值、硬阈值、折中阈值语音去噪【含Matlab源码 530期】
【语音识别】基于matlab特定人的语音识别分辨【含Matlab源码 534期】
【语音去噪】基于matlab小波软阈值语音降噪【含Matlab源码 531期】
【语音去噪】基于matlab小波硬阈值语音降噪【含Matlab源码 532期】
【语音识别】基于matlab MFCC和SVM的特定人性别识别【含Matlab源码 533期】
【语音识别】基于MFCC的GMM语音识别【含Matlab源码 535期】
【语音识别】基于matlab VQ特定人孤立词语音识别【含Matlab源码 536期】
【语音识别】基于matlab GUI声纹识别【含Matlab源码 537期】
【采集读写】基于matlab语音采集与读写【含Matlab源码 538期】
【语音编辑】基于matlab语音编辑【含Matlab源码 539期】
【语音模型】基于matlab语音信号数学模型【含Matlab源码 540期】
【语音响度】基于matlab语音声强与响度【含Matlab源码 541期】
【情感识别】基于matlab K近邻分类算法的语音情感识别【含Matlab源码 542期】
【情感识别】基于matlab支持向量机(SVM)的语音情感识别【含Matlab源码 543期】
【情感识别】基于神经网络的语音情感识别【含Matlab源码 544期】
【声源定位】基于matlab不同空间谱估计的声源定位算法比较【含Matlab源码 545期】
【声源定位】基于matlab不同信噪比下的麦克风接收信号【含Matlab源码 546期】
【声源定位】基于matlab单声源双麦克风的房间冲激响应【含Matlab源码 547期】
【声源定位】基于matlab广义互相关的声源定位【含Matlab源码 548期】
【声源定位】基于matlab阵列流形矩阵的信号显示【含Matlab源码 549期】
【特征提取】基于matlab共振峰估计【含Matlab源码 550期】
【特征提取】基于matlab基音周期估计【含Matlab源码 551期】

猜你喜欢

转载自blog.csdn.net/TIQCmatlab/article/details/114972407