図1を参照して、この実施例のアンドロイドロボット制御システム(以下、単に「システム」ということがある。)10は、アンドロイドロボット12を含む。アンドロイドロボット12は、人間に酷似した姿形(外観など)を有する人型ロボットであり、人間に酷似した動作(振り、振る舞い、発話)を行う。
アンドロイドロボット12は、インターネットや電話通信回線のようなネットワーク14を介して遠隔操作端末16に接続される。遠隔操作端末16は、PC、PDA、スマートフォン、タブレット端末のような汎用のコンピュータであり、この遠隔操作端末16には、スピーカ18、マイク20およびモニタ22が接続される。図示は省略するが、遠隔操作端末16には、タッチパネルやキーボードのような入力装置が含まれる。また、遠隔操作端末16の動作を制御するためのプログラムおよびデータは、遠隔操作端末16に内蔵しているメモリ(図示せず)に記憶されており、同じく内蔵のCPU(図示せず)によって遠隔操作端末16全体的な動作が制御される。
図2は図1の実施例に用いるアンドロイドロボット12の一例を示すが、他の外観、構造を持つ任意のアンドロイドロボットが利用可能であることを予め指摘しておく。
アンドロイドロボット12は、胴体部24およびその胴体部24の上に設けられた頭部26を含む。頭部26には、目(眼球)の上下に、上瞼28aおよび下瞼28bが形成され、それらの上瞼28aおよび下瞼28bの上下動を制御することによって、目を開けたり閉じたりする動作が可能となる。頭部26にはさらに口唇が形成され、それの両端が口角30となる。口角30も同様に上下動可能である。
胴体部24の上端(頭部の下方)が肩32であり、胴体部24の中ほどが腰34である。肩32は上下動可能であり、腰34は前屈および後傾が可能である。
アンドロイドロボット12の上述の各部分を動かすための以下に説明するアクチュエータは、この実施例では、いずれもパルス電力によって駆動されるステッピングモータであり、ステッピングモータの回転量はパルス数で決まる。パルス数が指令値として与えられる。なお、初期値とは、当該アクチュエータによって変位される対象部位を平常状態にするためのパルス数(指令値)である。
上述の上瞼28aの上下動を制御するのが、アクチュエータA1であり、このアクチュエータA1は「0−255」の指令値に応じて動作する。初期値は「64」である。アクチュエータA1は、指令値「0」で上瞼28aが一番上の位置(目を大きく見開いた状態)になり、指令値「255」で一番下の位置(目をきつく閉じた状態)になるように、設定されている。
アクチュエータA2、A3およびA4は眼球を左右上下に動かすためのアクチュエータである。
アクチュエータA5は、下瞼28bの上下動を制御するアクチュエータであり、「0−255」の指令値に応じて動作する。初期値は「0」である。アクチュエータA5は、指令値「255」で下瞼28bが一番上の位置(目をきつく閉じた状態)になり、指令値「0」で一番下の位置(目を大きく見開いた状態)になるように設定されている。
アクチュエータA5は、上述のアクチュエータA1とともに、アンドロイドロボット12の笑いに伴う表情動作の制御のために用いられる。
アクチュエータA6は額を動かすためのアクチュエータであり、アクチュエータA7は眉間を動かすためのアクチュエータである。
アクチュエータA8は、口角30を上げるためのアクチュエータであり、「0−255」の指令値に応じて動作する。初期値は「0」である。アクチュエータA8は、指令値「255」で口角30が一番上の位置に変位した状態となり、指令値「0」で一番下の位置になるように設定されている。アクチュエータA8は、アンドロイドロボット12の笑いに伴う表情動作の制御のために用いられる。
アクチュエータA9は舌を上下方に動かすためのアクチュエータである。
アクチュエータA10は口唇を左右に広げるアクチュエータであり、アクチュエータA11は口唇を前に突き出すためのアクチュエータである。これらのアクチュエータA10、A11は後述の口唇動作の制御のために用いられる。
A13は顎を突き出したり引いたりするためのアクチュエータであり、「0−255」の指令値に応じて動作する。初期値は「32」である。アクチュエータA13は、指令値「0」で顎を最も上げた(つまり口を閉じた)状態にし、指令値「255」で顎を最も下げた(つまり口を開けた)状態とするように設定されている。アクチュエータA13は、後述の口唇動作の制御に用いられ、アンドロイドロボット12の笑いに伴う表情動作の制御のためにも用いられる。
アクチュエータA14は頭部26を左右に傾動させるためのアクチュエータである。
アクチュエータA15は頭部26を俯仰させるためのアクチュエータであり、「0−255」の指令値で動作する。初期値は「128」である。アクチュエータA15は、指令値「255」で頭部26が最も仰向いた状態になり、指令値「0」で最も直立している状態になるように、設定されている。
アクチュエータA16は頭部を左右に回動させるためのアクチュエータである。
アクチュエータA17は肩32を上下動するためのアクチュエータであり、「0−255」の指令値で動作する。初期値は「0」である。アクチュエータA17は、指令値「255」で肩32が一番上の位置になり、指令値「0」で一番下の位置になるように、設定されている。
アクチュエータA18は腰34を前屈させまたは後傾させるためのアクチュエータであり、「0−255」の指令値で動作する。初期値は「32」である。アクチュエータA18は、指令値「255」で腰34が最も前屈した状態になり、指令値「0」で最も後傾した状態になるように、設定されている。
アクチュエータA19は腰34を左右に回動(ひねる)ためのアクチュエータである。
アンドロイドロボット12は、図5に示すように、アンドロイドロボット12の全体制御を司るCPU36を備える。CPU36は、バス38を通して通信モジュール40に接続され、したがって、CPU36は通信モジュール40を介して、ネットワーク14すなわち遠隔操作端末16と、有線で、または無線で、通信可能に接続される。
CPU36はまた、バス38を通してメモリ42にアクセスでき、このメモリ42に設定されているプログラムやデータ(図4:後述)に従って、バス38を通してアクチュエータ制御回路44に上述のような指令値を与え、各アクチュエータA1‐Anの動作を制御する。アクチュエータ制御回路44は、CPU36から与えられる指令値に応じた数のパルス電力を生成し、それを該当するステッピングモータに与えることによって、各アクチュエータA1‐Anを駆動する。
ただし、アクチュエータとしてはこのようなステッピングモータを用いるものの他、サーボモータを用いるアクチュエータ、流体アクチュエータなど任意のアクチュエータが利用可能である。
センサI/F(インタフェース)46は、バス38を介して、CPU36に接続され、触覚センサ48および眼カメラ50からのそれぞれの出力を受ける。
触覚センサ48ないし皮膚センサは、たとえばタッチセンサであり、アンドロイドロボット12の触覚の一部を構成する。つまり、触覚センサ48は、人間や他の物体等がアンドロイドロボット12に触れたか否かを検出するために用いられる。触覚センサ48からの出力(検出データ)は、センサI/F46を介してCPU36に与えられる。したがって、CPU36は、人間や他の物体等がアンドロイドロボット12に触れたこと(およびその強弱)を検出することができる。
眼カメラ50は、イメージセンサであり、アンドロイドロボット12の視覚の一部を構成する。つまり、眼カメラ50は、アンドロイドロボット12の眼から見た映像ないし画像を検出するために用いられる。この実施例では、眼カメラ50の撮影映像(動画ないし静止画)に対応するデータ(画像データ)は、センサI/F46を介してCPU36に与えられる。CPU36は、撮影映像の変化を検出するのみならず、その画像データを、通信モジュール40およびネットワーク14(図1)を介して遠隔操作端末16に送信する。そして、遠隔操作端末16は、受信した画像データをモニタ22に出力する。したがって、眼カメラ50の撮影映像がモニタ22に表示される。
また、スピーカ54およびマイク56は、入出力I/F52に接続される。スピーカ54は、アンドロイドロボット12が発話を行う際に音声を出力する。遠隔操作端末16の操作者ないしオペレータ(以下、「遠隔オペレータ」ということがある。)が直接発話を行う場合、ネットワーク14、通信モジュール40および入出力I/F52を通して当該音声が出力される。具体的には、遠隔オペレータがマイク20を通して発話すると、対応する音声データが遠隔操作端末16からネットワーク14を介してCPU36に与えられる。そして、CPU36は、その音声データを、入出力I/F52を介してスピーカ54から出力する。
マイク56は、音センサであり、アンドロイドロボット12の聴覚の一部を構成する。このマイク56は、指向性を有し、主として、アンドロイドロボット12と対話(コミュニケーション)する人間(ユーザ)の音声を検出するために用いられる。
アンドロイドロボット12のメモリ42は、たとえばRAMやHDDであり、図4に示すように、プログラム領域58およびデータ領域60を含む。
プログラム領域58には、音声処理プログラム62が記憶される。音声処理プログラム62は、音声認識プログラムおよび音声合成プログラムを含む。音声認識プログラムは、マイク56を通して入力される、人間がアンドロイドロボット12に対して発話した内容をCPU36が認識するためのプログラムであり、CPU36は、たとえばDPマッチングや隠れマルコフ法(Hidden Markov Model:HMM)により、人間の発話内容を音声認識する。
CPU36は、その音声認識プログラムに従って、遠隔オペレータがマイク20を通して入力した発話(笑い声を含む)を認識する。たとえば、上述のHMM法やディープニューラルネットワーク(Deep. Neural Network:DNN)のような音響モデルを用いて笑い声を検出できる。そして、この実施例では、「ハッハッハ」(“hahaha”)や「フッフッフ」(“huhuhu”)のような特定パターンの笑い声かどうかを検出し、当該特定パターンである笑い声を検出したとき、後述のように、アンドロイドロボット12の上半身(肩32)および下半身(腰34)をその笑い声に付随するように動作させる。
遠隔オペレータの音声を直接スピーカ54から出力する外に、アンドロイドロボット12から音声合成によって発話させることができる。CPU36は、遠隔操作端末16から音声合成によってスピーカ54から発話する指示が入力されたとき、この遠隔操作端末16から与えられる音声合成データに従って合成した音声をスピーカ54に出力する。
口唇動作制御プログラム64は、アンドロイドロボット12がスピーカ54から発話するとき、その発話音声(遠隔オペレータの声または合成音声)に適合する口唇形状となるように、たとえば図2に示すアクチュエータA10‐A11を制御するためのプログラムである。
笑い動作制御プログラム66は、この実施例に従ってアンドロイドロボット12の笑い動作を制御するためのプログラムであって、頭部制御プログラム66a、笑い区間検出プログラム66b、表情制御プログラム66c、上半身(肩)制御プログラム66dおよび下半身(腰)制御プログラム66eを含む。この笑い動作制御プログラム66は、基本的には、アンドロイドロボット12によって笑い声に伴う自然な動作を生成するためのプログラムである。
頭部制御プログラム66aは、後述のように、アンドロイドロボット12の頭部26(図2)を笑い動作に適合するよう動作させるプログラムであり、具体的には、後述のように、笑い声に応じて頭部26を少しずつ仰向くように制御する。
笑い区間検出プログラム66bは、後述のように、遠隔オペレータからの笑い声の区間を検出するためのプログラムである。CPU36は、遠隔オペレータの音声信号から、所定周期毎に所定フレーム長の、たとえばMFCC係数(メル周波数ケプストラム係数:Mel Frequency Cepstrum Coefficient)、フォルマント周波数およびF0(基本周波数)などの音響特徴を検出し、そのフレーム長の間に笑い声があるかどうか検出する。
なお、図1実施例のようにアンドロイドロボット12が遠隔操作端末16すなわち遠隔オペレータによって制御されるのではなく、発現する動作や発話すべき内容が予め設定されている自律的なアンドロイドロボット12の場合、この笑い検出プログラム66bは不要である。自律的アンドロイドロボットの場合、笑い区間は予め設定されているので、検出する必要がないからである。
しかも、自律的アンドロイドロボットの場合には、笑い区間が既知であるばかりでなく、笑い声の音響的特徴、パターン、大きさなどもすべて既知であるので、それらを検出するための動作も不要となる。したがって、後述の各フロー図で説明する動作は、笑い区間、音響的特徴、パターン、大きさなどの既知の数値に基づいて制御すればよい。
表情制御プログラム66cは、笑い声の区間に合わせてアンドロイドロボット12の目や口の表情を制御するためのプログラムである。
上半身(肩)制御プログラム66dは、後述のように、笑い声の区間に合わせてアンドロイドロボット12の上半身(肩)32の動作を制御するためのプログラムである。
下半身(腰)制御プログラム66eは、笑い声の区間に合わせてアンドロイドロボット12の下半身(腰)34の動作を制御するためのプログラムである。
メモリ42のデータ領域60は、種々のデータを記憶するための領域である。音声データ領域68は、遠隔操作端末16から送られてくる遠隔オペレータの音声の音声データおよびマイク56から入力される音声データを一時的に記憶する。辞書データ領域70は、データベース領域として機能し、そこには前述の音声認識や音声合成のために必要な辞書などのデータが記憶される。その他、データ領域60は、CPU36の動作に必要な、タイマ、レジスタ、フラグなどの所要の領域72を含む。
アンドロイドロボット12は、人間に酷似した姿形を有して人間の動作に酷似した動作を行うロボットであるから、遠隔オペレータの発話音声を出力したり、音声合成した音声をスピーカ54から出力する際に、たとえば口唇を動かさなかったり単に音声に関係なく口唇を動かしたりするだけでは人間に強い違和感を与えてしまう。そこで、この実施例のシステム10では、アンドロイドロボット12が出力する発話音声に合わせてその口唇を主とした顔面動作を生成する。
さらに、人間が笑うとき、笑い声を発するだけでなく、顔の表情や身体的な表情も笑い声に合わせて変化するが、アンドロイドロボット12が笑い声を発するときにできるだけ自然に見えるように、顔や身体の表情の動作を生成する。
このシステム10の動作を図5および図6‐図11に示すフロー図を参照しながら説明する。
図5には、CPU36の発話処理の動作の一例が示される。CPU36は、この発話処理を一定時間ごとに繰り返し実行する。
図5のステップS1では、音声データを受信したか否かを判断する。遠隔オペレータが発話したとき、遠隔操作端末16からマイク20で取得された発話音声の音声データが送信されてくるので、この音声データをネットワーク14を介して受信したか否かが判断される。なお、遠隔操作端末16は、発話音声を所定のサンプリングレート(たとえば、8kHz)で音声データとして取得し、取得した音声データを所定のパケット長(たとえば20ms)で一定時間ごとに送信する。
ステップS1で“YES”であれば、ステップS3で、音声記憶処理を開始する。音声記憶処理はCPU36によって他の処理と並列的に実行される。この音声記憶処理によって、受信される音声データが順次メモリ42のデータ領域60の音声データ領域68に記憶される。音声記憶処理は、発話音声が検出されなくなって音声データが受信されなくなったときに終了される。
続いて、ステップS5で、口唇動作制御処理を開始する。口唇動作制御処理はCPU36によって他の処理と並列的に実行される。この口唇動作制御処理では、取得された発話音声の解析が行われて、当該音声に基づいて口唇動作が制御される。口唇動作制御処理の動作の一例は後述する図6に示される。
ステップS7で、頭部動作制御処理を開始する。頭部動作制御処理はCPU36によって他の処理と並列的に実行される。この頭部動作制御処理では、取得された発話音声の解析が行われて、当該音声に基づいて頭部動作が制御される。頭部動作制御処理の動作の一例は後述する図7に示される。
ステップS9で、笑い区間の検出処理を開始する。笑い区間の検出処理はCPU36によって他の処理と並列的に実行される。この笑い区間の検出処理では、取得された発話音声の解析が行われて、当該音声に基づいて、笑い区間かどうかを検出する。笑い区間の検出処理の動作の一例は後述する図8に示される。
ただし、自律的アンドロイドロボットの場合、上述したようにこのステップS9による笑い区間の検出処理は不要である。
ステップS11で、表情動作制御処理を開始する。表情動作制御処理はCPU36によって他の処理と並列的に実行される。この表情動作制御処理では、取得された発話音声の解析が行われて、当該音声に基づいて頭部すなわち顔の表情動作が制御される。表情動作制御処理の動作の一例は後述する図9に示される。
ステップS13で、上半身(肩)動作制御処理を開始する。上半身動作制御処理はCPU36によって他の処理と並列的に実行される。この上半身動作制御処理では、取得された発話音声の解析が行われて、当該音声に基づいて肩すなわち上半身の表情動作が制御される。上半身動作制御処理の動作の一例は後述する図10に示される。
ステップS15で、下半身(腰)動作制御処理を開始する。下半身動作制御処理はCPU36によって他の処理と並列的に実行される。この下半身動作制御処理では、取得された発話音声の解析が行われて、当該音声に基づいて腰すなわち下半身の表情動作が制御される。下半身動作制御処理の動作の一例は後述する図11に示される。
なお、ステップS13における上半身動作制御処理およびステップS15における下半身動作制御処理は必須というものではなく、両方とも省略されてもよく、あるいはどちらかが省略されてもよい。
ステップS17では、音声取得から一定時間経過したか否かを判断する。この実施例では、取得した発話音声を一定量の遅延のもとに再生するようにしているので、この判定によって、音声データの取得(受信)から一定時間の経過を待つ。
ステップS17で“YES”であれば、ステップS19で、音声再生処理を開始する。音声再生処理はCPU36によって他の処理と並列的に実行される。この音声再生処理では、取得された音声データがメモリ42の音声データ領域68から読み出されて入出力I/F52に与えられ、これによって、アンドロイドロボット12のスピーカ54から当該音声が出力される。音声再生処理は、取得した音声データをすべて再生し終わったときに終了される。
なお、ステップS1で“NO”の場合、つまり、発話が行われていないときには、そのまま図5の発話処理を終了する。
ステップS5で開始される口唇動作制御処理の動作の一例を図6を参照して説明する。まず、ステップS21で、音響特徴の変動量を抽出する。
アンドロイドロボット12のような物体の場合、画像のようにフレームごとに口唇形状を制御することは困難である。従って、まず、遠隔オペレータの音声の周波数やケプストラムの解析を行い、音響特徴の変動が高い位置を検出する。音響特徴の変動量は、たとえば、ある時刻における前後所定時間(たとえば20ms程度)のフレームのパラメータ(たとえばMFCC)の平均二乗誤差として算出される。
次に、ステップS23で、この変動量(MFCC平均二乗誤差など)が閾値を超えたか否かを判断する。実験によって、音素の変化を表す程度に、この変動量に閾値を設定しておく。閾値を超えた変動量のピーク位置がアンドロイドロボット12の動作指令発行時点を決める際の基礎となる。
ステップS23で“NO”の場合、処理はステップS21へ戻り、次の時刻を基点とする音声データについて処理を繰り返す。
一方、ステップS23で“YES”の場合、ステップS25で、音響特徴の高い変動量が検出された時点の前後所定時間(たとえば100ms程度)の音声から音響特徴(たとえばMFCC)を抽出し、ステップS27で、非線形モデルを用いて口唇形状の推定を行う。推定の手法として、線形回帰分析、ニューラルネットワーク、HMM、KNN(ケイ近傍法:k-nearest neighbor algorithm)などが挙げられる。音響特徴と口唇形状の間には非線形な関係があるので、ニューラルネットワークのような非線形なモデルを用いることがある。そのためには、予め収録したビデオデータまたはモーションキャプチャによる口唇形状のデータベースによってモデル学習を行っておき、メモリ42の辞書データ領域70にモデル学習による非線形マッピングのための情報を記憶しておく必要がある。
続いて、ステップS29で、推定された口唇形状を形成するための制御情報を設定し、ステップS31で動作遅延を推定する。具体的には、アンドロイドロボット12のアクチュエータA10およびA11の制御情報に関しては、アクチュエータ制御の静的特徴と動的特徴を考慮する。つまり、静的特徴としては、特定の口唇形状に近づけるためのアンドロイドロボット12のアクチュエータA10およびA11の制御情報を予め手動的に取得しておき、口唇形状と制御情報とを対応付けたデータベースをメモリ42の辞書データ領域70に記憶しておく。また、動的特徴としては、特定の形状をターゲットとして口唇を動かした際に、指令を発行した時点からアンドロイドロボット12が実際にターゲットの形状に辿りつくまでにかかる時間(これを動作遅延と呼ぶ。)を実験により取得しておき、制御情報(口唇形状)と動作遅延とを対応付けたデータベースをメモリ42の辞書データ領域70に記憶しておく。後述のステップS37では、この動作遅延の情報を基に、音声と同期を取るために、動作指令を送る時点が早められたり遅くされたりする。
ステップS33では、所定時間の推定を行ったか否かを判断する。この実施例では、音響特徴を抽出した範囲よりも広い範囲、たとえば複数の音素や単語単位で、口唇動作の再構成をすることを想定しているので、このステップS33の判定を行う。ステップS33で“NO”の場合、ステップS21に戻って処理を繰り返す。
ステップS33で“YES”であれば、ステップS35で、区間を通じた口唇動作の最適化処理を行う。つまり、比較的短い期間の音声に関して、ステップS21やステップS25の処理を行い、これらの音声を束ねたより長い区間を通じて動作の最適化を試みる。推定された口唇形状は完全にはアンドロイドロボット12では再現できない場合もあるため、推定された口唇形状の時系列を元に、この口唇動作を簡略化するなど必要な変換を行う。
続いて、ステップS37で、動作遅延に基づいて、音声再生開始タイミングを基準として、各動作指令の発行タイミングを設定する。つまり、特定の口唇形状を形成するための動作指令の発行タイミングは、当該音声との同期をとるために、当該推定遅延に基づいて音声再生開始タイミングを基準として設定される。
そして、ステップS39で、動作指令発行処理を開始する。動作指令発行処理はCPU36によって他の処理と並列的に実行される。この動作指令発行処理では、各動作指令の発行タイミングになったと判断されたときに、アクチュエータA10およびA11の指令値が発行される。
ステップS41では、未処理の音声データが残っているか否かを判断し、“YES”であれば、ステップS21に戻って処理を繰り返す。このようにして、アンドロイドロボット12においては、遠隔オペレータの発話音声が当該音声に適合した口唇動作を伴って出力される。一方、ステップS41で“NO”であれば、この口唇動作制御処理を終了して、図5に戻る。
この実施例によれば、遠隔オペレータの発話音声の音響特徴から非線形モデルを用いて口唇形状を推定し、発話音声の再生開始タイミングを基準として当該口唇形状を形成するまでにかかる動作遅延を考慮してアクチュエータA10,A11の動作指令の発行タイミングを設定するようにしたので、アンドロイドロボット12において遠隔オペレータの発話音声に適合させた口唇動作を実現することができる。したがって、アンドロイドロボット12の応対する人間に対して違和感を与えることなく、自然な対話を行うことができる。
図5のステップS7データの頭部動作制御処理の一例が、図7のフロー図に示される。最初のステップS51では、CPU36は、図5のステップS3でメモリ42の音声データ領域68に記憶された音声データに含まれる基本周波数(ピッチ)F0を抽出する。つまり、フレーム長32msの音声データを10msのフレーム間隔で解析し、音声の基本周波数F0を検出する。基本周波数F0を検出する、一般的な手法として、たとえばLPC(Linear Predictive Coding:線形予測符号化)の残差波形の自己相関関数のピーク探索によるものが挙げられるが、これに限定されるものではない。
そして、次のステップS53では、CPU36は、ステップS51で検出した基本周波数F0に応じて、頭部26(図2)を縦方向に動かす。
発明者等の実験では、頭部運動に関しては、頭部26の縦方向動作の制御方法として、音声のピッチ(F0)に連動させた。基本周波数F0から頭部アクチュエータA15(図2)の指令値へ変換する式は数1となる。
[数1]
A15 = 140 + (F0 - center_F0)*F0_scale
A15<0 → A15=0
A15>255 → A15=255
ここで、center_F0 は話者(遠隔オペレータ)の平均的な基本周波数F0(男性の場合は120Hz前後、女性の場合は240Hz前後)をsemitone(セミトーン:半音)で表した値である。基本周波数F0は現在時刻の値(semitone 単位)であり、F0_scale は平均F0に対する音程の差を頭部26の上下運動にマッピングするスケールファクタである。すなわち、F0_scaleは、頭部26の縦方向の回転角度と音程(声の高さ)の比例値である。
この実施例では、F0_scale を1とし、1semitone の変化がおおよそ1度の頭部回転(仰角)に対応することとした。
ステップS55で、音声データ領域68に未処理の音声データがあるかどうか判断し、“YES”ならステップS51に戻り、“NO”なら図5に戻る。
実験の結果、このように、笑い声の声の高さに連動して頭部動作を付加することにより、頭部26を動かさない場合と比べて不自然な動きにならないことを確認することができた。
図5のステップS9での笑い声区間検出動作は、図8に示される。笑い声区間を検出するのは、笑い声区間の最初と最後、すなわち開始と終了を知る必要があるからである。
図8のステップS61で、CPU36は、メモリ42の音声データ領域68にステップS3(図5)で記憶された音声データをフレーム長32msの音声データを10msのフレーム間隔で解析し、その音声データに含まれる音響特徴、前述のMFCC係数および基本周波数F0を抽出する。
そして、ステップS63で、CPU36は、このような音響特徴に基づいて、該当のフレーム長の区間に、遠隔オペレータの笑い声による発話があるかどうか検出する。もし、笑い声が検出されると、たとえばメモリ42のデータ領域62の領域72の笑いフラグ(図示せず)を「1」にセットし、笑い声を検出しなければ、当該笑いフラグを「0」にリセットする。
ステップS65で、音声データ領域68に未処理の音声データがあるかどうか判断し、“YES”ならステップS61に戻り、“NO”なら図5に戻る。
図9は、図5のステップS11における表情動作制御処理を示すフロー図である。
発明者等の実験においては、笑い動作を分析するために、予め収集しておいたマルチモーダル対話音声データベースを用いた。このデータベースは、さまざまな年代の話者における、対話者の音声、頭部のモーションキャプチャデータおよびビデオデータを含む。各対話は10分程度で、自由会話となっている。データベースには発話区間と書き起こしが存在し、笑い声が含まれるかの情報も存在する。
実験での分析には11名の話者のデータを用い、およそ1000個の笑い声区間が抽出された。各笑い声区間に対し、ビデオを見ながら表情や動作に関連するラベルを付与してデータセットを作成した。
まず、笑いの象徴的な表情として、口角を上げて目を細める動作が挙げられるが、やはりデータセットでも目を細める動作が多く(目を閉じる動作も含むと55%以上で)、殆ど(90%以上)の笑い区間で口角が上がっていた。また、殆ど(90%以上)の笑い区間は頭部や胴体の何らかの動きが伴い、半分以上は縦方向の動きである結果が得られた。
笑い声と動作の詳細なタイミングを調べるため、データベース内の女子大学院生2人による1対話において、瞬きの瞬間と口角を上げる開始および終了時間の切り出しを行った。
その結果、笑顔の表情の(目を細めて、口角を上げる)タイミングは笑い声の開始時刻と一致することが多く、笑顔から平常時の表情に戻るタイミングは、1名の話者では笑い声が終了して平均0.8秒(標準偏差0.5秒)で、もう1名の話者では平均1.0秒(標準偏差0.7秒)である結果が得られた。
このような知見に基づいて、図9の最初のステップS71でCPU36は、メモリ42のデータ領域60の領域72に設定されている上述の笑いフラグを見て、笑い区間が開始したかどうか判断する。ステップS71で“NO”が判断されると、再度ステップS71を繰り返する。
実験の結果、人は笑い区間が開始すると直ちに表情が変化することが分かっているので、CPU36は、ステップS71で笑い区間の開始を検出するとすぐ(笑い区間の開始と同時にまたはほぼ同時に)、ステップS73で目を細める表情を生成するとともに、ステップS75で口角30を上げる表情を生成する。
ステップS73において、CPU36は、笑いに伴って目を細める表情を生成するために、図2に示す上瞼28aのためのアクチュエータA1および下瞼28bのためのアクチュエータA5を制御する。前述のように、アクチュエータA1およびA5はともに「0−255」の範囲の指令値に応答するが、この実施例では、目を細める動作として、アクチュエータA1に指令値「128」を与え、アクチュエータA5に指令値「128」を与えるようにした。上瞼28aおよび下瞼28bがともに、中間位置に変位され、「目を細める」表情が生成される。
ステップS75において、CPU36は、笑いに伴って口角を上げる表情を生成するために、図2に示すアクチュエータA8を制御する。前述のように、アクチュエータA8は「0−255」の範囲の指令値に応答するが、この実施例では、口角を上げる動作として、アクチュエータA8に指令値「128」を与えるようにした。口角30が、中間位置に変位され、「口角を上げる」表情が生成される。
なお、アクチュエータA1、A5およびA8の上述の指令値「128」は、笑顔がはっきり認識できることを実験の結果を確認して決めたものである。したがって、必ずしもこの指令値にこだわる必要はない。
また、この実施例では、ステップS73とS75の両方を実行して「目を細める表情」および「口角を上げる表情」の両方を同時に提示するようにした。しかしながら、ステップS73およびS75の一方だけを実行して笑いに伴う表情動作を制御するようにしてもよい。
ステップS77で、上述の笑いフラグ(図示せず)を見て、笑い区間が終了したと判断したとき、上述の実験の結果と同じように、笑い区間が終了して所定時間経過した後に表情を平常状態に戻す処理を実行する。実験では、1名は0.8秒で、もう1名が1.0秒だったので、この実施例では、ステップS79で1秒経過するまで待って、次のステップS81に進むようにしている。
ステップS81では、CPU36は、笑い区間の終了に伴って目を閉じる表情を生成するために、図2に示す上瞼28aのアクチュエータA1および下瞼28bのアクチュエータA5を制御する。前述のように、アクチュエータA1およびA5はともに「0−255」の範囲の指令値に応答するが、この実施例では、目を閉じる動作として、アクチュエータA1およびA5にともに指令値「255」を与える。応じて、上瞼28aが最下位位置に変位し下瞼28bが最上位位置に変位するので、「目を閉じる」表情が生成される。
その後、ステップS83でのたとえば0.1秒のような所定時間の経過の後、ステップS85およびS87が実行される。上述のステップS79やこのステップS83においては、メモリ42のデータ領域60の領域72に設定されるタイマ(図示せず)を利用して時間経過を計測する。
発明者等の実験の結果を踏まえて、実施例では、笑い声の区間が終了した時点の1秒後(分析結果から得られた平均的な時間差)に平常時の表情に戻すようにする。
このとき、実験によれば、笑顔から平常時の表情に戻る際に、瞬きが伴うことが多い傾向がみられ、実施例では、平常時の表情に戻す前に緩衝的に表情を挿入することとした。この瞬き動作を加えることにした。制御方法としては、ステップS81おけるように1番および5番のアクチュエータA1およびA5を最大指令値(「255」)まで変更して目を閉じ、その100ms後に平常時の眼の開きに戻るように制御した。
ステップS85において、CPU36は、笑い区間の終了に伴って瞼を平常時の上述に戻すために、上瞼28aのためのアクチュエータA1および下瞼28bのためのアクチュエータA5を制御する。前述のように、アクチュエータA1およびA5はともに「0−255」の範囲の指令値に応答するが、この実施例では、平常時の瞼の状態として、アクチュエータA1に指令値として初期値「64」を与え、アクチュエータA5に指令値として初期値「0」を与えるようにした。それによって、上瞼28aがやや上に変位し、下瞼28bが最下位位置に変位され、平常状態の表情が生成される。
笑顔の表情から平常の顔の表情に戻る瞬間にステップS83でのような瞬きの表情を生成したことによって、笑顔の表情から平常の顔の表情に突然戻る不自然さが減少する効果が確認できた。
ステップS87において、CPU36は、笑い区間の終了に伴って口角をやや上げる表情を生成するために、図2に示すアクチュエータA8を制御する。アクチュエータA8は「0−255」の範囲の指令値に応答するが、このステップS85では、口角をやや上げた表情を生成するために、アクチュエータA8に指令値「64」を与えるようにした。
笑い声区間以外のわずかな笑顔を表現するための口角を少し上げるステップS87での動作は、ステップS75での笑い声に伴う「口角を上げる」動作と区別するため、便宜的に「口角2」と呼ぶ。平常時の表情(笑い声以外の区間)をわずかな笑顔にすることにより、表情のギャップの不自然さを減少する効果が期待される。つまり、口角30を平常時に戻すためのステップS87でアクチュエータA8の指令値として初期値「0」を与えたとすれば、そのとき口角30は最下位位置にあり、まったく笑いを見せない表情である。笑い区間では、その表情から、ステップS75でのように口角80が中間位置まで変位されるので、口角30が笑い区間になって突然上がった印象となる。もし「口角2」として平常時でも口角が少しでも上がっていれば、そのような突然変化したように見える不自然さがなくなるのである。
ステップS89で、音声データ領域68に未処理の音声データがあるかどうか判断し、“YES”ならステップS71に戻り、“NO”なら図5に戻る。
図5のステップS13における上半身(肩)動作制御処理が図10のフロー図に示される。ステップS91では、CPU36は、笑い声の区間が開始したかどうか、つまり、笑いフラグが「1」にセットされたかどうか判断する。“NO”なら元に戻って同じ判断を繰り返し、“YES”なら、ステップS93において、笑い区間が所定時間、たとえば500ms以上継続しているかどうか判断する。このステップS93では、笑いフラグが「1」になってからの経過時間を領域72(図4)に設定したタイマで計測することによって、笑い区間が所定時間以上継続しているかどうか判断できる。
ステップS93で“NO”の場合、ステップS95で、笑いフラグを参照して、それが「0」にリセットされたかどうか、つまり、笑い区間が終了したかどうか判断する。ステップS95で“YES”なら、CPU36の処理はステップS91に戻り、“NO”なら、ステップS95に戻る。
なお、ステップS93で、笑い区間が所定時間以上継続しているかどうか判断するのは、この実施例では、所定時間以上笑いが継続しなければ上半身動作制御処理を行わないようにしているためである。上半身動作制御処理が比較的時間を要し、短い笑い区間でも上半身動作制御を行うと却って不自然さを感じてしまうからである。ただし、ステップS93での判断のために設定される所定時間は、任意の時間に設定されればよく、極端な場合それが「0」であってもよい。
ステップS93で“YES”が判断されると、つまり、笑い区間が所定時間以上継続していると判断したとき、次のステップS97において、CPU36は、基本周波数F0の最大値が閾値、たとえばcenter_F0+2semitones(発話者の平均F0+2セミトーン)以上かどうか判断する。ただし、基本周波数F0は、たとえば図5のステップS3で取得した音声データを解析することによって、たとえば図7のステップS51と同様にして、検出することができる。ステップS97データ“NO”の判断をしたとき、CPU36の処理はステップS95に進む。
ステップS97で“YES”を判断したとき、CPU36は、ステップS99において、そのとき発話されている笑い声が先に説明したような特定のパターンの笑い声かどうか判断する。
つまり、この実施例で上半身(肩)を動作させるためには、笑い区間が充分に長く、基本周波数F0が高く、笑い声が母音と有気子音の交互パターンであることという3条件が充足される必要がある。ただし、このうちの1つが充足されただけでこの上半身動作制御処理を実行するようにしてもよい。
CPU36は、音声認識プログラムに従って、笑い声を認識した結果。、それが「ハッハッハ」(“hahaha”)や「フッフッフ」(“huhuhu”)のような母音と有気子音の交互パターン(特定のパターン)の笑い声であると判断したとき、ステップS101に進んで、笑い声の有気子音部分(”h”の部分)で、肩32(図2)を上げるように、アクチュエータA17に対して「128」の指令値を設定する。したがって、肩32が最上位位置と最下位位置との間の中間の高さ位置まで上げられる。
そして、次のステップS103で、笑い声の母音部分(”a”または”u”の部分)でそのアクチュエータA17に対する指令値を「0」として設定する。したがって、肩32が最下位位置まで戻される。
次のステップS105で、笑いフラグを見て、CPU36は、笑い区間が終了したかどうか判断する。“NO”のときはそのままステップS101まで戻り、ステップS101およびステップS103を繰り返す。つまり、この実施例では、母音および有気子音の「パルス」毎に、肩32を上下に動かす。たとえば、「ハッハッハ」では肩を3回上下に動かし、「ハッハッハッハッハ」では5回動かす。
ステップS107で、CPU36は、音声データ領域68に未処理の音声データがあるかどうか判断し、“YES”ならステップS91に戻り、“NO”なら図5に戻る。
図5のステップS15における上半身(腰)動作制御処理が図11のフロー図に示される。ステップS111では、CPU36は、笑い声の区間が開始したかどうか、つまり、笑いフラグが「1」にセットされたかどうか判断する。“NO”なら元に戻って同じ判断を繰り返し、“YES”なら、ステップS113において、笑い区間が所定時間、たとえば500ms以上継続しているかどうか判断する。このステップS113では、ステップS93(図10)と同様に、笑いフラグが「1」になったときとりがされるタイマの計測時間に基づいて、笑い区間が所定時間以上継続しているかどうか判断できる。
ステップS113で“NO”の場合、ステップS115で、笑いフラグを参照して、それが「0」にリセットされたかどうか、つまり、笑い区間が終了したかどうか判断する。ステップS115で“YES”なら、CPU36の処理はステップS111に戻り、“NO”なら、ステップS115に戻る。つまり、下半身(腰)を動かす条件は、笑い区間が十分長いことである。
なお、ステップS113で、笑い区間が所定時間以上継続しているかどうか判断するのは、この実施例では、所定時間以上笑いが継続しなければ下半身動作制御処理を行わないようにしているためである。下半身動作制御処理が比較的時間を要し、短い笑い区間でも下半身動作制御を行うと却って不自然さを感じてしまうからである。ただし、ステップS113での判断のために設定される所定時間は、任意の時間に設定されればよく、極端な場合それが「0」であってもよい。
ステップS113で“YES”が判断されると、CPU36は次のステップS117で、図2に示す腰34を前屈させまたは後傾させる。具体的には、数2に従ってアクチュエータA18の指令値を算出する。つまり、この実施例では、数2に従って、発話者の笑い声の高さF1を腰34のアクチュエータA18の指令値に変換するようにしている。
[数2]
A18= 32+act_target*(1+cos(p*(t-t_start)/2
t_start< t <t_start+1sec.
act_target= (F1-ceneterF1)* F1_scale
A18<0→A18=0
A18>128→A18=128
ここで、「32」はアクチュエータA18の初期値、act_target は、 母音部分の音色に応じた腰の動きの指令値(負の値は腰を後ろに、正の値は腰を前に折り曲げる)、F1 は現在時刻の第1フォルマント、centerF1 は発話者の中心母音の第1フォルマント、F1_scaleは第1フォルマントと指令値のスケールファクタ(腰34の前後方向への傾斜角度と音程(声の高さ)の比例値)、t は現在時刻(秒)、t_start は腰34の動作を開始した時刻(秒)をそれぞれ示す。数2によれば、1秒程度で滑らかに目的の姿勢になるように腰を動かすことができる。
このようにして、ステップS117でCPU36は、発話者(遠隔オペレータ)の笑い声の高さF1に応じた前屈角度または後傾角度で腰34を制御し、ステップS119で笑い区間または終了を検出するまで、ステップS117を繰り返し実行する。このようにフォルマントF1により腰34の動きを制御するため、結果的に、フォルマントの高い「フッフッフ(“huhuhu”)」では腰34は前屈(前のめり)になり、フォルマントの低い「ハッハッハ(“hahaha”)」では腰34は後傾(反らし)になる。
その後、ステップS121において所定時間たとえば1秒の経過を待って、ステップS123で、ステップS117によって前屈または後傾した腰34を、数3に従って、平常時の姿勢に戻す。
[数3]
A18 = 32 + (act_last-32) * (1+cos(p*(t-t_last))/2)
t_start < t < t_start + 1秒
ここで、「32」はアクチュエータA18の初期値、act_lastは笑い区間が終了したときの姿勢の指令値、t は現在時刻(秒)、t_last は 平常時の姿勢に戻す前の時刻をそれぞれ示す。数3に従えば、腰34の姿勢を1秒程度で滑らかに平常時の姿勢に戻すことができる。
ステップS125で、CPU36は、音声データ領域68に未処理の音声データがあるかどうか判断し、“YES”ならステップS111に戻り、“NO”なら図5に戻る。
<評価>
発明者等の実験では、次の4種類の動作パターンのビデオ刺激を用意した。
条件1:口角+瞼+頭+瞬き
条件2:口角+瞼+頭
条件3:口角+瞼+瞬き
条件4:口角+瞼+頭+瞬き+口角2
ここで、「口角」は、図9のステップS75で実現したような口角30(図2)を上げる動作であり、「瞼」は、図9のステップS75で実現したような上瞼28aおよび下瞼28b(図2)による目を細める動作を示す。「頭」は、図7のステップS53で実現したような基本周波数F0から生成した頭部26(図2)の動作を示す。声の高さに連動した頭部動作を付加することにより、頭部を動かさない場合と比べて不自然な動きにならないことを確認することも目的である。「瞬き」は、図9のステップS81で実現したような上瞼28aおよび下瞼28b(図2)による瞬間的な目を閉じる動作である。「口角2」は、図9のステップS87で実現した笑い声区間以外のわずかな笑顔を表現するための口角30(図2)を少し上げる動作である。
被験者15名の総合評価として、頭部の動きがないものは「やや不自然」(負の印象評定)と評価され、頭部は動いても瞬きがない場合は、「どちらともいえない」と評価された。平常時の表情に戻る際に瞬きを付加することにより、正の印象評定に変わり、最も評価が高かったのはすべての動作を含む条件4であり、平均評価が「やや自然」を少し上回る印象評定が得られた。
これらに鑑み、考察すると、評価した4種類の動作において、条件1対条件3(頭部動作が有るか無いか)の映像上の違いは明らかで、その効果は顕著である結果が得られた。この結果より、実施例のようにF0から生成した頭部動作は自然さを向上させるのに効果的であった。
条件1と2では、笑い声区間終了時に瞬きを付加ことにより、不自然さが少し緩和された結果となった。これは表情の突然の変化による不自然さを瞬きがクッション(緩衝的な表情)のような働きをして緩和したというように解釈できる。興味深い結果として、ほとんどの被験者がなんとなく違いは分かるが、その違いが瞬きであることに気付かなかったことである。瞬きのようなわずかな動きを挿入することで、突然の表情変化の不自然さを緩和する方法は、他の表情動作にも使える一般的な方法である可能性もある。
最後に条件1と4では、笑い声の区間以外でもわずかな笑顔を保つことにより、表情変化のギャップを埋める効果があったと考えられる。ただし、今回用いた対話データでは、全体的に楽しい文脈での発話が行われたのでこの口角2は効果的であったが、文脈に応じて、笑い声以外の区間を笑顔で埋めるべきかどうかは検討の余地がある。
なお、実験では検証しなかったが、上半身動作として肩の上下動と、下半身動作として腰の前後への傾動も実行することによりに、より自然な人らしい動作が表出できる。
なお、上で挙げた時間の長さなどの具体的数値はいずれも単なる一例であり、必要に応じて適宜変更可能である。