キャラクターにまばたきのリズムを

Unityなどでキャラクターに自動まばたきを実装するとき、頻度やタイミングをどう決めればよいのでしょうか。本記事では、瞬目に関する文献を手がかりに、あかりれっくスタジオがUnityで採用した頻度、間隔のばらつき、まぶたの開閉動作、発話に合わせた調整を紹介します。コードの手順解説ではなく、自分のキャラクターに合う設定を考えるための設計の技術報告です。

あかりれっくスタジオでリップシンクの開発が進んだころ、次に取り組みたかったのが、キャラクターの表情でした。ただ、顔を直接撮影する装着型の機材は、費用面から当時まだ用意していませんでした。

キー入力による表情切り替えも、複数のキャラクターをリアルタイムで操作するにはオペレーターの負担が大きくなります。そこで、まずは操作を必要としない自動まばたきを検討しました。頻度や間隔、開閉時間を決める手がかりとして文献を調べ、今回の設計を組み立てました。

0. [概要] 設計の概要:頻度・ばらつき・開閉動作・発話による調整

まず、採用した設定と仕組みを4項目にまとめます。概要を知りたい方はこの章を、根拠文献や自分のモデルでの調整方法を追いたい方は、各項目に示した章を読んでください。

BPMは1分間あたりのまばたきの回数です。「開始間隔」は、閉じ始めてから次に閉じ始めるまでを指し、1回の開閉動作も含みます。以下の数値はスタジオ独自の実装値で、文献が推奨する一律の正解ではありません。

頻度:待機時17 BPM・発話時24 BPM

待機時17 BPM、発話時24 BPMを目標に採用しました。両者の間は0〜1の発話状態重みで線形補間し、重みの0→1の全幅遷移を0.15秒(Attack)、1→0を0.35秒(Release)としました。途中で判定が反転した場合は、現在の重みから反対方向へ移ります。頻度の根拠は第1・2章、切り替えの詳細は第6章で説明します。

ばらつき:対数正規分布とCV 0.55

平均開始間隔を「60 ÷ 目標BPM」として、対数正規分布から各回の間隔を抽選する方式を採用しました。平均に対するばらつきを表す変動係数CVは0.55としました。通常瞬目の抽選値は、0.70秒未満を0.70秒へ、15秒超を15秒へ丸めます。分布を選んだ理由と計算方法は第3・4章で扱います。

開閉動作:閉眼100 ms・保持20 ms・開眼200 ms

基準時間は閉眼100 ms、完全閉眼の保持20 ms、開眼200 msとし、開く動作を長くしました。標準設定の閉眼・開眼カーブには、ともにEaseInOutを採用しました。1回ごとに一様抽選した共通倍率で、3区間の時間を±12%変動させます。動作の根拠とカーブの役割は第5章で説明します。

発話による調整:瞬目を足さず、近くの予定を前倒しする

発話ありからなしへ変わり、その状態が0.20秒(Silence)続いた時点を境界候補としました。そこから未来0.50秒以内(Merge)の通常予定だけを、条件付きで現在へ移動します。新しい瞬目は追加しません。適用条件と、頻度の補間との関係は第6章で説明します。

この4項目を組み合わせ、「間隔を抽選して予定を作り、その時刻にまぶたを動かす。発話入力で頻度と予定を調整する」という構成にしました。連続まばたきは標準設定では無効です。今後の調整と実モデルでの確認結果は第7・8章で紹介します。

今回の設定による自動まばたきの動作例。待機時17 BPMを目標とし、開始間隔にばらつきを持たせています

1. 頻度を決める前に、文献が示す印象差と個人差を押さえる

ここでは、頻度の違いが何に影響するのか、文献から確認します。まばたきは文献では「瞬目」、その頻度は「瞬目率」と呼ばれます。

高嶋和毅ほかの「人の印象形成におけるキャラクタ瞬目率の影響」では、67名が人物型キャラクターの20秒間の映像を評価しました。瞬目率を9、12、18、24、36 BPMの5条件に変えると、印象評価に違いが生じたと報告されています。18 BPMで親近性が高い条件がある一方、傾向はモデルによって異なると報告されています。[1]
親近性などの印象を調べた結果であり、どのモデルにも最も自然な頻度を示したものではありません。

人の瞬目にも大きな個人差があります。杉山敏子・田多英興の「成人における内因性瞬目の年齢差と性差」では、成人が映像を3分間視聴する条件で、その個人差が報告されています。[2]

頻度は一つの文献値だけで決めず、対象モデルと人の状態による違いを踏まえて選ぶことにしました。

2. 状態による頻度差を参考に、待機時17 BPM・発話時24 BPMを採用した

次に、話している間は頻度を上げる方針と、今回の設定値の関係を説明します。

次の2件の研究の抄録では、対象条件で会話時・発話時の瞬目率が安静時・沈黙時より高い値として報告されています。[3][4]

文献と対象条件抄録で報告された瞬目率
Bentivoglioほか、健康な150名、各条件2分安静時17 BPM、会話時26 BPM、読書時4.5 BPM
Karsonほか、健康な36名、沈黙・発話・記憶聴取・読書の4条件沈黙時19.0 BPM、発話時24.7 BPM、記憶聴取時27.6 BPM、読書時12.3 BPM

参考にしたのは、状態によって頻度が変わるという傾向です。その傾向を取り入れ、キャラクター用には待機時17 BPM・発話時24 BPMを採用しました。表の観測値と、この設定の組み合わせは別のものです。

読書などへ状態別設定を広げる場合には、表の数値も候補になります。ただし、その用途での実モデル確認はまだおこなっていません。

3. 平均頻度だけでなく、間隔のばらつきを設計する

この章では、平均間隔をそのまま固定周期にせず、対数正規分布を選んだ理由を説明します。

平均開始間隔(秒)= 60 ÷ 目標BPM

24 BPMなら平均は2.5秒ですが、毎回2.5秒おきに動かすと、短い間隔や長い空白のある並びは表せません。そこで、平均頻度と各回の間隔を分けて考えました。

参考にしたBorges、Garcia、Cruzの「Distribution of Spontaneous Inter-Blink Interval in Repeated Measurements With and Without Topical Ocular Anesthesia」では、19~32歳の15名を対象とした5分間の視聴条件で、条件ごとにまとめた瞬目間隔が対数正規型の分布を示したと報告されています。[5]

対数正規分布は、短い値の側に山があり、長い値の側へ裾が伸びる分布です。

図1 待機時17 BPM、CV 0.55から計算した、上下限処理前の対数正規分布の理論曲線

文献が示したのは、対象条件のデータをまとめた分布です。今回はその観測を参考に、短い間隔と、ときどき現れる長い間隔を表す設計モデルとして、対数正規分布を採用しました。

4. 平均・CV・上下限から、次の瞬目時刻を決める

ここからは、分布を実際の開始間隔へ変換する方法です。設定の役割は下表に、同じ計算を再現したい方向けの式は後半にまとめます。

設定採用値担当すること
目標BPM待機時17/発話時24上下限処理前の分布の平均開始間隔を決める
CV0.55平均に対する間隔のばらつきを決める
通常瞬目の開始間隔の下限0.70秒短い抽選値をこの値へ丸める
開始間隔の上限15秒長い抽選値をこの値へ丸める

CVは標準偏差を平均で割った「変動係数」です。分布の形は文献を参考にし、CV 0.55と運用範囲0.70~15秒はプロジェクト独自に設定しました。開始間隔は閉じ始めから次の閉じ始めまでなので、開閉動作も含まれます。

計算を再現するための式

目標瞬目率を r BPM、平均開始間隔を Ī 秒、標準正規乱数を Z とすると、計算は次のとおりです。lnは自然対数、expはその逆の計算です。

  1. Ī = 60 ÷ r
  2. σ² = ln(1 + CV²)
  3. μ = ln(Ī) − σ² ÷ 2
  4. I = exp(μ + σ × Z)

μとσは対数を取った側で分布を定める値で、σはσ²の正の平方根です。最後のIが抽選された開始間隔で、この段階の分布の平均が60 ÷ rになります。

得られたIは、0.70秒未満なら0.70秒へ、15秒超なら15秒へ丸め、次回の開始予定に使います。範囲外の値を再抽選する方式にはしませんでした。この処理で平均も変わるため、目標BPMと処理後の実測BPMが完全に一致するとは限りません。

5. 閉じる時間を短く、開く時間を長くした

間隔が決まったら、1回のまぶたの動きを設計します。ここでは開閉時間とカーブ、動作ごとの時間変動を扱います。

人の観測研究では、閉じる時間より開く時間のほうが長いと報告されています。[2]
研究ごとに測定区間や方法が異なるため、今回はこの時間構造を参考にし、次の基準時間を採用しました。

動作採用した基準時間
まぶたを閉じる100 ms
完全に閉じた状態を保つ20 ms
まぶたを開く200 ms

時間や動きのカーブをまとめた設定を、ここではProfileと呼びます。標準Profileの閉眼・開眼には同じ形のEaseInOutカーブを採用しました。非対称性は、主に同じカーブを適用する時間の違いから生まれます。

さらに、動作ごとの基準時間に±12%の変動を加えることにしました。倍率は1回ごとに一様抽選し、その1回の3区間すべてへ共通に掛けます。開始間隔のばらつきとは別の処理で、±12%も独自の設定値です。

6. 発話中の頻度と、発話の区切りでの予定を調整する

発話に合わせる処理は、頻度の補間と予定の前倒しの2つです。着想となった文献を確認したあと、それぞれの時間設定と動作を説明します。

HollandとTarlow(1975)の「Blinking and Thinking」の抄録では、人はフレーズの間や文末で瞬目し、発話を区切ると説明されています。[6]
この特徴をキャラクターでも表現するため、近くの瞬目予定を前倒しするアルゴリズムを搭載しました。文献から得た着想を、既存のスケジュールへ取り入れるための実装です。

音声との対応を学習する「HMM-Based Automatic Eye-Blink Synthesis From Speech」も、発話と瞬目を関連づけた予備研究です。5名、3発話、4条件の知覚評価では、ランダムな瞬目より自然と評価されたと報告されています。[7]
今回の簡易判定とは異なる方式です。

一方、NakanoとKitazawaの「Eyeblink Entrainment at Breakpoints of Speech」の抄録が扱うのは、音声付きの話者顔アップ映像を視聴する聞き手です。話者の発話終端やポーズ中の瞬目に、聞き手が0.25~0.5秒遅れて同期したと報告されています。[8]
この遅延は、今回の話者自身の前倒しに使う時間設定とは別のものです。

頻度の補間と境界判定には、別の時間を設定した

項目採用値役割
Attack0.15秒発話状態重み0→1の全幅線形遷移の基準時間
Release0.35秒発話状態重み1→0の全幅線形遷移の基準時間
Silence0.20秒発話あり→なしの後、非アクティブの継続を確認する
Merge0.50秒境界時点から未来の既存通常予定を探す範囲

この4値はプロジェクト独自に設定しました。発話状態重みは毎フレーム線形に更新し、その重みで17 BPMと24 BPMを線形補間します。途中で判定が反転すれば、現在値から逆方向へ進むため、到達時間は全幅遷移より短くなります。Attack/ReleaseにSilenceやまぶたの開閉時間は含みません。

発話あり→なしの変化を起点に、1回だけ前倒しを評価する

発話判定には、信号ありの新鮮なリップシンクフレームがあるかを使いました。音声の物理的な終了や文意を直接認識する方式ではありません。

  1. 発話ありからなしへ変わったフレームで、ReleaseとSilenceの計測を同時に始める。
  2. なしが0.20秒続いた時点で、境界候補を1回だけ評価する。初めからなしのままでは候補にならない。
  3. その時点より後、0.50秒以内の通常予定があれば、条件を満たす場合にだけ現在へ移す。

前倒しは、瞬目待ちの状態で、抑制中ではなく、通常瞬目の最小開始間隔を満たす場合に限りました。連続まばたきの2回目は対象外です。Mergeは未来予定の探索窓であり、短い無音を統合する待機時間や、境界前後の対称窓ではありません。

ReleaseはSilenceの完了を待たずに進みます。境界候補の評価前に発話が再開すれば、待ちは取り消し、重みはリセットせず現在値からAttack方向へ反転します。前倒しが不成立でも、同じ境界を毎フレーム再評価しません。

この方式では新しい瞬目を追加しません。基礎スケジュールに発話終了ごとの瞬目を足して、頻度を増やすことを避けるための設計です。

7. 連続まばたきは、次の調整対象として残した

ここは今後の拡張についての補足です。連続まばたきの処理も実装しましたが、標準Profileの発生確率は0%とし、現在は無効にしています。

「成人における内因性瞬目の年齢差と性差」では、0.5秒未満で続く連続瞬目が観測されています。[2]
実装側には、1回目が完全に開き終わってから0.25~0.50秒待つ設定を、独自の候補値として用意しました。今後は有効化し、待機時間や発生確率を変えながら実モデルの見た目を確かめる予定です。

8. 実モデルで、設定を組み合わせた見た目を確認した

最後に、今回の設定を組み合わせた結果です。実装後に私自身が実モデルで目視し、違和感がなく自然に見える瞬きになっていることを確認しました。個々の値の比較評価ではなく、今回のモデルと構成での主観的な確認です。

9. 自分のモデルでは、設定の役割を分けて調整する

自分のキャラクターへ適用する際は、今回の数値と合わせて、次の設計順序を参考にしてください。

  1. 対象の状態に合わせて目標BPMを置く。
  2. 開始間隔の分布、CV、運用上の上下限を決める。
  3. 閉眼・保持・開眼の時間と、動作ごとの時間変動を決める。
  4. 発話による頻度の補間と、予定の前倒しを検討する。
  5. 組み合わせた結果を実モデルで見て、調整する。

文献は、どのような違いやばらつきが観測されているかを知る手がかりになります。今回はその知見を参考に、頻度、間隔、動作、発話との関係を分けて設計しました。各値の役割を押さえ、自分のモデルに合った瞬きを組み立てる参考になればと思います。

10. 実装に関して

今回の実装に関しては基本的にChat GPT Proによる文献調査とCodex GPT-5.6 Solを使用したコーディングをおこないました。
ご自身の環境でコーディングをおこなう場合においても、本ブログの内容をCodexに読ませて同様の実装を依頼すれば概ねうまくいくと思います。
発話検出のための音声デバイスの選択や、アクターが限定されていて本人に合わせてよりBPMの高い・低い実装をおこないたい場合などは、個別環境に応じたチューニングをしてもらえれば自然なまばたきの実装ができると考えています。

参考文献

[1] 高嶋和毅ほか「人の印象形成におけるキャラクタ瞬目率の影響」『情報処理学会論文誌』49(12), pp.3811–3820。参照箇所:実験1の方法・結果、考察。

[2] 杉山敏子・田多英興「成人における内因性瞬目の年齢差と性差」生理心理学と精神生理学25(3), 255–265, 2007。参照箇所:pp.259–263、Tables 2–4。参加者数は日本語本文の617名を採りますが、英語抄録には671名とあり、原著内に不一致があります。

[3] Bentivoglio et al., “Analysis of Blink Rate Patterns in Normal Subjects,” Movement Disorders 12(6), 1028–1034, 1997。参照範囲:抄録。状態別BPMは対象条件での観測例です。

[4] Karson et al., “Speaking, Thinking, and Blinking,” Psychiatry Research 5(3), 243–246, 1981。参照範囲:抄録。

[5] Borges, Garcia, Cruz, “Distribution of Spontaneous Inter-Blink Interval in Repeated Measurements With and Without Topical Ocular Anesthesia,” Arq Bras Oftalmol 73(4), 329–332, 2010。参照箇所:Methods、Table 2、Fig.3。条件ごとにまとめた瞬目間隔の分布を参照。

[6] Holland & Tarlow, “Blinking and Thinking,” Perceptual and Motor Skills 41(2), 403–406, 1975。参照範囲:抄録冒頭の背景説明。同論文自身の実験は作業記憶活動と瞬目率を扱っています。

[7] Dziemianko, Hofer, Shimodaira, “HMM-Based Automatic Eye-Blink Synthesis From Speech,” INTERSPEECH 2009, 1799–1802。参照箇所:§4.1–4.2、Fig.5。小規模な知覚評価を伴う予備研究として参照しています。

[8] Nakano & Kitazawa, “Eyeblink Entrainment at Breakpoints of Speech,” Exp Brain Res 205(4), 577–581, 2010。参照範囲:抄録。話者の瞬目に対する聞き手の同期を扱う研究。

使用モデル

【VRoid】光莉 サマードレス/Summer Dress / あわ氏

投稿者:

さんごう

さんごう研究所所長。ソーラーカーのドライバー、あと電気エンジニア。そこそこカメラマン。自宅サーバを立てた理由はサイトに広告が表示されるのが嫌だったから。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です