语音识别问题的数学建模
从图中可以看到,语言信号可以表示为一个d T的matrix。其中,d为向量的维度(不同的表示方法,维度不一样), T为向量的个数。 同理,文本也可以表示为一个V N的matrix,N表示组成text的token(不同的表示方法,token的含义不一样)的个数,V表示token集合的大小(即token去重后的数量)。 语音信号的预处理通常采用重叠的稠密采样机制,通常T >> N。语音识别问题的输入输出都是matrix,输入vector及输出token的选取,不同的算法有不同的方式。整体来看,语音识别问题就是一个Seq2Seq的变换问题
输出Token有哪几种选择
简单的说,有以下五种选择:
Phoneme 发音的最小单位
将语音信号转化为Phoneme之后,还需要进一步将Phoneme信号转化为Text。所以该方法并不是end-to-end的,需要后处理步骤。那么如何将Phoneme转化为Text呢?需要用到一个词表,我们通常称之为Lexicon。形式如下
以英文为例:该表包含了所有单词的Phoneme表示,英文单词有多少个,该表就有多少行。可想而知,表的条目是很多的。通过查表,我们才能进一步将Phoneme转化为text
对于英文和中文来说,这种token的选取方式都是适用的,英语有音标,汉语有汉语拼音。两者的Phoneme集合和Lexicon不一样
Grapheme 书写的最小单位
对于英文来说,Grapheme指的就是26个英文字母;对于中文来说,Grapheme指的就是约4000 个常用汉字。由于在英文书写系统中,包括了标点符号和空格,所以,实际的英文Grapheme集合的数量为26(英文字母,不区分大小写) 1(空格) 12(常用标点符号)。中文Grapheme集合的数量为3755(一级汉字) 3008(二级汉字) 16(标点符号)
值得一提的是,这种选取方式是Lexicon free的,它不需要语音学家的帮忙来制定复杂专业的Lexicon; 从流程上来看,做到了end-to-end
Word 单词
对于中文和英文来说,都有词的概念。英文里面,'a'为一个字符,'and'为一个单词;中文里面,"中"是一个汉字,"中国"是一个词
英语单词个数在17万~100万之间,一个普通美国大学生懂的单词大概有3万个,经常使用的词汇约3000-5000个左右。汉语约有词语36万个,常用词语约为28770个
Morepheme 单位大于Grapheme,小于word,是组成单词的最小有意义的单元
这种表示方式存在于英语、土耳其语中。但凡有词根、词缀的语言,都可以用这种表示方 式。中文是没有这种表示方式的,中文只有汉字和词语,并没有词根、词缀
显然,从通用性的角度来说,这种表示方式不是很好
Bytes 世界上所有的字符都有对应的utf-8编码,字符集其实就是Byte集
这种表示方式,一个显而易见的好处就是,它是language independent的!如果能够work的话,General Speech Recognition就得以实现。另外,由于一个Byte只有256个取值,因此Bytes集合并不会像word集合那么大。看起来,确实非常有前景!
哪种输出Token的选取方式比较好呢?
好不好依赖于语言,依赖于实际问题,也依赖于算法,没法一言概括。但某些方式的弊端却是显而易见的:Phoneme方式,需要lexicon的辅助,并不是end-to-end的;word方式,token集合的个数通常 > 100k,解码复杂;Byte方式,想做到大一统,需要的训练语料必然异常庞大;Morpheme,只适用于某些有词根、词缀的语种,中文即不适用
那么,目前最新的研究中,一般是如何选取的呢?
通过对19年语音识别顶会100多篇论文的分析,得到了上图。可以看到,使用grapheme方式的人是最多的,占到了41%;使用phoneme的也有不少,约为32%, 而使用word和 morpheme的人则分别只有10%和17%
输入Token有哪几种表示方式
其实,语音信号可以表示为2维矩阵,也可以表示为1维向量,不过从实际应用来看,表示为2维矩阵的比较多
语音信号的一维表示方式如下: 以一段1s, 16kHz采样, 8bit量化的语音信号为例,它可以表示为一个长度为16000的向量,向量中每个元素的取值为[-128, 127]
语音信号的二维表示方式如下:一段语音信号由若干帧组成,每一帧对应25ms的语音信号,帧与帧之间的步长为10ms. 假设一段语音信号时长为1s, 则 T = 1s / 10ms = 100. 每一帧经过运算,得到一个dimension为d的vector. 计算方法不同,则得到的单帧向量的含义、维度也不一样
常用的表示方式有如下三种:
- Raw:不做任何处理,d=400
- MFCC:计算其MFCC值,d=39
- Filter bank output:计算其Filter bank output值,d=80
输入vector选取哪种方式比较好
通过对19年语音识别顶会100多篇论文的分析,得到下图
目前来看,MFCC已成昨日黄花,filter bank output大有一统江湖之势
语音数据集
我们需要多少有标注文字的声音数据,才能做出一个足够好的语音识别系统呢?由下图可知,MNIST数据集可以等价于49分钟时长的语音。CIFAR-10可以等价于2小时40分钟。现有评测数据集ISLVRC有4096个小时的语音数据。文献上,谷歌语音搜索,他们会用超过1万小时的语音数据去训练模型。而实际产业中的商用系统,使用的数据量大小会远远超过以上这些