admin 发表于 2022-6-24 22:37:16

浅谈语音识别、匹配算法和模型

https://p3-sign.toutiaoimg.com/2338/7797185486~tplv-tt-large.jpeg?x-expires=1971444879&x-signature=oskdpuXxogj%2FdjVz5BZtskiO7fI%3D

语音的基本概念

语音是一个复杂的现象。我们基本上不知道它是如何产生和被感知的。我们最基础的认识就是语音是由单词来构成的,然后每个单词是由音素来构成的。但事实与我们的理解大相径庭。语音是一个动态过程,不存在很明显的部分划分。通过音频编辑软件去查看一个语音的录音对于理解语音是一个比较有效的方法。下面就是一个录音在音频编辑器里的显示的例子。

https://p3-sign.toutiaoimg.com/2339/7649728424~tplv-tt-large.jpeg?x-expires=1971444879&x-signature=UuqNAQXe9qPGmQSOUN7D%2FcTsDww%3D

目前关于语音的所有描述说明从某种程度上面讲都是基于概率的(基于频谱?)。这意味着在语音单元或者单词之间并没有确定的边界。语音识别技术没办法到达100%的准确率。这个概念对于软件开发者来说有点不可思议,因为他们所研究的系统通常都是确定性的。另外,对于语音技术来说,它会产生很多和语言相关的特定的问题。

语音的构成

在本文中,我们是按照以下方式去理解语音的构成的:

语音是一个连续的音频流,它是由大部分的稳定态和部分动态改变的状态混合构成。

一个单词的发声(波形)实际上取决于很多因素,而不仅仅是音素,例如音素上下文、说话者、语音风格等;

协同发音(指的是一个音受前后相邻音的影响而发生变化,从发声机理上看就是人的发声器官在一个音转向另一个音时其特性只能渐变,从而使得后一个音的频谱与其他条件下的频谱产生差异。)的存在使得音素的感知与标准不一样,所以我们需要根据上下文来辨别音素。将一个音素划分为几个亚音素单元。如:数字“three”,音素的第一部分与在它之前的音素存在关联,中间部分是稳定的部分,而最后一部分则与下一个音素存在关联,这就是为什么在用HMM模型做语音识别时,选择音素的三状态HMM模型。(上下文相关建模方法在建模时考虑了这一影响,从而使模型能更准确地描述语音,只考虑前一音的影响的称为Bi-Phone,考虑前一音和后一音的影响的称为 Tri-Phone。)

有时候,音素会被放在上下文中考虑,这样就形成了三元音素或者多元音素。但它与亚音素不同,他们在波形中匹配时长度还是和单一音素一样。只是名字上的不同而已,所以我们更倾向于将这样的多元音素称为senone。一个senone的上下文依赖比单纯的左右上下文复杂得多,它是一个可以被决策树或者其他方式来定义的复杂函数。(英语的上下文相关建模通常以音素为基元,由于有些音素对其后音素的影响是相似的,因而可以通过音素解码状态的聚类进行模型参数的共享。聚类的结果称为senone。决策树用来实现高效的triphone对senone的对应,通过回答一系列前后音所属类别(元/辅音、清/浊音等等)的问题,最终确定其HMM状态应使用哪个senone。分类回归树CART模型用以进行词到音素的发音标注。)

音素phones构成亚单词单元,也就是音节syllables。音节是一个比较稳定的实体,因为当语音变得比较快的时候,音素往往会发生改变,但是音节却不变。音节与节奏语调的轮廓有关。有几种方式去产生音节:基于形态学或者基于语音学。音节经常在词汇语音识别中使用。

亚单词单元(音节)构成单词。单词在语音识别中很重要,因为单词约束了音素的组合。假如共有40个音素,然后每个单词平均有7个音素,那么就会存在40^7个单词,但幸运的是就算一个受过优等教育的人也很少使用过20k个单词,这就使识别变得可行。

单词和一些非语言学声音构成了话语utterances,我们把非语言学声音称为fillers填充物,例如呼吸,um,uh,咳嗽等,它们在音频中是以停顿做分离的。所以它们更多只是语义上面的概念,不算是一个句子。

语音识别过程

语音识别一般的方法是:录制语音波形,再把波形通过静音silences分割为多个utterances,然后去识别每个utterance所表达的意思。为了达到这个目的,我们需要用单词的所有可能组合去匹配这段音频,然后选择匹配度最高的组合。

在匹配中有几个关键的概念需要了解的:

特征:

由于描述一个语音,需要的参数个数非常多,这样对处理速度的要求就很高(而且也没必要处理那么多的信息,我们只需要处理对识别有帮助的就行),所以我们需要做优化,进行降维。我们用帧frames去分割语音波形,每帧大概10ms,然后每帧提取可以代表该帧语音的39个数字,这39个数字也就是该帧语音的特征,用特征向量来表示。而如何提取特征向量是当下热门的研究课题,但这些提取方法都是由频谱衍生出来的。

模型:

模型是用来描述一些数学对象的。这些数学对象描述了一些口语的共同属性。在实际应用中,senone的音频模型就是三态高斯混合模型。简单的说,它就是一个最有可能的特征向量。对于模型,有几个问题需要考虑:模型到底多大程度上可以描述实际情况?在模型本身的局限情况下模型能表现得更优吗?自适应模型如何改变条件?

匹配算法:

语音识别需要对所有的特征向量和所有的模型做比较匹配,这是一个非常耗时的工作。而在这方面的优化往往是使用一些技巧,在每一点的匹配时,我们通过保留最好的匹配variants,然后通过它在下一帧产生最好的匹配variants。?

声学模型acoustic model:

一个声学模型包含每个senone的声学属性,其包括不依赖于上下文的属性(每个音素phone最大可能的特征向量)和依赖于上下文的属性(根据上下文构建的senone)。

语音学字典phonetic dictionary:

字典包含了从单词words到音素phones之间的映射。

字典并不是描述单词words到音素phones之间的映射的唯一方法。可以通过运用机器学习算法去学习得到一些复杂的函数去完成映射功能。

语言模型 language model:

语言模型是用来约束单词搜索的。它定义了哪些词能跟在上一个已经识别的词的后面(匹配是一个顺序的处理过程),这样就可以为匹配过程排除一些不可能的单词。大部分的语言模型都是使用n-gram模型,它包含了单词序列的统计。和有限状态模型,它通过有限状态机来定义语音序列。有时候会加入权值。为了达到比较好的识别准确率,语言模型必须能够很好的约束空间搜索,也就是说可以更好的预测下一个词。语言模型是约束词汇包含的单词的,这就出现一个问题,就是名字识别(因为名字可以随便由几个单词组成)。为了处理这种情况,语言模型可以包含更小的块,例如亚单词,甚至音素。但是这种情况,识别准确率将会低于基于单词的语言模型。

特征、模型和搜索算法三部分构成了一个语音识别系统。如果你需要识别不同的语言,那么就需要修改这三个部分。很多语言,都已经存在声学模型,字典,甚至大词汇量语言模型可供下载了。

其他用到的概念

网格Lattice是一个代表识别的不同结果的有向图。一般来说,很难去获得一个最好的语音匹配结果。所以Lattices就是一个比较好的格式去存放语音识别的中间结果。

N-best lists和lattices有点像,但是它没有lattices那么密集(也就是保留的结果没有lattices多)。(N-best搜索和多遍搜索:为在搜索中利用各种知识源,通常要进行多遍搜索,第一遍使用代价低的知识源(如声学模型、语言模型和音标词典),产生一个候选列表或词候选网格,在此基础上进行使用代价高的知识源(如4阶或5阶的N-Gram、4阶或更高的上下文相关模型)的第二遍搜索得到最佳路径。)

单词混淆网络是从lattice的边缘得到的一个严格的节点顺序序列。

语音数据库-一个从任务数据库得到的典型的录音集。如果我们开发的是一个对话的系统,那么数据库就是包含了多个用户的对话录音。而对于听写系统,包含的就是朗读的录音。语音数据库是来用训练,调整和测试解码系统的(也就是语音识别系统)。

文本数据库-为了训练语言模型而收集的文本。一般是以样本文本的方式来收集形成的。而收集过程存在一个问题就是误把PDFs, web pages, scans等现成文档也当成口语文本的形式放进数据库中。所以,我们就需要把这些文件带进数据库里面的标签和文件头去掉,还有把数字展开为它们的语音形式(例如1展开为英文的one或者汉语的yi),另外还需要把缩写给扩大还原为完整单词。

语音的优化

随着语音识别技术的发展,最复杂的难题是如何使搜索(也就是语音解码,可以认为是需要匹配尽可能多的语音变体)更加准确和快速。还有在模型并不完美的前提下如何匹配语音和模型。

一般来说系统需要通过一个测试数据库来验证准确性,也就是是否达到了我们的预定目标。

我们通过以下几个参数来表征系统的性能:

单词错误率:我们有一个N个单词长度的原始文本和识别出来的文本。(对单词串进行识别难免有词的插入,替换和删除的误识)I代表被插入的单词个数,D代表被删除的单词个数,S代表被替换的单词个数,那么单词错误率就定义为:WER = (I + D + S) / N

单词错误率一般通过百分百来表示。

准确度。它和单词错误率大部分是相似的,但是它不计算插入单词的个数,它定义为:Accuracy = (N – D – S) / N

对于大部分任务来说,准确度事实上是一个比较差的度量方法,因为插入的情况对于识别结果的影响也是很重要的。但对于一些任务而言,准确度也是一个合理的评价解码器性能的参数。

速度:假设音频文件是2个小时,而解码花费了6个小时,那么计算出来的速度就是3xRT。(3倍速)

ROC曲线:对于一个检测任务,检测会出现误报和命中两种情况。ROC曲线就是用来评价检测性能的。ROC曲线就是描述误报和命中的数目比例的。而且可以通过ROC曲线取寻找一个最优点,在这个点误报最小,而命中最大,也就是接近100%的命中率。

还有其他的方法来衡量识别性能,虽然这里没有提及,但对于很多的实际应用来说还是比较重要的。你的第一个工作应该是建立这样一个评价体系,然后系统地应用到开发过程中。第二个工作就是收集一个测试数据库来测试你的系统性能。

译者:zouxy09,广州 华南理工大学 研三。关注:机器学习、计算机视觉、人机交互和人工智能等领域。联系邮箱:zouxy09@qq.com

End.
页: [1]
查看完整版本: 浅谈语音识别、匹配算法和模型