リアルタイムコンピューターアニメーションにおけるリップシンク方式の考察
Research in Implimentations of
Lip-syncing for Realtime Computer Animations
Ryoichiro Debuchi
atom Co.,
Ltd.
Keywords:
Realtime 3D, Character
Animations, Lipsyncing
リアルタイム3Dコンピューターアニメーションにおける会話するキャラクターアニメーションに重要な、リップシンク(lip-sync) 、すなわち、音声と口唇アニメーションの同期を取る方式を、筆者開発のリアルタイム3Dによる会話するバーチャルキャラクターシステムであるBot3D Engineでの実装例を元に考察する。
リアルタイム3Dコンピューターアニメーションにおける会話するキャラクターアニメーションにおいて、リップシンク(lip-sync) 、すなわち、音声と口唇アニメーションでの同期の取り方の実装は重要である。ビジュアルがリアルになればなるほど、人間は僅かな唇と音声のズレを知覚し違和感を持つからだ。
リップシンクをリアルタイム3Dコンピューターアニメーションで実装する場合の問題は次の点にある。
LipAnalyzer(*1)での解析によると、普通の会話スピードでの日本語音声の1音素の時間長平均は100ms程度である。すなわち、1000 / 100 = 10 fps であり、これが現在の平均的なPCにおけるCPU/GPUを元にした描画速度である、5~60fps とほぼ同程度のスケールとなる。(*2)
もしも、PCのフレームレートが十分に大きい(サンプリング間隔が十分に小さい)のであれば、会話音声を分析した「音素-音素時間長テーブル」があれば、それをもとに現実世界に近いリアルなリップシンクアニメーションを生み出すことができるはずである。しかし、現時点ではまだまだ荒いサンプリングレートを元に、コンピューターの上でリップシンクアニメーションを行なわなければならない。
また、PC環境により、このサンプリングレートは5~60fps程度で変化するのだが、いずれの環境においてもそこそこのリップシンクアニメーションを生み出す必要がある。
以上の理由により、リアルタイム3Dコンピューターアニメーションでリップシンクアニメーションを行わせるためには、適切なアルゴリズムを採用する必要がある。
ここでは、いくつかのリップシンクアニメーションの方式を考察し、その実装例を筆者開発のリアルタイム3Dによる会話するバーチャルキャラクターシステムであるBot3D
Engine(*3)を使ったデモコンテンツで示す。
最もシンプルなリアルタイム3Dコンピューターアニメーションでのリップシンクアニメーションは「逐次方式」であろう。
アルゴリズムの概要は以下の通りである。
1) 各フレームの描画タイミングで現在再生している音声の音素を問い合わせて取得する。
2) もしも、現在の音素が以前の音素と異なっていれば、指定された「モーフ期間」時間長で、以前の音素のモーフターゲットから現在の音素のモーフターゲットへモーフさせる。

Figure 1 逐次方式

Figure 2 逐次方式-サンプリングが荒い場合
このアルゴリズムは単純で実装しやすい。また、現在の音素のみ考慮しているため、リアルタイムリップシンクシステム(*4)でも利用できるアルゴリズムである。
「モーフ期間」はパラメーターとして一律に定義する。
#右下のボタンにより、「モーフ期間」を変更することができる。
結果:
音素開始タイミングは音声と合っているようだが、唇の動きがうるさすぎるように感じる。
(注)アルゴリズム的には、音素Aから音素Bにモーフする場合に、音素変更のためモーフ途中で打ち切られた場合、ABの途中経過 形状 B’から次の音素Cにモーフするべきである。
Bot3Dではこれを実現する「荷重モーフ」が実装されていないため、この動作は行っていない。そのため、さらに動きの不自然さが誇張されているかもしれない。
もしも、このアルゴリズムを実装した場合の動作の予想であるが、「モーフ期間」を長くした場合、モーフを途中で打ち切られる率が高くなり、モーフが完全に終わらず次に行くため、やはり不自然なアニメーションとなることが想定される。
唇の動きがうるさくなるという問題を解決するために、ひとつのモーフが完全に終了するまで、次の音素の問い合わせを行わないようアルゴリズムを修正した。
#右下のボタンにより、「モーフ期間」を変更することができる。
結果:
1)「モーフ期間」が短い場合(50ms)では、動きがかなりギクシャクする。
2)この場合、最も適切に見える「モーフ期間」は100ms程度だが、これより音素時間長が短い子音を取りこぼす可能性がある。
3) 「モーフ期間」を長くすると(200ms~)、滑らかにはなるが口が遅れて動いているように見える。
逐次方式の問題点は、音素間のモーフのために各音素の継続時間である音素時間長を考慮できないことにある。
これを解決するために、事前に音声を解析し、音素列とそれに対応した音素時間長列を取得しそれを利用する方式を考える。
Bot3D Engineでは、WAVEファイルを音声認識技術の応用で解析するLipAnalyzerと、合成音声システムを元にしたSFT(*5)を開発しており、これを用いて音素列と音素時間長列を前解析で取得している。
アルゴリズムの概要は以下の通りである。
1)各フレームの描画タイミングで、現在再生している音声の音素を「音素-音素時間長テーブル」に問い合わせて取得する。
2)もしも、現在の音素が以前の音素と異なっていれば、その音素の音素時間長で、以前の音素のモーフターゲットから現在の音素のモーフターゲットへモーフさせる。

Figure 3 単純な音素時間長ベース方式
このアルゴリズムは比較的単純である。各音素のモーフ期間ににその音素の継続時間を使用するため、より自然なアニメーションに近づけることができる。
単純な音素時間長ベース方式のBot3D 2.0による実装例を示す。
問題点は、ダイアグラムのように、アニメーションが音声と1~2音素分ずれてしまうことにある。
最も単純なこの問題の解決方法は、音声の出るタイミングを一律に遅らせる微調整を行うことである。
音声の出るタイミングを遅らせる方式のBot3D 2.0による実装例を示す。
#右下のボタンにより、音声の遅れを変更することができる。
結果:
200~300msの音声の遅れが最も自然に見えるようだ。500msは音声が遅れすぎる。
実際は会話内容により音声の遅れは微妙に変動する。また、再生環境によっても最適な遅れ時間は異なってくるため、この方式はあくまで暫定的な回避方法である。
アルゴリズムの概要は以下の通りである。
1)各フレームの描画タイミングで、現在再生している音声の音素を「音素-音素時間長テーブル」に問い合わせて取得する。
2)もしも、現在の音素が以前の音素と異なっていれば、その音素の音素時間長で、現在の音素のモーフターゲットから現在の音素より次の音素のモーフターゲットへモーフさせる。

Figure 4 改良した音素時間長ベース方式
さらに正確なリップシンクのために次の事象を考察する。
ポーズ期間 --- 会話開始するまでの期間。
立ち上がり時間 --- 会話開始前に唇は動くが音声は出ていない期間。
無音音素 --- 音の出ていない音素、沈黙期間。
無音期間 --- 無音音素期間の内、指定時間長以上あるものを無音期間と定義する。
終了期間 --- 会話の終了、最後の音素での口の形からデフォルトの口の形(口を閉じる)へ戻る。音声は出ていないこともある。
立ち上がり時間は、パラメーターで一律定義するとする。(*6)
無音期間は会話開始前と会話末尾にあるとする。
また、会話中に無音期間がある場合は、会話開始と同一の処理を行うとする。(*7)
すなわち、この場合もポーズ期間と立ち上がり期間を持つ。
改良した音素時間長ベース方式のBot3D 2.0での実装例を示す。
結果:
これまでの方式で最もリップシンクが自然に見えた。
これらのリップシンクのためのアルゴリズムを比較するために、短いサンプル文章を用いて、試験者が簡単に切り替えてプレイバックできる試験コンテンツを作成した。
リップシンク解析データである、B3ML/RealVoiceファイルは、より正確にモーラとモーラ時間長を取得していると言う理由で、合成音声システム/SFTで生成したものを利用し、音声は同時に生成したWAVEファイルを用いてプレイバックする。
試験するリップシンクパラメーターの組み合わせは以下の通りである。
1)逐次方式
2)逐次方式 + すべての音素
3)単純音素時間長 + タイミング遅延
4)単純音素時間長 + タイミング遅延 + すべての音素
5)単純音素時間長 + すべての音素
6)改良版音素時間長
7)改良版音素時間長 + すべての音素
「すべての音素」とは2章で述べた、「ひとつのモーフが完全に終了するまで、次の音素の問い合わせを行わないようアルゴリズム」を使用しないという意味である。
そうでない場合はこのアルゴリズムを使ったとする。
タイミング遅延は300msに設定した。
結果として筆者の主観では、7)「改良版音素時間長 + すべての音素」がこの場合は最良であると見えた。サンプルの合成音声が比較的ゆっくり話しているために、「すべての音素」で口形が変化しても違和感がないと考えられる。
ここまで試した方式では、リアルタイム3Dコンピューターアニメーションのリップシンクのためには、改良した時間長ベース方式が最も自然なリップシンクアニメーションを再現できるようだ。ただし、10fps程度以下の場合はいずれの方式でも効果はあまりない。
今回は筆者の主観によりリップシンク方式の適応性を判断したが、もっと客観的に一般視聴者によるテストや専門家による意見等も参考にしていくべきであろう。
実際の人間が会話する場合、単純にある音素の口の形から次の音素での口の形に変形している訳ではなく、もっと複雑な運動を行っている。
さらに自然なリップシンクアニメーションを行うためには、この点も考慮しなければならないだろう。
リップシンクを自動化して行う場合、そのリアルさに関わる要因に次の4点があげられる。
1) 自動リップシンクのためのアルゴリズム自体。
2) リップシンクに必要な、音声ファイル、または、合成音声の解析データの正確さ。
3) 3Dモデルの各音素に対応したモーフターゲットの精密さ。
4) グラフィックカードやCPUなどの再生ハード環境。
テキストや録音音声からリップシンクアニメーションを自動化して作成することは、実際に会話する人物の顔面を光学的にモーションキャプチャーしたり、または、熟練した3Dアニメーターによってリップシンクアニメーションを作成することと比較して、コスト安となることは明らかである。但し、それはリアルさ、自然さとのトレードオフとなる。
上記4点の要因はすべて絡み合っているのだが、不自然さが起こるとすれば、どこに起因するのかをはっきりさせて今後の開発を行っていかなければならないであろう。
(*1) LipAnalyzer –「実音声対応」の項参照。
(*2)Super8 filmのフレームレートは18fpsであり、この程度が人間の目に滑らかにアニメーションを見せる限界点であると考えられる。また、VTRは30fps、映画は24fpsである。
筆者のテスト環境は、CPU Pentium 4 2.6Ghz / GPU NVIDIA GeForce4 MX440であり、
「かえで」のデモは60fps程度出ている。
(*3) Bot3D Engine
(*4) リアルタイムリップシンクシステム
例えば、リアルタイムで音声を解析して音素を取得するリアルタイムリップシンクエンジンを用いて、直接のマイク入力音声や放送される音声からリップシンクアニメーションを生成するシステム等のことを指す。
(*5) SFT – 「合成音声対応」の項参照。
(*6)サンプルでは立ち上がり時間は100msに設定している。
(*7)サンプルでは無音期間と判別する無音音素時間長は 400msに設定している。