讯飞一个麦克风阵列简介
语音信号的采集:
语音信号计算机中是采用PCM编码按时间序列保存的一连串数据。计算机中最原始语音文件是wav,可以通过各种录音软件录制,录制是包括三个参数
fs:采样率 8000Hz 115200Hz 等等,代表每1秒保存的语音数据点数
bits:每个采样点用几个二进制保存
通道:很多音频都有左右2个通道,在语音识别中通常有一个通道的数据就够了。
语音信号预处理:
分帧:
首先说说我们做信号处理的目的----获得个频率成分的分布,而实现的该功能的数学方法就是FFT ,FFT要求输入信号时平稳的,语音作为非平稳信号要实现就要通过分帧
这里分帧就涉及到帧长,对于帧长要满足的条件有两点:
1、正常语速下,音素的持续时间大约是 50~200 毫秒,所以帧长一般取为小于 50 毫秒。
2、语音的基频,男声在 100 赫兹左右,女声在 200 赫兹左右,换算成周期就是 10 毫秒和 5 毫秒。既然一帧要包含多个周期,所以一般取至少 20 毫秒。
综上帧长一般取为 20 ~ 50 毫秒,20、25、30、40、50 都是比较常用的数值,以上摘自知乎逻辑上很合理的解释,我通常听见的是(10-30ms)
一帧的数据长度 N=帧时间长度/T=帧时间长度(单位秒)*fs(单位Hz)
加窗:
加窗的目的是让一帧信号的幅度在两端渐变到 0。渐变对傅里叶变换有好处,可以提高变换结果(即频谱)的分辨率,具体的数学就不讲了
加窗的代价是一帧信号两端的部分被削弱了,没有像中央的部分那样得到重视。弥补的办法是,帧不要背靠背地截取,而是相互重叠一部分。相邻两帧的起始位置的时间差叫做帧移,常见的取法帧移与帧长的比值一般取为0~1/2。
通常加窗之后我们可以通过FFT变化实现特征数的降维以及提取出比原始语音更具表征力的特征
以上可以理解为若干帧对应一个音素,若干音素对应一个单词,如果我们想要识别对应的单词状态,我们只要知道对应的帧状态就行,用计算机能识别的方式最简单的就是概率匹配,这些概率我们就可以通过声学模型获得,所以要做的就是通过训练获得合适的模型参数以拟合好的匹配效果。
GMM+HMM算法
语音识别就分为三步:第一步,把帧识别成状态(难点)。第二步,把状态组合成音素。第三步,把音素组合成单词。第一步可以当做gmm做的,后面都是hmm做的。
声学模型:描述一种语言的基本单位被称为音素Phoneme,例如BRYAN这个词就可以看做是由B, R, AY, AX, N五个音素构成的。英语中貌似有50多个音素,可以用50几个HMM state来表示这些音素,这种表示方法就是context independent模型中的单音素monophone模式。然而语音没有图像识别那么简单,因为我们再说话的时候很多发音都是连在一起的,很难区分,所以一般用左中右三个HMM state来描述一个音素,也就是说BRYAN这个词中的R音素就变成了用B-R, R, R-AY三个HMM state来表示。这样BRYAN这个词根据上下文就需要15个state了,根据所有单词的上下文总共大概需要几千个HMM state,这种方式属于context dependent模型中的三音素triphone模式。这个HMM state的个数在各家语音识别系统中都不一样,是一个需要调的参数。所以声学模型就是如何设置HMM state,对于信号中的每一frame抽怎样的特征,然后用训练什么分类器。
可以理解为整个GMM+HMM网络其实主要是为了HMM网络服务的,为什么这么说,先说说HMM对于语音识别需要解决的问题,比如把一系列MFCC特征正确的识别成对应HMM state 系列。这个过程涉及两个概率需要学习,一是把当前frame的特征识别为这个state的概率,也就是通常HMM中说的Likelihood---这里指计算层面(也是GMM中的mean vector 和covariance matrix ),即GMM网络是为了获得当前state状态概率的,二是上个state转化为这个state的概率也就是状态转移概率Transition probabilities,这个过程是HMM中说的 Decoding---这里指计算层面。一个序列转化为另一个序列理论上有指数级种转化方式,所以每一个frame只取概率最高的那个state,这样的路线选择方法被称为Viterbi 方法。
下面结合实际语音输入讲讲整个过程
首先我们在训练阶段,我们是知道这段语音所表示的句子吧。我们通过句子,然后分词,然后分成每个音素,在隐马尔科夫(HMM)模型中一般用3-5个上述的单元表示一个音素。简单的理解就是我们每个音素的均值和方差矩阵知道,通过我们的句子我们也知道每个音素间的转移概率矩阵。当然,这些是HMM里的事情。提取特征后的第一步就完成了,简单的说就是为了拟合多维高斯函数。
一开始,我们设置每个音素的均值和方差分别为0和1,转移概率矩阵在htk里也是可以设置两头小中间大,这个对于5个状态的hmm,即每个音素分为5个状态。这步就是初始化hmm。
然后,生成各个音素的hmm。这个可以根据发音字典和原始的hmm来生成。
最后,我们根据训练数据来训练音素级的hmm。这里用到hmm的三大问题。通过训练,我们会得到三个参数:初始状态概率分布π、隐含状态序列的转移矩阵A(就是某个状态转移到另一个状态的概率观察序列中的这个均值或者方差的概率)和某个隐含状态下输出观察值的概率分布B(也就是某个隐含状态下对应于)
整合大致过程如上,想了解具体推算过程参考
参考链接:知乎,CSDN