语音信号处理

来源:互联网 发布:jsp网上报名系统源码 编辑:程序博客网 时间:2024/05/14 12:27

做了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)  
 
待续。。。

0 0
原创粉丝点击