使用Lipsync插件做中文口形动画
LipSync主要由三个模块组成。
·前端负责分析语音,辨识指定的音节,输出位置、类型和强度。LipSyncPro的作者直接使用了PocketSphinx开源库来完成这部分的内容。
·中端没有明确的界限,负责将语音识别的结果转化为驱动表情动画的事件帧。LipSync中提供一个ClipEditor,界面功能全面,可以方便的增减和编辑AutoSync生成的帧信息。
*前端和中端都是在编辑器中离线完成的。
·后端负责在runtime时根据事件帧驱动表情动画。LipSync支持BlendShape、骨骼动画和2D帧动画。
初步试用下来感觉挺好用,但有个关键问题:插件不支持中文! 强行识别的结果根本没法看。作者已经在尝试做多国语言的支持,但因为不会中文,暂时还无法支持。
内置的英语音素分类定义
总结一下,要扩展LipSync支持中文,需要解决两个问题:
1)寻找中文音素表
2)寻找一个开源库来识别中文语音中的音素(最好还是Sphinx)
对于第一个问题,英文搜索几乎没有靠谱的内容,百度倒是找到好几篇研究中文LipSync的论文[1][2],看引用数不高,可能是LipSync的学术价值太低,但工程上还是挺有意义的。
[1]使用HTK自行训练中文语音模型,我没做过语音识别,比较苦手。只能看看有没有现成可用的中文模型。
[2]提出一个三段式的方案,先结合过零率和短时能量将语音切割为片段,逐片段识别为文字(论文里使用的是微软SpeechAPI),然后查字典将字拆分为音节。这个方案可行性较高,效果预期也有保证,但工程量较大。
[3]提出了一个根据声韵母发音规律进行分类的方法,如下图
[1][2]都使用了这个分类模型。
为CMUSphinx构建音素模型
语音识别Toolkit中,只有CMUSphinx默认有提供音素识别(Phoneme Recognition)的功能。
先准备一些文字,转化为音素作为测试数据,然后使用cmuclmtk来构建音素语言模型 [5]。
我没有合适的测试数据,于是将语言字典zh_broadcastnews_utf8.dic中的音素序列剥离出来作为测试数据。
Commands:
text2idngram.exe -vocab F:\MyProject\Sphinx\Project\Phoneme.tmp.vocab -idngram F:\MyProject\Sphinx\Project\Phoneme.idngram < F:\MyProject\Sphinx\Project\Phoneme.txt
idngram2lm -vocab_type 0 -idngram F:\MyProject\Sphinx\Project\Phoneme.idngram -vocab F:\MyProject\Sphinx\Project\Phoneme.tmp.vocab -arpa F:\MyProject\Sphinx\Project\ChinesePhoneme.lm
sphinx_lm_convert.exe -i F:\MyProject\Sphinx\Project\ChinesePhoneme.lm -o F:\MyProject\Sphinx\Project\ChinesePhoneme.lm.bin
[1] 基于HTK的语音驱动唇形动画的实现
https://wenku.baidu.com/view/e3cf6acdbb4cf7ec4bfed003.html
[2] 基于SAPI的语音驱动口型动画方法
http://www.ixueshu.com/document/b6cc0c79686c53bb318947a18e7f9386.html
[3] 唇读中序列口型的分类
https://cmusphinx.github.io/wiki/phonemerecognition/
[4]
https://www.leiphone.com/news/201703/RccQRMCqbgxnFFS3.html
[5] CMUSphinx - Phoneme Recognition
https://cmusphinx.github.io/wiki/phonemerecognition/