How does Speech Recognition finally recognize words
Time:2021-12-18
Views:2430
非算法,只能从业务流和原理上作解释
语音识别原理
回顾人类发展史,不难看出,随着人的不断进化,从最初通过手掌、肢体使用简单工具、传递简单信息,发展到控制发声并通过耳朵接收,形成了一个以语音为载体的快速信息传递通道和收发闭环,成为人类间最自然、最重要的信息交互手段。声波作为一种音频信号,和视频信号、无线电信号一样是,非接触方式的传播,也是人类唯一可以不借助工具就可自由掌控的一种天然“无线”资源。要让机器能够听见,首先要做的事情是我们需要将声波输入到计算机中。
信号处理,声学特征提取
我们都知道声音信号是连续的模拟信号,要让计算机处理首先要转换成离散的数字信号,进行采样处理。正常人听觉的频率范围大约在20Hz~20KHz之间,为了保证音频不失真影响识别,同时数据又不会太大,通常的采样率为16KHz。
语音采样
在数字化的过程中,我们首先要判断端头,确定语音的开始和结束,然后要进行降噪和过滤处理(除了人声之外,存在很多的噪音),保证让计算机识别的是过滤后的语音信息。获得了离散的数字信号之后,为了进一步的处理我们还需要对音频信号 分帧。因为离散的信号单独计算数据量太大了,按点去处理容易出现毛刺,同时从微观上来看一段时间内人的语音信号一般是比较平稳的,称为 短时平稳性,所以会需要将语音信号分帧,便于处理。
我们的每一个发音,称为一个 音素,是语音中的最小单位,比如普通话发音中的元音,辅音。不同的发音变化是由于人口腔肌肉的变化导致的,这种口腔肌肉运动相对于语音频率来说是非常缓慢的,所以我们为了保证信号的短时平稳性,分帧的长度应当小于一个音素的长度,当然也不能太小否则分帧没有意义。
通常一帧为20~50毫秒,同时帧与帧之间有交叠冗余,避免一帧的信号在两个端头被削弱了影响识别精度。常见的比如 帧长为25毫秒,两帧之间交叠15毫秒,也就是说每隔25-15=10毫秒取一帧,帧移为10毫秒,分帧完成之后,信号处理部分算是完结了。
随后进行的就是整个过程中极为关键的特征提取。将原始波形进行识别并不能取得很好的识别效果,而需要进行频域变换后提取的特征参数用于识别。常见的一种变换方法是提取MFCC特征,根据人耳的生理特性,把每一帧波形变成一个多维向量,可以简单地理解为这个向量包含了这帧语音的内容信息。
实际应用中,这一步有很多细节,声学特征也不止有MFCC这一种,具体这里不讲,但是各种特征提取方法的核心目的都是统一的:尽量描述语音的根本特征,尽量对数据进行压缩。
比如下图示例中,每一帧f1,f2,f3…转换为了14维的特征向量,然后整个语音转换为了14*N(N为帧数)的向量矩阵。
分帧示意图
一帧一帧的向量如果不太直观,还可以用下图的频谱图表示语音,每一列从左到右都是一个25毫秒的块,相比于原始声波,从这种数据中寻找规律要容易得多。
发音Robert的频谱图
不过频谱图主要用作语音研究,语音识别还是需要用一帧一帧的特征向量。
识别字符,组成文本
特征提取完成之后,就进入了特征识别,字符生成环节。这部分的核心工作就是从 每一帧当中找出当前说的音素,再由多个音素组成单词,再由单词组成文本句子。 其中最难的当然是从每一帧中找出当前说的音素,因为我们每一帧是小于一个音素的,多个帧才能构成一个音素,如果最开始就错了则后续很难纠正。
怎么判断每一个帧属于哪个音素了?最容易实现的办法就是概率,看哪个音素的概率最大,则这个帧就属于哪个音素。那如果每一帧有多个音素的概率相同怎么办,毕竟这是可能的,每个人口音、语速、语气都不同,人也很难听清楚你说的到底是Hello还是Hallo。而我们语音识别的文本结果只有一个,不可能还让人参与选择进行纠正。
这时候多个音素组成单词的统计决策,单词组成文本的统计决策就发挥了作用,它们也是同样的基于概率:音素概率相同的情况下,再比较组成单词的概率,单词组成之后再比较句子的概率。
比如以上那个词很有可能是「HHHEE_LL_LLLOOO」。但它同时认为我说的也可能是「HHHUU_LL_LLLOOO」,或者甚至是「AAAUU_LL_LLLOOO」。我们可以遵循一些步骤来整理这个输出。首先,我们将用单个字符替换任何重复的字符:
· HHHEE_LL_LLLOOO 变为 HE_L_LO· HHHUU_LL_LLLOOO 变为 HU_L_LO· AAAUU_LL_LLLOOO 变为 AU_L_LO
然后,我们将删除所有空白:
· HE_L_LO 变为 HELLO· HU_L_LO 变为 HULLO· AU_L_LO 变为 AULLO
这让我们得到三种可能的转写——「Hello」、「Hullo」和「Aullo」,最终根据单词概率我们会发现Hello是最可能的,所以输出Hello的文本。上面的例子很明确的描述怎么从帧到音素,再从音素到单词,概率决定一切,那这些概率是怎么获得的了?难道为了识别一种语言我们把人类几千上百年说过的所有音素,单词,句子都统计出来,然后再计算概率?傻子都知道这是不可能的,那怎么办,这时我们就需要模型:
声学模型
发声的基本音素状态和概率,尽量获得不同人、不同年纪、性别、口音、语速的发声语料,同时尽量采集多种场景安静的,嘈杂的,远距离的发声语料生成声学模型。为了达到更好的效果,针对不同的语言,不同的方言会用不同的声学模型,在提高精度的同时降低计算量。
语言模型
单词和语句的概率,使用大量的文本训练出来。如果模型中只有两句话“今天星期一”和“明天星期二”,那我们就只能识别出这两句,而我们想要识别更多,只需要涵盖足够的语料就行,不过随之而来的就是模型增大,计算量增大。所以我们实际应用中的模型通常是限定应用域的,同比如智能家居的,导航的,智能音箱的,个人助理的,医疗的等等,降低计算量的同时还能提高精度,
词汇模型
针对语言模型的补充,语言词典和不同的发音标注。比如定期更新的地名,人名,歌曲名称,热词,某些领域的特殊词汇等等。
语言模型和声学模型可以说是语音识别中最重要的两个部分,语音识别中一个很重要的工作就是训练模型,有不识别的句子我们就加进去重新训练。不过我们在训练和计算概率时会发现一个问题,假设某条句子S出现的概率为P(S),其中单词序列为W1,W2,W3 …, Wn
P(S) = P(W1,W2,W3 …, Wn) 展开为每个词出现的条件概率相乘= P(W1)·P(W2|W1)·P(W3|W1,W2)···P(Wn|W1,W2,W3 …, Wn-1)
从计算上看第一个词的条件概率P(W1)很好计算,第二个词P(W2|W1)在已知第一个词的情况下,还不太麻烦,第三个词开始变得很难了,因为涉及到三个变量W1,W2,W3,每一个词都可能是一种语言字典的大小,到了Wn基本无法估计了,计算量太大了。
这时我们有很多简化但是有效的方法进行计算,比如说HMM隐马尔科夫模型Hidden Markov Model。
隐马尔科夫模型基于了两个最大的假设:一是内部状态的转移只与上一状态有关,另一是输出值只与当前状态(或当前的状态转移)有关。就把问题简化了,
也就是说一个句子中某个单词序列出现的概率只和前面的一个单词有关,这样计算量就被大大简化了。
P(S) = P(W1)·P(W2|W1)·P(W3|W2)···P(Wn|Wn-1)
如上图示例,基于隐马尔科夫算法生成语言模型。我们只要按照实际要求构造出对应的模型,模型中涵盖足够的语料,就能解决各种语音识别问题。
语音识别过程其实就是在模型的状态网络中搜索一条最佳路径,语音对应这条路径的概率最大,这称之为“解码”。路径搜索的算法是一种动态规划剪枝的算法,称之为Viterbi算法,用于寻找全局最优路径。
如此一来整个语音识别的流程就很清晰了,再来回顾以下整个步骤:
信号处理:模数转换,识别端头,降噪等等。信号表征:信号分帧,特征提取,向量化等等。模式识别:寻找最优概率路径,声学模型识别音素,词汇模型和语言模型识别单词和句子。ASR语音识别模型
最后将语音识别成文本。
JimmyChen:语音交互(一)—— 语音识别JimmyChen:智能语音专题(三):泛语音识别
免责声明: 本文章转自其它平台,并不代表本站观点及立场。若有侵权或异议,请联系我们删除。谢谢! |