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/