【转】语音信号处理由浅入深

内容:

关于语音信号处理的书籍(MATLAB);

简单介绍:

    • 发音原理;
    • 一般的语音信号特征;
    • 短时频谱(MATLAB代码);短时功率谱;

简单方向介绍:

    • 语音增强;语音识别(HMM和HTKbooks介绍);


原博文地址:http://blog.sina.com.cn/s/blog_61c485330100nkys.html


========================================================================================================


做了2年半的语音信号处理方面的研究了,主要从事算法方面的研究,从一开始的采用S变换提取语音特征进行说话人识别,到后来的语音增强算法研究,HTK学习,然后又回到语音特征提取分析,感觉学习语音信号处理应该有个循序渐进的过程,总结一下,也希望能有这方面的专业人士批评指正。

 

语音信号处理知识准备阶段:

基础: 信号处理   数字信号处理   随机信号处理  数理统计 

语音信号处理方面必看书籍:离散时间语音信号处理——原理与应用     模式识别

强烈推荐三本利用MATLAB做语音信号处理的电子书:

1、http://neural.cs.nthu.edu.tw/jang/books/dcpr/(Data Clustering and Pattern Recognition (資料分群與樣式辨認))

2、http://mirlab.org/jang/books/audioSignalProcessing/index.asp(Audio Signal Processing and Recognition (音訊處理與辨識))

3、MATLAB扩展编程

这三本中有很多语音处理相关的源程序。

 

学习理解阶段:

1.理解语音的发声机理

语音一般模型   声带由周期脉冲(模拟浊音)+随机白噪声(模拟清音)——声道(AR 记得应该还有些模型,不记得简写了)——语音

语音信号处理由浅入深



 

2.熟悉语音分析一般分析的特征,理解各种算法在提取这些特征的实现过程,理解别人的算法时候,试着用其他算法实现,这是个培养兴趣的好方法。总结语音特征提取的方法:

基频提出(pitch):  自相关函数(ACF)   平均幅度差函数(AMDF)  Simple inverse filter tracking(SIFT)   Harmonic product spectrum (HPS)   Cepstrum method    praat    微软也有个提取算法2007年的一篇文献上有提到  通过观察语谱图也能初略看出基频

语音信号处理由浅入深

praat基频提取

 

共振峰:一般来说,语音段的波形重复率比较高,找出一个基本周期,这个基本周期形状和频率的大小分别代表着内容和音色,对它进行FFT,求得频率极大值点,称之为共振峰。共振峰也代表着声带震动后,经过声道这个谐振腔,得到的语言的频谱最大值点,因此也表示声道的谐振频率点,因此也可以通过求LPC间接求得。即先由LPC得到声道系统函数,再求声道频谱响应,接着用峰值检测法(或别的方法)检测峰值点,即为共振峰。

共振峰反映了声道的特征,一般多用来作为情感识别特征。

 

LPC:自相关法    Levinson递归

LPC系数代表声道特征,利用线性预测系数可以求得共振峰,由LPC得到的LPCC可以用来做语音识别,说话人识别等。

 

MFCC:分帧加窗——FFT——MEL滤波器——DCT

MFCC相对LPCC考虑了人的听觉掩蔽效果,即一个强度较小的频率成分可能被邻近的一个较强频率成分所掩蔽(频域掩蔽),或者两个时间上很接近的信号也可能产生掩蔽现象(时域掩蔽)。

 

过零率(ZCR):1.先将语音转化为整数形式(减小double型运算的误差),2.求取一帧信号ZCR时,可以将信号先减去直流分量,3.然后再点乘新信号向前或者向后移位一个信号点的信号,计算负数个数。

1.wave=wave*2^(bit-1);

2.frameMat(:,i)=frameMat(:,i)-round(mean(frameMat(:,i)));

3.zcr1=sum(frameMat(1:end-1, :).*frameMat(2:end, :)<0);

一般噪声和清音的过零率高,浊音的过零率低,过零率和音量配合可以用作端点检测

 

语谱(短时频谱):分帧加窗——FFT——平方    横坐标用帧(时间),纵坐标频率,灰度表示能量大小

这个程序小点,上传上来

function [x,y,L]=sogram(Data,Winsiz,Shift,Base,Mode,Gray,Fs)
Sg=Data;
n=floor((length(Sg)-Winsiz)/Shift)+1;
A=zeros(Winsiz/2+1,n);
for i=1:n
    n1=(i-1)*Shift+1;
    n2=n1+(Winsiz-1);
    s=Sg(n1:n2);
    s=s.*hanning(Winsiz);
    z=fft(s);
    z=z(1:(Winsiz/2)+1);
    z=z.*conj(z);
    z=10*log10(z);
    A(:,i)=z;
end
L0=(A>Base);
L1=(A<Base);
B=A.*L0+Base*L1;
L=(B-Base)./(max(max(B))-Base);
y=[0:Winsiz/2]*Fs/Winsiz;
x=[0:n-1]*Shift./Fs;
subplot(235);
% flipdim(L,1);
imagesc(x,y,B);
% set(gca,'ydir','reverse')
axis xy;
axis tight;
if Mode==1
    colormap('default');
else 
    mymode=gray;
    mymode=mymode(Gray:-1:1,:);
    colormap(mymode);
end

 

短时功率谱:信号分帧加窗——自相关——FFT

 

音量:可以理解为每帧信号的能量大小   

 

3.对研究领域的探索

语音增强:做得最多的就属语音增强这块,方法很多,谱减、Decision-director、non-cause、cause、MMSE、logMMES、掩蔽、维纳滤波、LMS等等,一般是将其中的几种方法结合。

对语音增强这块的理解,看了很多人开发的算法,自己也写过一些算法,我将它们分成了两类:谱衰减和非谱衰减,谱衰减就是利用带噪语音乘以谱衰减因子,原理简单,便于实现,从数字信号处理的角度来看就是寻找一个自适应的滤波器,这个滤波器的自适应因子是和每个时刻的噪声联系的,将带噪语音经过这样一个滤波器得到增强语音。非谱衰减理解为利用时频或者小波等方法分解语音,对每个部分去噪,然后再合成,诸如此类的方法。看过我师妹的EMD语音增强方法,效果相当不错,只是计算时间上需要改进。

 

语音识别:

语音识别根据识别对象和处理语音不同可以分为不同类,按对象分特定人和非特定人,按处理语音分孤立词识别和连续语音识别

接触的是HMM,理解HMM的一些好的网址:http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/main.html举例解释说明,适合初学者。

HTKBook里面说的比较清楚,但是也比较多。

HTK:下载地址http://htk.eng.cam.ac.uk/

HTK安装http://blog.sina.com.cn/s/blog_61c485330100iki0.html

HTK使用http://blog.sina.com.cn/s/blog_61c485330100ilpx.html

利用HTK做简单的YES/NO语音识别http://blog.sina.com.cn/s/blog_61c485330100in91.html

HTK使用过程可以抽象成为  

准备阶段:编写语法规则、词典文件、特征参数提取配置文件、HMM原型文件

处理阶段:录音HSLab(训练、识别用数据)——提取特征HCopy(可以同时提取训练、识别数据)—— 识别HVite

 

说话人识别

这块目前主要采用GMM说话人识别模型。

利用GMM模型,在训练的时候得到特征参数:  期望mu  协方差sigma  加权因子w,识别的时候,如果是说话人确认,则判断识别参数在GMM模型下概率是否在某个阈值之内,如果是说话人辨认,则选择概率最大的为识别对象。

 

端点检测

ZCR和能量结合的检测方法    信息熵(entropy)  

 

待续。。。



展开阅读全文

没有更多推荐了,返回首页