热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

转:语音信号预处理及特征参数提取

参考链接:https:zhuanlan.zhihu.comp266805991.WAVE文件格式在进行语音信号处理时,基本上会采用WAVE文件进行处理。

参考链接: https://zhuanlan.zhihu.com/p/26680599


1. WAVE文件格式

在进行语音信号处理时,基本上会采用WAVE文件进行处理。WAVE文件格式有什么特点呢?为什么要使用WAVE文件呢?

1.1 资源互换文件格式——RIFF


在windows环境下,大部分的多媒体文件都依循着一些通用的结构来存放,这些结构称为“资源互换文件格式”(Resources Interchange File Format),简称RIFF。RIFF可以看作一种树状结构,其基本构成单位是块(chunk)。每个块由“辨别码”、“数据大小”及“数据”等构成。
RIFF文件的前4字节为其辨别码“RIFF"的ASCII字符码,紧跟其后的双字节数据则标示整个文件大小(单位为字节Byte)。由于表示文件长度或块长度的”数据大小“信息占用4Byte,所以,事实上一个WAVE文件或文件中块的长度为数据大小加8。

1.2 WAVE文件格式

WAVE文件格式是windows中关于声音的一种标准格式,也是RIFF文件格式支持的一种格式,这种格式已成为Windows中的基本声音格式。整个WAVE文件可以分成两部分:前一部分为文件头,后一部分为数据块。根据其编码方式和采样数的不同,这两部分的大小有所不同。在WAVE文件中,所采用的编码方式有PCM(Pulse Code Modulation-脉冲编码调制)和ADPCM(Adaptive Differential Pulse Code Modulation-自适应差分脉冲编码调制)两种。

WAVE文件是非常简单的一种RIFF文件,它的格式类型为"WAVE"。RIFF块包含两个子块,这两个子块的ID分别是"fmt"和"data",其中"fmt"子块由结构PCMWAVEFORMAT所组成,其子块的大小就是sizeofof(PCMWAVEFORMAT),数据组成就是PCMWAVEFORMAT结构中的数据。

下面是一个语音的数据:

下面是数据中每个字节的内容:


2. 语音的预处理

在对语音信号进行分析和处理之前,必须对其进行预加重、分帧、加窗等预处理操作。这些操作的目的是消除因为人类发声器官本身和由于采集语音信号的设备所带来的混叠、高次谐波失真、高频等等因素,对语音信号质量的影响。尽可能保证后续语音处理得到的信号更均匀、平滑,为信号参数提取提供优质的参数,提高语音处理质量。

2.1 预加重

语音信号s(n)的平均功率谱受声门激励和口鼻辐射的影响,高频端大约在800Hz以上按6dB/oct (倍频程)衰减,频率越高相应的成分越小,为此要在对语音信号s(n)进行分析之前对其高频部分加以提升。通常的措施是用数字滤波器实现预加重,预加重网络的输出 和输入的语音信号s(n)的关系为:

其中a为预加重系数,一般取,本系统中取a= 0.9375。

单词 interesting数据显示


单词 interesting数据经预加重后

2.2 分帧


贯穿于语音分析全过程的是“短时分析技术”。语音信号具有时变特性,但是在一个短时间范围内(一般认为在10~30ms的短时间内),其特性基本保持不变即相对稳定,因而可以将其看作是一个准稳态过程,即语音信号具有短时平稳性。所以任何语音信号的分析和处理必须建立在“短时”的基础上,即进行“短时分析”,将语音信号分段来分析其特征参数,其中每一段称为一“帧”,帧长一般取为10~30ms。这样,对于整体的语音信号来讲,分析出的是由每一帧特征参数组成的特征参数时间序列。


2.3 加窗

由于语音信号具有短时平稳性,我们可以对信号进行分帧处理。紧接着还要对其加窗处理。窗的目的是可以认为对抽样n附近的语音波形加以强调而对波形的其余部分加以减弱。对语音信号的各个短段进行处理,实际上就是对各个短段进行某种变换或施以某种运算。用得最多的三种窗函数是矩形窗、汉明窗(Hamming)和汉宁窗(Hanning),其定义分别为:

矩形窗和汉明窗的比较:
矩形窗,主瓣较窄,具有较高的频率分辨率,但具有较高的旁瓣,相邻谐波干扰比较严重。与矩形窗相比,汉明窗得到的频谱却要平滑得多。

2.4 端点检测

2.4.1 短时能量


短时能量序列反映了语音振幅或能量随着时间缓慢变化的规律

2.4.2 过零率


语音信号处理中的端点检测主要是为了自动检测出语音的起始点及结束点。

这里我们采用了双门限比较法来进行端点检测。双门限比较法以短时能量E和短时平均过零率Z作为特征,结合Z和E的优点,使检测更为准确,有效降低系统的处理时间,能排除无声段的噪声干扰,从而提高的语音信号的处理性能。



function [x1,x2] = vad(x)


%幅度归一化到[-1,1]
x = double(x);
x = x / max(abs(x));

%常数设置
FrameLen = 240;
FrameInc = 80;

amp1 = 10;
amp2 = 2;
zcr1 = 10;
zcr2 = 5;

maxsilence = 8; % 610ms = 30ms
minlen = 15; % 15
10ms = 150ms
status = 0;
count = 0;
silence = 0;

%计算过零率
tmp1 = enframe(x(1:end-1), FrameLen, FrameInc);
tmp2 = enframe(x(2:end) , FrameLen, FrameInc);
signs &#61; (tmp1.*tmp2)<0;
diffs &#61; (tmp1 -tmp2)>0.02;
zcr &#61; sum(signs.*diffs, 2);

%计算短时能量
amp &#61; sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);

%调整能量门限
amp1 &#61; min(amp1, max(amp)/4);
amp2 &#61; min(amp2, max(amp)/8);

%开始端点检测
x1 &#61; 0;
x2 &#61; 0;
for n&#61;1:length(zcr)
goto &#61; 0;
switch status
case {0,1} % 0 &#61; 静音, 1 &#61; 可能开始
if amp(n) > amp1 % 确信进入语音段
x1 &#61; max(n-count-1,1);
status &#61; 2;
silence &#61; 0;
count &#61; count &#43; 1;
elseif amp(n) > amp2 | … % 可能处于语音段
zcr(n) > zcr2
status &#61; 1;
count &#61; count &#43; 1;
else % 静音状态
status &#61; 0;
count &#61; 0;
end
case 2, % 2 &#61; 语音段
if amp(n) > amp2 | … % 保持在语音段
zcr(n) > zcr2
count &#61; count &#43; 1;
else % 语音将结束
silence &#61; silence&#43;1;
if silence count &#61; count &#43; 1;
elseif count status &#61; 0;
silence &#61; 0;
count &#61; 0;
else % 语音结束
status &#61; 3;
end
end
case 3,
break;
end
end

count &#61; count-silence/2;
x2 &#61; x1 &#43; count -1;

subplot(311)
plot(x)
axis([1 length(x) -1 1])
ylabel(‘Speech’);
line([x1FrameInc x1FrameInc], [-1 1], ‘Color’, ‘red’);
line([x2FrameInc x2FrameInc], [-1 1], ‘Color’, ‘red’);

subplot(312)
plot(amp);
axis([1 length(amp) 0 max(amp)])
ylabel(‘Energy’);
line([x1 x1], [min(amp),max(amp)], ‘Color’, ‘red’);
line([x2 x2], [min(amp),max(amp)], ‘Color’, ‘red’);

subplot(313)
plot(zcr);
axis([1 length(zcr) 0 max(zcr)])
ylabel(‘ZCR’);
line([x1 x1], [min(zcr),max(zcr)], ‘Color’, ‘red’);
line([x2 x2], [min(zcr),max(zcr)], ‘Color’, ‘red’);




3. MFCC特征参数提取



什么是语音的特征参数?特征参数包括什么?怎么提取?

在语音信号中&#xff0c;包含着非常丰富的特征参数&#xff0c;不同的特征向量表征着不同的物理和声学意义。选择什么特征参数对说话人识别系统的成败意义重大。如果选择了好的特征参数&#xff0c;将有助于提高识别率。特征提取就是要尽量取出或削减语音信号中与识别无关的信息的影响&#xff0c;减少后续识别阶段需处理的数据量&#xff0c;生成表征语音信号中携带的说话人信息的特征参数。根据语音特征的不同用途&#xff0c;需要提取不同的特征参数&#xff0c;从而保证识别的准确率。

常用的语音特征参数有LPCC 和MFCC。LPCC 参数是根据声管模型建立的特征参数, 主要反映声道响应。MFCC 参数是基于人的听觉特性利用人听觉的临界带效应, 在Mel 标度频率域提取出来的倒谱特征参数。

Mel倒谱系数是根据人类听觉系统的特性提出的&#xff0c;模拟人耳对不同频率语音的感知。人耳分辨声音频率的过程就像一种取对数的操作。例如&#xff1a;在Mel频域内&#xff0c;人对音调的感知能力为线性关系&#xff0c;如果两段语音的Mel频率差两倍&#xff0c;则人在感知上也差两倍。

MFCC算法过程&#xff1a;

(1) 快速傅里叶变换(FFT)







(2) 将实际频率尺度转换为Mel频率尺度&#xff1a;





(3) 配置三角形滤波器组并计算每一个三角形滤波器对信号幅度谱滤波后的输出&#xff1a;





(4) 对所有滤波器输出作对数运算&#xff0c;再进一步做离散余弦变换(DTC)&#xff0c;即可得到MFCC&#xff1a;




function ccc &#61; mfcc(x)

% 归一化mel滤波器组系数

bank&#61;melbankm(24,256,8000,0,0.5,‘m’);

bank&#61;full(bank);

bank&#61;bank/max(bank(?);

% DCT系数,1224
for k&#61;1:12
n&#61;0:23;
dctcoef(k,:)&#61;cos((2
n&#43;1)kpi/(2*24));
end

% 归一化倒谱提升窗口
w &#61; 1 &#43; 6 * sin(pi * [1:12] ./ 12);
w &#61; w/max(w);

% 预加重滤波器
xx&#61;double(x);
xx&#61;filter([1 -0.9375],1,xx);

% 语音信号分帧
xx&#61;enframe(xx,256,80);

% 计算每帧的MFCC参数
for i&#61;1:size(xx,1)
y &#61; xx(i,:);
s &#61; y’ .* hamming(256);
t &#61; abs(fft(s));
t &#61; t.^2;
c1&#61;dctcoef * log(bank * t(1:129));
c2 &#61; c1.*w’;
m(i,:)&#61;c2’;
end

%差分系数
dtm &#61; zeros(size(m));
for i&#61;3:size(m,1)-2
dtm(i,:) &#61; -2m(i-2,:) - m(i-1,:) &#43; m(i&#43;1,:) &#43; 2m(i&#43;2,:);
end
dtm &#61; dtm / 3;

%合并mfcc参数和一阶差分mfcc参数
ccc &#61; [m dtm];
%去除首尾两帧&#xff0c;因为这两帧的一阶差分参数为0
ccc &#61; ccc(3:size(m,1)-2,:);


推荐阅读
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
author-avatar
mobiledu2502880777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有