本ページでは,ライブコンペ5で用いるソフトウェアを利用する手順について説明します.本ソフトウェアでは,以下の図に示すモダリティのやり取りを行う対話システムを比較的簡単に構築することができます.
このページで記した方法以外に SUNABAを使いシステムを実装する方法もあります.SUNABAを用いる場合は,SUNABA上で応答文に加えて表情や姿勢を制御する命令も合わせて出力することにより,マルチモーダル対話システムを実現します.SUNABAを用いる際には、SUNABAで設定した BOTIDと TopicIdを提出していただくことにより,AWS上で立ち上げたマルチモーダル対話システムとの接続を事務局で行います.
ユーザからの入力は音声のみとし,この音声がテキストに変換されシステム が受け取ります.システム出力では発話のためのテキストに加え,表情と姿勢を用いる ことができます.発話は音声合成により音声に変換され,また,表情と姿勢 および音声から推定された口の動きを元に CGが生成されます.図中の青い部分で示された処理を行うためのソフトウェアが事務局から提供され,本ページで これらのモジュールの利用方法についてまとめています.
開発の際には,手元の環境でシステムを構築しテストすることが可能です.一方で評価を行う際には,参加者が構築したシステムから事務局が用意するAWS上の各サービス(音声認識・音声合成・表情制御・姿勢制御)に対して対応するポート(8888, 3456, 20000, 21000)で接続し制御することになります.参加者からは,AWS上の firewallの設定のために,参加者のシステムの IPアドレスの情報を提供していただきます.
本ライブコンペで用いるソフトウェアを利用するためのステップは以下のとおりです.
エントリ(参加登録)
ソフトウェアを利用するためには参加登録が必要です.
ソフトウェア仕様に関する誓約書の事務局への提出
Amazon Polly(音声合成のWebサービスです)を使うための AWSのアクセスキーの受領
ソフトウェアのダウンロード 以下の 4種類のソフトウェアをダウンロード
GoogleSpeechRecognitionServer (音声認識)
AmazonPollyServer (音声合成)
CGEricaSet (CG生成)
サンプルコード
システムを動かすためには Java Runtime Environment (JRE)をインストールする必要があります. 以下の URLから,実行環境に合わせて"Windowsオフライン"または "Windowsオフライン(64ビット)"をインストールしてください.
https://www.java.com/ja/download/windows_manual.jsp
音声合成によって生成した音声を元に口の形を推定するるのですが,そのためには音声を再生すると共に,再生した音声をシステムにループバックする必要があります.VoiceMeeterBananaは これを実現するミキサーアプリです.以下の URLから"Voicemeeter 2.0.6.2 (EXE file)"をダウンロードしインストールしてください.
https://vb-audio.com/Voicemeeter/banana.htm
chromeのアドレスバーに
chrome://extensions/
と打ち込むことにより拡張機能ページを開き, ここに以下のファイルをドラッグアンドドロップすることで chromeアプリとしてインストールしてください.
GoogleSpeechRecognitionServer/ChromeApps4GoogleASR.crx
以下のバッチファイルを起動してください.
AmazonPollyServer/docs/OpenCredentialsDirectory.bat
このバッチファイルにより"ユーザ\.aws"ディレクトリが開くので,このディ レクトリに生成された credentialsファイルをメモ帳などのテキストエディ タで開き,事務局から受領したアクセスキーとシークレットアクセスキーを 入力し保存してください.
aws_access_key_id = ***
aws_secret_access_key = ***
CG動作生成は以下の 4つのモジュールからなります. これらを任意のフォルダに配置してください.
01 OculusLipSync (音声から口の動き推定)
02 CGErica (CG Ericaの描画アプリ)
03 MiracleErica (姿勢制御)
04 JointMapper (MiracleEricaの姿勢と表情と口の動きを統合しMotionOSに送信)
以下の手順に従って,ソフトウェアが正しく動作しているかを確認してください.
chromeを起動します.
chrome://settings/content/microphoneで利用するマイクを設定します.
chrome://apps/を入力し,chromeアプリの一覧を表示した後,"Google Speech Recognition Server"を選択し起動します.
起動する画面内の「話してみる」をクリックすることにより音声認識を開始した上でマイクから音声を入力し,テキストとして認識されることを確認してください.
サンプルスクリプトを使って音声認識する場合は、1~3により "Google Speech Recognition Server"を起動後,"speech_recognition.py"を実行し音声認識された結果が標準出力に表示されることを確認してください.
00-launch-AmazonPollyServer.batを起動します.
システムの音声出力デバイスを内蔵スピーカーなどに設定します.
ターミナル上に "###input to speech###"と表示された後,日本語で文章を入力し音声が再生されることを確認してください.
サンプルスクリプトを使って音声認識する場合は、1~2の後で "text to_speech.py"を実行し,ターミナルから入力する文字列に対応する音声が再生されることを確認してください.
起動
記の順に起動してください.
01-OculusLipSync\OculusLipSyncServer.exeを起動します.
02-CGErica\CGErica.exeを起動します.
03-MiracleErica\launcherset\Erica@CG.batを起動します.
04-JointMapper\run-Erica.batを起動します.
首動作および状態姿勢
サンプルスクリプト(MiracleHuman_client.py) を実行し,下記の入力により姿勢を動かすメッセージを送ってください.
g: お辞儀をする
c: 正面を向く
r: 右を向く
l: 左を向く
m: モニターを見る
d: デスクを見る
ru: 右上を見る
ru: お辞儀をしてから右を見る
サンプルスクリプトでは上記の姿勢のみを制御できますが,実際にはより詳細な制御が可能です.詳細は配布するコードに添付されているドキュメントを参照してください.配布ソフトウェアを使用すれば,アバターの姿勢を変えるのに,関節角度を1つ1つ設定する必要はなく,モデリングソフトのように,手先の位置や,視線の向かう先だけ指定するだけで,全身の関節角が自動的に計算されるようなシステムが含まれているので,比較的容易に人型アバターの姿勢制御が可能です.
表情の生成
サンプルスクリプト(JointMapperPlusUltraSuperFace_client.py) を実行し,下記の入力により表情を動かすメッセージを送ってください.
a: あの口
i: いの口
u: うの口
e: えの口
o: おの口
fs: 満面の笑顔
b: 困った顔
an: 怒った顔
s: 笑顔(オリジナル)
n: 平常(オリジナル)
サンプルスクリプトでは上記の表情のみを制御できますが,実際にはより詳細な制御が可能です.詳細は配布するコードに添付されているドキュメントを参照してください.配布ソフトウェアを使用すれば,アバターの表情を変えるのに,怒り・喜び,レベルの指定をすれば表情表現が可能です.また,感情の二次元モデルに従って覚醒度(-1.0~1.0)と感情価(-1.0~1.0)を指定することでも,感情に合わせた表情を表出させることもできます.また,ActionUnitレベルで顔のパーツの位置を指定することも可能です(ただし,人と同様のActionUnitを備えているわけではありません).比較的容易に人型アバターの表情制御が可能です.
停止
起動の逆順にアプリを閉じてください.
仮想ミキサーソフトウェアVoicemeeterBanana を使用すると,再生した音声のループバックデバイスが使えるようになります. ソフトウェアをインストールして,VoicemeeterBananaを起動してください.例えば,A1に再生デバイスを指定し,コントロールパネルの「サウンド」→「再生」タブでVoicemeeterinputを「規定のデバイス」に,「録音」タブでVoicemeeterOutputを「規定のデバイス」に設定します.この状態でOculusLipSyncServerを起動すれば,再生された音声のループバックがOculusLipSyncServerに入力され,音声に合わせた口形状が計算されます.以下の図に設定の例を示します.
口形状生成は音が出力された後で行われるため,音声よりも口形状は遅れて表示されることになります.この問題は音声の再生を遅延させることにより解決できます.
下記の図に示すように VoiceMeeterBananaのSystem Settings/Opitionsの中で出力のDelayを指定できますので,ここでユーザが聞く音声のOUTの部分に 300msecを設定してください.
一連のシステムが動作するOSは Windowsのみとなっています.Core i7以上の CPUで 16GBメインメモリクラスのPCを推奨します. GPUが無くても動作しますが,GPUはあった方が動作はスムーズになります.Core i5,32GBメインメモリ,GPU無しという環境でも動作実績はあります.しかし,スムーズさに欠けるようです.
<送信プロトコル>
音声認識スタート start\n
音声認識スタート stop\n
スタートコマンドは一度送ればずっと音声認識する
<受信プロトコル>
音声認識スタート startrecog:
音声認識途中結果 interimresult:
音声認識最終結果 result:
最終結果の信頼度 confidence:
[受信サンプル上から下に時系列]
startrecog:
interimresult:今日
interimresult:今日は
interimresult:今日は
result:こんにちは
confidence:0.8813719153404236
本アプリがTCPサーバとなり,音声信号の配信または再生を行います.
通信方式は同期通信
文字コードはutf-8
フッターは改行コード
mp3を取得する場合も再生する場合も音声を作る送信プロトコルは同じです.
mp3を取得するサーバとのプトロコル
port: 2345
(送信)再生コマンド→(受信){"result":"success","voice_data":"byte配列をbase64エンコード"}
または (送信)再生コマンド→(受信){"result":"failed"}
音声を再生するサーバとのプトロコル
port:3456
(送信)再生コマンド→(受信){"result":"success-start","duration":12491} →(受信) {"result":"success-end"}
durationオプションを加えないとdurationは-1になる
またspeechmarkオプリョンをtrueにするとword単位とviseme単位の発話はじめからの時間が情報がJsonArray形式で追加される
{"result":"success-start","duration":1303,"speechmarks":[{"time":6,"type":"word","start":53,"end":62,"value":"テスト"},{"time":6,"type":"viseme","value":"t"},{"time":75,"type":"viseme","value":"@"},{"time":158,"type":"viseme","value":"s"},{"time":228,"type":"viseme","value":"i"},{"time":284,"type":"viseme","value":"t"},{"time":344,"type":"viseme","value":"o"},{"time":389,"type":"word","start":62,"end":71,"value":"テスト"},{"time":389,"type":"viseme","value":"t"},{"time":446,"type":"viseme","value":"@"},{"time":520,"type":"viseme","value":"s"},{"time":598,"type":"viseme","value":"i"},{"time":658,"type":"viseme","value":"t"},{"time":712,"type":"viseme","value":"o"},{"time":811,"type":"word","start":71,"end":80,"value":"テスト"},{"time":811,"type":"viseme","value":"t"},{"time":879,"type":"viseme","value":"@"},{"time":970,"type":"viseme","value":"s"},{"time":1028,"type":"viseme","value":"i"},{"time":1109,"type":"viseme","value":"t"},{"time":1178,"type":"viseme","value":"o"},{"time":1303,"type":"viseme","value":"sil"}]}
または (送信)再生コマンド→(受信){"result":"failed"}
durationの単位はmsecで再生終わりのタイミングでフラグが送られてくる
再生中に再生を停止させるコマンド
(送信){"engine":"STOP"} →(受信){"result":"success-end"}
現在音声を再生中か確認するコマンド
(送信){"engine":"ISSPEAKING"} →(受信){"isSpeaking":true/false}
音声合成・再生コマンド
すべてJSON形式
[シンプルテキスト]
パラメータ
speaker:Mizuki, Takumi
pitch:50~100~200
speed:50~100~400
volume:50~100~200
vocal-tract-length:50~0~100
duration-information:true/false
speechmark:true/false
※pitch, speed, volumeはDocomoTTSと互換性を持たせるために基準を100にしている
コマンドサンプル
{"engine":"POLLY", "speaker": "Mizuki", "pitch": 100, "volume":100, "speed":100, "vocal-tract-length":0, "duration-information":false, "speechmark":false, "text":"テストテストテスト"}\n
[ssml]
speaker:Mizuki, Takumi
duration-information:true/false
speechmark:true/false
コマンドサンプル
{"engine":"POLLY-SSML", "speaker": "Mizuki", "duration-information":false, "speechmark":false, "text":"<speak>こんにちは。私の名前は<prosody volume=\"loud\" pitch=\"high\" rate=\"slow\">翔子</prosody>です。</speak>"}\n
SMLの詳細オプション https://docs.aws.amazon.com/ja_jp/polly/latest/dg/supportedtags.html#prosody-tag
評価の際には,AWSなどのクラウド上のサーバにシステムを構築した上で, zoomを使い評価者と接続し対話を行う予定としています.