热门标签 | 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,:);


推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 常用工具(一)
    1.时间戳在线转换工具(1)链接https:tool.lutimestamp(2)说明可以通过此工具:将时间戳转为具体时间点,也可以将具体时间点转为时间戳(3)效果2.JSON在线 ... [详细]
  • 1关于字符串相邻的两个或多个字符串字面值(引号引起来的字符)将会自动连接到一起:str_catpython!str_cat输出:python!把很长 ... [详细]
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社区 版权所有