语音识别入门

您所在的位置:网站首页 语音识别发音词典 语音识别入门

语音识别入门

2024-06-29 00:57| 来源: 网络整理| 查看: 265

本文主要介绍一些语言识别基本概念。

目录基本流程建模单元语言模型解码器WFST解码器基于 Token 的 Viterbi 解码Lattice 解码从概率模型的角度看语音识别语音识别系统的评价指标参考内容 基本流程

语音识别任务是将语音转换成文字,是一个序列到序列(seq2seq)的任务。一个语言识别系统通常包括如下几个模块:

预处理: 消除首尾端的静音,减少对后续进程形成的食物,静音抑制的操作一半称为 VAD ; 声响分帧,也就是把声响切开成一小段一小段,每一小段称为一帧(Frame),运用移动窗函数来完成,不是简略的切开,每帧之间一般都是有交叠的。语音识别中,常用25ms作为帧长(Frame length)。为了捕捉语音只好之间的连续变化,避免帧之间的特征突变,每隔10ms取一帧,即帧移(Frame shift)为10ms。 特征提取:首要算法有线性猜测倒谱系数(LPCC)和 Mel 倒谱系数(MFCC),意思是把每一帧波形变成一个包括声响信息的多维向量。 声学模型(AM):经过对语音数据进行训练获得,输入是特征向量,输出为音素信息。一个声学模型可以被看成是一个转换机(transducer),其将输入的语音信号转化为一个上下文相关的音子序列(HMM),生成声学模型得分。 发音字典:字或词与因素的对应,简略来说,中文就是拼音和汉字的对应,英文就是音标与单词的对应。 语言模型(LM):经过对大量文本信息进行训练,得到单个字或词彼此相关的概率。 解码:经过声学模型、发音字典、语言模型对提取特征后的音频数据进行文字输出。

我们以一个例子来说明上述各个模块,假设我们有一段语音,内容为“我是机器人”,我们将这个语音文件输入到语音识别系统中,会经历以下几个步骤:

语音信号: PCM 文件等(我是机器人); 特征提取:提取特征向量[5 4 2 66 98 ...]; 声学模型:[5 4 2 66 98 ...] -> wo shi jiqiren; 字典翻译:我: w o; 是: s i; 机: j i; 器: q i; 人: r en; 语言模型:我:0.1286, 是: 0.3616,电销:0.5682,机器人:0.6785; 输出文字:我是机器人。

建模单元

前面提到,语音识别任务本质上是一个 seq2seq 的变换问题:输入语音向量,输出 token 序列, token 一般有以下几种选择:

Phoneme(音素):发音的最小单元,人类说话的声音大体可以分为有限的若干个基本元素,例如可以分为声母(辅音)和韵母(元音)。不同的单词由不同的音素组成,通过识别输入语音中存在哪些音素进而组合成识别出来的文字,值得注意的是我们需要语言学的知识来构建一个音素到单词的映射关系表(Lexicon),也就是发音字典。下面是一个包含5个英文单词的 Lexicon: 12345cat -> K AE Tgood -> G UH Dman -> M AE None -> W AH Npunch -> P AH N CH 当需要识别的单词很多时,Lexicon 表包含的条目也越来越多,一般来说英文单词有多少个,该表就有多少个条目。通过查表,我们才能进一步将音素转化为单词。对于英文和中文来说,这种 token 的选取方式都是适用的,英语有音标,汉语有汉语拼音。两者的音素集合和 Lexicon 表不一样。选择 Phoneme 作为 token 需要 Lexicon 的辅助,并不是端到端的; Grapheme:书写的最小单元,对英文而言, Grapheme 就是26个英文字母;对于中文来说, Grapheme 指的是约4000+个常用汉字。由于在英文书写系统中,包括了标点符号和空格,所以,实际的英文 Grapheme 集合的数量为26(英文字母,不区分大小写) + 1(空格) + 12(常用标点符号)。中文 Grapheme 集合的数量为3755(一级汉字) + 3008(二级汉字)+ 16(标点符号)。 Word:单词。对于中文和英文来说,都有词的概念。英文里面,‘a’为一个字符,‘and’为一个单词;中文里面,"中"是一个汉字,“中国”是一个词语。英语单词个数在17万~100万之间,一个普通美国大学生懂的单词大概有3万个,经常使用的词汇约3000-5000个左右。汉语约有词语36万个,常用词语约为28770个。选择 word 作为 token, token 集合的个数通常大于100k,导致解码复杂; Morpheme:单位大于 Grapheme,小于 word,是组成单词的最小有意义的单元。这种表示方式存在于英语、土耳其语中。但凡有词根、词缀的语言,都可以用这种表示方 式。中文是没有这种表示方式的,中文只有汉字和词语,并没有词根、词缀。 例如:unbreakable -> 'un' 'break' 'able';rekillable -> 're' 'kill' 'able'。而选择 Morpheme 作为 token,只适用于某些有词根、词缀的语种,像中文就不适用; Bytes:世界上所有的字符都有对应的UTF-8编码,字符集其实就是 Byte 集。这种表示方式,一个显而易见的好处就是,它是 language independent 的。选择 Byte 作为 token,则需要的训练语料必然异常庞大。 语言模型

目前主要有两种方式统计语言模型,用来预测词序列的组合概率:n-gram 和 RNNLM,这两种模型均需要基于大量的文本语料训练得到。

n-gram:预测的词概率值依赖于前 n-1个词,更长距离上下文依赖被忽略。效率高,目前仍是主流。 神经网络(RNN/LSTM):将每个词映射到一个紧凑的连续向量空间,并使用循环连接来建模长距离上下文依赖。输出层的节点数目就是词典的大小,处理大量数据时缓慢的训练速度限制了RNN/LSTM的使用。

n-gram假定每个预测变量 只与长度为 n-1的上下文有关: 实际应用中一般取 。当 时,相应的模型分别称为 Unigram,Bigram, Trigram 语言模型。例如计算 Trigram: 假设“我们 明天”出现2次,“我们 明天 开始”出现1次,则 P(“开始”|“我们 明天”) = 1/2。

我们使用困惑度(Perplexity,PPL)作为n-gram的评价指标。给定句子 ,包含词序列 , T 是句子长度,则 Perplexity 表示为: PPL 越小,则越大,句子出现的概率就越高。理论上,困惑度越小,语言模型越好,预测能力越强。

n-gram 的训练工具:CMU LM Toolkit 和 SRI LM Toolkit,其中 SRI LM 主要有两个工具:ngram-count 和 ngram,分别用来估计语言模型和计算困惑度。 12345678910111213141516171819201、从语料库中生成n-gram计数文件ngram-count -text *.txt -order 3 -write 参数-text指向输入文件,-order指向生成几元的n-gram,即n,此处为3元,-write指向输出文件2、从上一步生成的计数文件中训练语言模型ngram-count -read *.txt.count -order 3 -lm name_of_lm -interpolate -kndiscount生成语言模型name_of_lm为ARPA文件格式,最后的两个参数是平滑算法,-interpolate为插值平滑,-kndiscount为modified Kneser-Ney打折法,这两个是联合使用的。3、压缩语言模型gzip -c name_of_lm > name_of_lm.gz4、模型融合#用于多个语言模型之间插值合并,以期望改善模型的效果ngram -lm ${mainlm} -order 3 -mix-lm ${mixlm} -lambda 0.8 -write-lm ${mergelm}# -mix-lm 用于插值的第二个ngram模型,-lm是第一个ngram模型# -lambda 主模型(-lm对应模型)的插值比例,0~1,默认是0.5在合并语言模型之前,可以使用脚本计算出最好的比例,参考srilm的compute-best-mix脚本5、测试语言模型的困惑度(perplexity)命令行:ngram -lm MinPu-lm8.3gram -order 3 -ppl text.txt -debug 0 > result_ppl_MinPulm8.txt得到以下结果:file text.txt: 170 sentences, 1249 words, 279 OOVs0 zeroprobs, logprob= -3778.304 ppl= 2062.06 ppl1= 7855.219其中ppl表示困惑度,越低越好。

除此之外,我们还可以使用递归神经网络语言模型(RNNLM)构建语言模型,但由于 RNN 语言模型输出层的节点数目就是词典的大小,而词典动辄有十几万条甚至更多,计算其概率分布非常复杂,处理大量数据时训练速度将变得异常缓慢,这将极大限制 RNN 语言模型的使用。

n-gram 预测的词概率值依赖于前 n-1个词,计算简单,效率高,目前仍是工业界主流的语言模型。而 RNNLM 复杂度高,更多的是用于后处理,在第一次解码之后做二次纠错。

解码器

解码器模块主要完成的工作包括:给定输入特征序列 X 的情况下,在由声学模型、声学上下文、发音词典和语言模型等四种知识源组成的搜索空间(Search Space)中,通过维特比(Viterbi)搜索,寻找最佳词串 W。

在解码过程中,各种解码器的具体实现可以是不同的。按搜索空间的构成方式可以分为动态编译和静态编译两种方式。

静态编译,是把所有知识源统一编译在一个状态网络中,在解码过程中,根据节点间的转移权重获得概率信息。由 AT&T 提出的 Weighted Finite State Transducer(WFST)加权有限状态转换器方法是一种有效编译搜索空间并消除冗余信息的方法。

动态编译,是预先将发音词典编译成状态网络构成搜索空间,其他知识源在解码过程中根据活跃路径上携带的历史信息动态集成。

业界大部分都是按照静态解码的方式进行,将声学模型和语言模型构造成 WFST 网络,该网络包含了所有可能路径,解码就是在该空间进行搜索的过程。

WFST(Weighted Finite-State Transducer):加权有限状态转换机,由有限状态接收机(FSA)拓展而来,在语言识别领域常被称为“解码器”,其包含了声学模型(H)、上下文相关处理的 FST(context-dependency transducer, C)、发音词典(L)、语言模型(G)四个网络,通过一定“操作”将这四个网络结合形成了最终的解码网络。

目前对于语音识别,尽管端到端系统发展的很好,但是大部分的实际场景还是少不了 WFST的有力支持,更多的时候,仅是在处理声学信号的时候使用DNN等的网络,真正的解码依然是在解 WFST等

WFST解码器

首先,句子由词构成,对于 n-gram 的语言模型,可以将其表示成 WFST,并记为 G。下图是将语言模型构造成 WFST的示例,可以看到,G 的输入符号和输出符号是相同的,均为词, 其后的权重由语言模型中的概率值转换而来。从图中可以看到,句子“using data is better”的得分为1 + 0.66 + 0.5 + 0.7 = 2.86,句子“using intuition is worse”的得分为1 + 0.33 + 1 + 0.3 = 2.63,如果将权重定义为惩罚,则后一条句子的可能性更大。 其次,词由音素组成,可以将其表示为 WFST,并记为 L。下图是发音词典表示成 WFST 的示例,图中的 是个占位符,表示没有输入或输出。据此图可知,单词“data=/d ey t ax/”的得分为 1 + 0.5 + 0.3 + 1 = 2.8,而单词“dew=/d uw/”的得分为 1 + 1 = 2,如果将权重定义为惩罚,则“dew”的可能性更大。 以此类推,定义输入为 Triphone 、输出为 Phone 的 WFST 为 C,定义输入为 Senone、输出为 Triphone 的 WFST 为 H。这样,我们可以得到4个 WFST,即 H、C、L、G。下表对这4个 WFST 进行了比较,表中的“输入”、“输出”表示走完一条完整路径后整个 WFST 的输入、输出,而不是一条边上的输入、输出,可见前者的输出是后者的输入,所以可以将它们融合(Composition)成一个 WFST,实现了上文提到的从 Senone 到 Triphone(H)、Triphone 到 Phone(C)、 Phone 到Word(L)、Word 到 Sentence(G),这就是解码图(Decoding Graph)。

组成 转换器 输入序列 输入序列 H HMM HMM的转移-id 单音子/三音子(triphone) C 上下文相关 单音子/三音子 单音子(monophone) L 发音词典 单音子 词(word) G 语音模型 词 词(word)

WFST 的融合一般从大到小,即先将 G 与 L 进行融合,再依次融合 C、H,每次融合都将进行确定化(Determinisation)和最小化(Minimisation)操作。 WFST 的确定化是指, 确保给定某个输入符号,其输出符号是唯一的;WFST 的最小化是指,将 WFST 转换为一个状态节点和边更少的等价 WFST。H、C、L、G 的融合,常用的过程为:

其中 表示复合(Composition),det 表示确定化(Determinisation),min 表示最小化(Minimisation, -removal 表示转移消除,HCLG 即为最终的解码图 WFST。OpenFST 等工具实现了这些操作:

复合(Composition):复合就是用来把两个不同层级的WFST“整合”成一个 WFST 。用一个串联的WFST模型序列生成单一的 WFST ,使得新 WFST 的输入输出关系与原WFST序列相同。

确定化(Determinisation):确定化就是把一个非确定的WFST转换成等价的确定的WFST的算法,确定化后,网络将变为唯一输入和唯一输出。

最小化(Minimisation):最小化状态的数量。

转移消除( -removal):转移消除主要目的是去除网络中的空弧。在 WFST 网络之中, 是一个特殊的(输入和输出)符号,它代表空,没有输入/输出。输入符号为 的跳转叫做 -跳转,这个状态的跳转不需要任何输入符号就可以进行。 WFST 构建过程中, 的状态转移对整体输入输出序列没有贡献,存在一个算法( -消除算法)把一个 -NFA转换成与之等价的没有 -跳转的NFA。前期优化过程中留下、生成或引入空弧标记,最后进行去空弧操作减少整体复杂度。

Weight-pushing:重新分配 WFST 上的权重,使得权重尽可能提前。语音识别问题可以转化为搜索最小惩罚路径(minimal cost path),在一开始消除掉“绝路”(unPomising path)能够缩短搜索时间; Weight Pushing 运算的作用是把一个 WFST 所有路径的 weight 分布往初始状态 push,但是不改变任何成功路径的 weight。

最终解码时,只需要 GMM 或 DNN(因为 HMM 已在解码图之中),就可以利用 HCLG 进行解码了,给定语音特征序列 X ,可以通过 GMM 或 DNN 计算出 ,即HMM 的发射概率,借助于 HCLG,P(W |X ) P(X|W )P(W) 的计算将变得简单,即将 W 路径上的权重(假设定义为惩罚)相加,再减去各状态针对输入的发射概率( log 后的值)得到最终得分,该得分越小,说明该语音 X 转录为 W 的可能性越大。由于 HCLG 中的权重都是固定的,不同的 将使得 HCLG 中相同的 W 路径有不同的得分。通过比较不同路径的得分,可以选择最优路径,该路径对应的 W 即为最终解码结果。由于 HCLG 搜索空间巨大,通常使用束搜索(Beam Search)方法,简单说来,路径搜索中,每走一步,搜索空间都会指数级扩大,如果保留所有的路径,计算将难以支撑,但很多路径是完全没有“希望”的,所以虽未走到终点,可以根据当前的得分仅保留指定数目的最优路径(即n-best),走到下一步时仍然如此,直到走到终点,选择一条最优路径。

基于 Token 的 Viterbi 解码

WFST的 Viterbi 解码也是逐帧推进,分别计算每帧的声学得分,然后结合转移弧的权重,得到每个时刻扩展路径的累计代价,在具体实现 WFST 解码的时候,我们会用 Token 的 cost 保存这些代价,Token 的定义如下: 123456789101112struct Arc { int ilabel; //转移弧的输入标签 int olabel; //转移弧的输出标签 float weight; //转移弧上的权重 int nextstate; //转移弧连接的下一个状态}class Token { Arc arc; //与Token对应的转移弧 Token *prev; //解码路径上一个Token指针 int32 ref_count; //后续关联的Token数量 double cost; //累计代价} WFST 的 Viterbi 解码通过对比指向同一个状态的不同路径的由 Token(该 Token 与状态节点关联,如果状态节点还没有 Token,则创建一个新的 Token)保存的累计代价(cost),选择值更小的并更新 Token 信息。

Lattice 解码

在语音识别中,经常用 Lattice 来保存多种候选的识别结果,以便后续进行其它处理(如二次解码)。针对有 Lattice 的解码,需要保存多条搜索路径,包括中间遍历的路径信息,因此 Token 之间还需要有链表信息,以便跟踪到其可能存在的多个传播来源,即多条回溯路径。

语音识别中,Lattice 用来保存多种候选结果,每个节点可对应到具体的时间(帧索引),节点之间的弧包含了候选词信息。HTK 用 Standard Lattice Format(SLF)保存 Lattice,而 Kaldi 则用 FST 形式保存,但也可转化成 SLF 形式。 Kaldi Lattice 是在解码后,通过每个时刻的 TokenList 包含的 Token 和与之关联的 ForwardLink 遍历生成,并用转移弧 Arc 保存路径信息。 从概率模型的角度看语音识别

从概率模型的角度来看,假设 X 是输入的音频信号, w 为单词序列,在概率模型下,语音识别的任务就是在给定音频信号 X 的前提下,找出最有可能的单词序列 W*,可以由以下公式得到: 应用贝叶斯定理推导: 在上述公式中,因为 X 已知,因此概率 P(X) 是一个常量,在求极值的过程中可以被忽略。因此,语音识别系统的概率模型可以被拆分为两部分: P(X|W)和P(W)。概率P(X|W)的含义是:给定单词序列 W,得到特征音频信号 X 的概率,在语音识别系统中一般被称为声学模型。概率 P(W) 的含义是给定单词序列 W 的概率,在语音识别系统中一般被称作语言模型。

根据之前的描述可以知道,单词是一个比较大的建模单元,因此声学模型 P(X|W) 中的单词序列 W 会被进一步拆分成一个音素序列。假设 Q 是单词序列 W 对应的发音单元序列,这里简化为音素序列,那么声学模型 P(X|W) 可以被进一步转写为:

其中,公式中的求和是对单词序列 W 所对应的所有可能的音素序列 Q 集合计算边缘分布概率。这样,声学模型就被拆分为两个部分:P(X|Q) 和 P(Q|W)。显然, P(Q|W) 可以非常容易地从发音词典中计算出来。 第一部分 P(X|Q) 是声学模型的核心。一般会用隐马尔可夫来进行建模。简单来说,对于音素序列 Q 中的每一个音素,都会构成一个音素级隐马尔可夫模型单元,根据音素序列 Q ,会把这些隐马尔可夫模型单元拼接成一个句子级别的隐马尔可夫模型,而特征序列 X 便是隐马尔可夫模型的可观察输出。

语音识别系统的评价指标

常用的评价指标有词错误率(Word Error Rate, WER),中文中使用字错误率(Character Error Rate, CER)来表示。

对于一段音频,已知其标注文本(Reference)和语音识别的结果(Hypothesis),WER的计算方法是将识别结果中错误词的累计个数除以标注中总的词数,结果表示为一个百分数,其中错误词分为三种:插入错误(Insertion)、删除错误(Deletion)、替换错误(Substitute)。

除此之外,还可以采用正确率(Acc),使用累计所有测试句子的正确识别词数和全部标注文本词数,可得 Acc。在实际中,往往是多种错误类型并存在一个句子中,因此上面的正确率和错误率之和并不一定等于1,而且错误率可能超过100%。

另外,识别的速度实际中另一个需要关注的指标。评价识别速度最常用的方法是实时率(Real Time Factor,RTF),即用识别耗时除以句子时长。

参考内容

大牛讲堂|语音专题第四讲,语音识别之解码器技术简介 语音识别:原理与应用 https://antkillerfarm.github.io/speech/2018/04/16/speech.html https://antkillerfarm.github.io/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3