端到端语音识别中不同的建模单元有着不同的应用场景,本文对中英文常用的一些建模方式以及如何生成对应的标签进行总结,希望对大家有所帮助。
I. 中文建模单元
音素(phoneme)
音素是语音的最小单位,在早前Hybrid语音识别系统中音素就作为建模单元被广泛使用,考虑发音单元的上下文关联/协同发音,把建模的发音单元分为上下文无关的单音素(Context-Independent Phoneme, CI-Phone),和上下文相关音素 (Context-Dependent Phoneme, CD-Phone)。在端到端语音识别系统中一般使用CI-Phone作为建模单元就足够了,可以使用aishell开源的DaCiDian将字转化为音素,CI-Phone大约有200个左右,做字典时候一般会根据实际情况进行裁剪。
音节(syllable)
音节是语言中单个元音音素和辅音音素组合发音的最小语音单位,汉语中的音节也就是我们所说的汉语拼音。使用拼音建模可以分为两种,一种是不带音调的拼音,汉语中大约有400多个,另外一种是带音调的拼音,大约有1300多个。我们可以借助第三方的库pypin进行字到拼音的转换。
字(grapheme)
对于语音识别来说很容易就能想到用字来进行建模,但是汉语中存在多音字的问题,通过词典(lexicon)和语言模型(language model)来解决。本质上是把多音字的每个读音(以及它们所组成的每个词)当成不同的词。对于中文来说,有3755一级汉字+3008二级汉字+16标点符号。
子词(subword)
字词建模是NLP中使用的一种分词方法,它介于字符和单词之间。代表性算法是BPE(Byte Pair Encoding),比如说’Transformers’可能会被分成’Transform’和’ers’两个部分。这个方案平衡了词汇量和语义独立性,是相对较优的方案。它的处理原则是,常用词应该保持原状,生僻词应该拆分成子词以共享token压缩空间。这在英文上行得通,但是如何把中文的一个字拆开呢?在Next-gen Kaldi项目中提出了byte level BPE,简单来说就是我们将建模单元只当做一个符号,并不赋予真实的含义,因此直接对汉语进行编码,这样汉字就变成了类似英文的序列,在此基础上进行BPE算法就可以了。
我爱你中国 -> ƍĩĴƎĩŗƋţŅƋŞœƌľţ
II. 英文建模单元
音素(phoneme)
上面说到音素是语音的最小单元,不管什么语言都有对应的音素,因此英文语音识别也可以采用音素作为建模单元。比较常用的是基于cmudict进行单词到音素的转化,一般来说英文音素有40个左右。
字素(grapheme)
我们知道英文是由26个字母组成,那么可不可以直接使用26个字母作为英文语音识别的建模单元呢?答案当然是肯定的,这种建模方式在端到端语音识别刚兴起时十分常见,并且词表很小,不需要考虑OOV的问题。
词(word)
英文语音识别也可以使用词作为建模单元,但是这种建模方式为了达到较好的效果,词表一般都会比较大,这也额外增加了训练成本。
子词(subword)
字词建模中典型的算法就是BPE了,值得一提的是BPE的词表大小是不固定的,可以认为的设定词表大小。待词表大小设定好后就可以进行BPE模型的训练。一般使用 google 的 sentencepiece 工具来训练 BPE。BPE算法的具体细节不是本文的重点,这里就不介绍了。
III. 中英文混合建模单元
对于中英文混合识别的任务一般如何建模呢?常用的方法是对中文和英文分开建模,如下所示。从声学层面上,中文字符对应的音频长度远大于英文字母对应的长度,因此采用子词能够增大英文建模单元所对应的声学时长,从而减小中英文建模之间的差异,增强模型训练鲁棒性。
参考文献:
[1]. https://zhuanlan.zhihu.com/p/620168667
[2]. https://zhuanlan.zhihu.com/p/631008016?utm_id=0
[3]. https://zhuanlan.zhihu.com/p/123368767
[4]. https://zhuanlan.zhihu.com/p/59246285
[5]. https://zhuanlan.zhihu.com/p/549106609
作者:Calikarcha
来源:语音算法组
原文:https://mp.weixin.qq.com/s/fK_r7LmT0IAs82DqBi1MXg
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。