• 语音信号处理基础


    这是学习时的笔记,包含相关资料链接,有的当时没有细看,记录下来在需要的时候回顾。

    有些较混乱的部分,后续会再更新。

    欢迎感兴趣的小伙伴一起讨论,跪求大神指点~


    Material

    综述

    1. Bowon Lee, Mark Hasegawa-Johnson. Minimum Mean-squared Error A Posteriori Estimation of High Variance Vehicular Noise

    method: MMSE,最小均方误
    针对汽车噪音
    code: https://github.com/mwv/vad

    1. https://github.com/kunaljathal/VAD

    提取特征设定阈值(语音频带能量比,周期性测量,运行最小最大均方根能量估计,自适应和噪声阈值计算,拖尾平滑以淡入淡出语音/噪音边界)

    1. Audio-Visual Voice Activity Detection Using Diffusion Maps
    2. Deep Belief Networks Based Voice Activity Detection
    3. DENOISING DEEP NEURAL NETWORKS BASED VOICE ACTIVITY DETECTION
    4. RECURRENT NEURAL NETWORKS FOR VOICE ACTIVITY DETECTION

    Information

    难点

    1. 算法假设背景噪声在长时间内是平稳的,当实际噪声环境为非平稳噪声或剧烈变化时,算法检测性能急剧下滑
    2. 绝大多数算法依赖语音信号本身音节的特征对语音和噪音进行区分。某些以清音或摩擦音、爆破音开头的语音信号易被淹没,导致语音丢失。同时,在大多数算法的语音起始和结束段检测效果不佳。

    假设

    • 在信号处理时,将语音信号作为一个短时的平稳过程来处理(语音信号具有短时平稳性)。实际处理中,将连续的语音数据流用一个窗函数序列分割成连续段,然后对每一段(帧)进行处理。
      典型的分割窗序列:矩形窗、海明窗、汉宁窗

      频谱泄露与傅里叶变换尤其是离散时间傅里叶变换有关:信号为无限长序列,运算需要截取其中一部分(截断),于是需要加窗函数,加了窗函数相当于时域相乘,于是相当于频域卷积,于是频谱中除了本来该有的主瓣之外,还会出现本不该有的旁瓣,这就是频谱泄露!为了减弱频谱泄露,可以采用加权的窗函数,加权的窗函数包括平顶窗、汉宁窗、高斯窗等等。而未加权的矩形窗泄露最为严重。(主瓣通常指Sa(x)=sinx/x函数或与之有关的函数图像(例如频谱)中从负到正第一个完整的瓣,旁瓣是指后面其他的低矮的瓣。)

    语音信号时域

    以时间作为参照来观察动态世界的方法我们称其为时域分析

    • 短时能量:标志语音信号在计算长度内的幅度大小,可以由它的量值粗略判断语音信号有无,也可以判断该帧是请是浊。实际处理中,一般不单独计算语音帧的能量,而是利用自相关法求解LPC系数,自相关序列第一个值代表帧能量。
    • 短时过零率:信号变化快慢
    • 自相关函数:估计基音周期
    • 基音检测

    语音信号频域

    • 短时傅立叶变换(STFT)
    • 频谱分析:0dB是播放设备所输出信号的最大值。所以软件里,经常在0以下,就是负值了。频谱反映的是这个瞬间,音频信号各分量的电平值大小。

    你眼中看似落叶纷飞变化无常的世界,实际只是躺在上帝怀中一份早已谱好的乐章。 ——> 时域和频域

    语音信号特征提取

    激励模型:发浊音时声带的不断开启和关闭将产生间歇的脉冲波,浊音具有周期性。发清音时声带不振动,因此清音没有周期性。清音由空气摩擦产生,在分析研究时等效为随机白噪声。
    声道模型:声道部分的数学模型目前有两种观点,一种是将声道视为多个不同截面积的管子串联而形成的系统,即“声管模型”,另一种是将声道视为一个谐振腔,即“共振峰模型”。
    辐射模型:辐射模型表征口和唇的辐射效应和圆形头部的绕射效应。
     
    音素:语音中最小的基本单位是音素。分为元音和辅音。(元音和共振峰关系密切)
    

    声强

    在物理学中,把单位时间内通过垂直于声波传播方向的单位面积的平均声能,称为声强。实验的研究表明,人对声音强弱的感觉并不是与声强成正比,而是与其对数成正比的。
    SIL=10lg[I/I’]=10lg(I/I’)
    式中I为声强,I’=10e-12瓦/平米称为基准声强,声强级的常用单位是分贝(dB)
    

    响度

    一般来说,声音频率一定时,声强越强,响度也越大。但是响度与频率有关,相同的声强,频率不同时,响度也可能不同。响度若用对数值表示,即为响度级,响度级的单位定义为方,符号为phon。根据国际协议规定,0dB声级的1000Hz纯音的响度级定义为0 phon,n dB声级的1000Hz纯音的响度级就是n phon。
    

    音高

    音高也是一种主观心理量,是人类听觉系统对于声音频率高低的感觉。音高的单位是美尔(Mel)。响度级为40 phon,频率为1000Hz的声音的音高定义为1000Mel。
    

    基音周期和基音频率
    基音周期

    基音周期描述了语音激励源的一个重要特征,它反映了声门相邻两次开闭之间的时间间隔或开闭的频率。(因为女性基频比男性高,所以有些算法中使用基频来区分性别,还挺准的)
    

    基音周期的估算方法

    基音周期的估算方法很多,比较常用的有自相关法,倒谱法(我们提基频用的倒谱法),平均幅度差函数法,线性预测法,小波—自相关函数法,谱减—自相关函数法等。
    
    自相关法:
    1. 预处理:为了提高基音检测的可靠性,有人提出了端点检测和带通数字滤波器两种预处理方法对原始信号进行预处理。在提取基频时端点检测比一般端点检测更为严格(一般端点检测会保留语音有话段的头和尾,以避免把有用信息当作噪声滤除,但头和尾不包括基频信息,所以在进行提取基音的端点检测时阈值设定更为严格,滤去头部和尾部)。用带通滤波器预处理的目的是为了防止共振峰第一峰值的干扰,一般带通滤波器的频率范围选为60~500Hz。
    2. 自相关法:短时自相关函数的定义为 其中k是时间的延迟量,N为帧长,短时自相关函数具有以下重要性质。若当原信号具有周期性,那么它的自相关函数也具有周期性,并且周期性与原信号的周期相同。且在K等于周期整数倍时会出现峰值。清音信号无周期性,它的自相关函数会随着K的增大呈衰减趋势,浊音具有周期性,它的R(k)在基因周期整数倍上具有峰值,通常取第一最大峰值点作为基因周期点。自相关函数法基音检测正是利用这一性质来进行基因周期检查的。
    

    信噪比

    定义:信噪比的计量单位是dB,其计算方法是10lg(PS/PN),其中PS和PN分别代表信号和噪声的功率(用能量也是一样的)。
    在噪声和语音完全混杂的情况下信噪比很难计算,在预知噪声的情况下,可以用实际信号(纯语音+噪声)减去噪声,得到近似的纯语音信号。从而通过进一步计算求得信噪比。
    我们在实验中所采集的信号信噪比低时在10几dB,信噪比高时在30dB以上。
    

    梅尔倒谱系数

    在语音识别(Speech Recognition)和话者识别(Speaker Recognition)方面,最常用到的语音特征就是梅尔倒谱系数。梅尔倒谱系数是在Mel标度频率域提取出来的倒谱参数,Mel标度描述了人耳频率的非线性特性,它与频率的关系可用下式近似表示:
    Mel(f)=2595*lg(1+f/700),式中f为频率,单位为Hz。计算方法点[这里](http://blog.csdn.net/u010451580/article/details/51178190)。
    
    人类对不同频率语音有不同的感知能力:对1kHz以下,与频率成线性关系,对1kHz以上,与频率成对数关系。频率越高,感知能力就越差了。因此,在应用中常常只使用低频MFCC,而丢弃中高频MFCC。
    

    短时能量

    短时平均幅度

    短时平均幅度也是一帧语音信号能量大小的表征,它与短时能量的区别在于计算时不论采样值的大小,不会因为取二次方而造成较大的差异。
    

    短时平均过零率

    短时平均过零率表示一帧语音中语音信号波形穿过横轴(零电平)的次数。
    

    共振峰

    共振峰是指在声音的频谱中能量相对集中的一些区域,共振峰不但是音质的决定因素,而且反映了声道(共振腔)的物理特征。
    
    声音在经过共振腔时,受到腔体的滤波作用,使得频域中不同频率的能量重新分配,一部分因为共振腔的共振作用得到强化,另一部分则受到衰减。由于能量分布不均匀,强的部分犹如山峰一般,故而称之为共振峰。
    
    在语音声学中,共振峰决定着元音的音质。共振峰可以等效为声道系统函数的复极点对,由于人的声道平均长度为17cm,而语音信号的能量主要集中在0-5kHz。因此语音通常包含4到5个稳定的共振峰,一般只需要研究前三个共振峰。
    

    共振峰:单元音频谱图,橫轴为频率,纵轴为分贝。每一尖峰代表一个谐波,谐波频率不稳定所以呈尖峰图形。几个相邻的比较高的尖峰组成共振峰,共振峰频率是它们的包络线所在的峰值。

    MFCC

    理论

    https://my.oschina.net/jamesju/blog/193343
    http://blog.csdn.net/u014332048/article/details/43021789

    ?两个DCT公式貌似不一样,MFCC的维度到底和什么相关?本来以为是滤波器个数。

    https://my.oschina.net/zzw922cn/blog/533175
    http://blog.csdn.net/fengzhonghen/article/details/51722555
    http://blog.csdn.net/joey_su/article/details/36414877

    快速傅立叶变换后的点数(维度)由来

    这里需要先介绍下Nyquist频率,奈奎斯特频率(Nyquist频率)是离散信号系统采样频率的一半,因哈里·奈奎斯特(Harry Nyquist)或奈奎斯特-香农采样定理得名。采样定理指出,只要离散系统的奈奎斯特频率高于被采样信号的最高频率或带宽,就可以避免混叠现象。在语音系统中我通常采样率取16khz,而人发生的频率在300hz~3400hz之间,按照Nyquist频率的定义就有Nyquist频率等于8khz高于人发生的最高频率,满足Nyquist频率的限制条件。FFT就是根据Nyquist频率截取采样率的一半来计算,具体来说就是,假设一帧有512个采样点,傅里叶变换的点数也是512,经过FFT计算后输出的点数是257(N/2+1),其含义表示的是从0(Hz)到采样率/2(Hz)的N/2+1点频率的成分。也就是说在经过FFT计算时不仅把信号从时域转到了频域并且去除了高于被采样信号的最高频率的点的影响,同时也降低了维度。

    参数

    TARGETRATE=100000
    -窗间隔为10ms
    
    WINDOWSIZE=250000
    -窗长为25ms
    注:HTK中时间单位为100ns
    
    ZMEANSOURCE=T
    -将来源文件取zeromean,即去掉DC值
    
    USEHAMMING=T
    -使用hammingwindow
    
    PREEMCOEF=0.97
    -预加重系数0.97
    
    NUMCHANS=26
    -在MEL刻度下等分成26个频带
    
    USEPOWER=F
    -不使用c(0)参数
    
    NUMCEPS=13
    -最后使用13阶MFCC
    
    CEPLIFTER= 22                     
    -倒谱滤波系数
    
    ENORMALISE=T
    -窗的能量值做正规化
    
    LOFREQ=200
    -设定频带的下截止频率
    
    HIFREQ=3500
    -设定频带的上截止频率
    

    代码

    htk计算mfcc
    github:Gist: 里面的mfcc之后好好看看,浏览了一下,写的很少。

    Delta

    式中,dt表示第t个一阶差分,Ct表示第t个倒谱系数,Q表示倒谱系数的阶数,K表示一阶导数的时间差,可取1或2。将上式的结果再代入就可以得到二阶差分的参数。


    Voice-Activity-detection-master

    Code

    stringstream ss;
    ss << "example_" << i << ".txt";
    ofstream myfile;
    cout << ss.str();
    const string &s = ss.str();
    const char * p = s.c_str();
    myfile.open (ss.str());
    
    //error
    /your_VAD_folder/VAD/Voice-Activity-Detection-master/voice_detection.cpp: In function ‘int main()’:
    /your_VAD_folder/VAD/Voice-Activity-Detection-master/voice_detection.cpp:91:24: error: no matching function for call to ‘std::basic_ofstream<char>::open(std::basic_stringstream<char>::__string_type)’
       myfile.open (ss.str());
                            ^
    //修改:使用C的字符串。
    const string &s = ss.str();
    const char * p = s.c_str();
    myfile.open (p);
    
    //因为std::ofstream::open中
    //c++11
    void open (const   char* filename,  ios_base::openmode mode = ios_base::out);
    void open (const string& filename,  ios_base::openmode mode = ios_base::out);
    //c++98
    void open (const char* filename,  ios_base::openmode mode = ios_base::out);
    //C++的string类无法作为open的参数。
    

    操作

    sudo apt-get install fftw3 fftw3-dev fftw3-doc

    PCM (脉冲编码调制)
    wav格式 signed 16 bit PCM
    归一化时除以2的15次,因为第16位是符号



    (若非特别声明,文章均为Vanessa的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除)

  • 相关阅读:
    用一个案列详细讲解UITextFiled
    iOS开发中的内存分配(堆和栈)
    一次性解决导航栏的所有问题
    iOS 枚举的巧用
    iOS高仿app源码:纯代码打造高仿优质《内涵段子》
    如何实现百度外卖APP个人中心头像"浪"起来的动画效果
    手把手教你修改iOS版QQ的运动步数
    UIView的layoutSubviews和drawRect方法何时调用
    内存恶鬼drawRect
    iOS 离屏渲染的研究
  • 原文地址:https://www.cnblogs.com/Vanessa-Feng/p/7449709.html
Copyright © 2020-2023  润新知