Getting Started

概要

本ページでは,ライブコンペ6で用いるソフトウェアを利用する手順について説明します.本ソフトウェアでは,以下の図に示すモダリティのやり取りを行う対話システムを比較的簡単に構築することができます.

このページで記した方法以外に SUNABAを使いシステムを実装する方法もあります.SUNABAを用いる場合は,SUNABA上で応答文に加えて表情や姿勢を制御する命令も合わせて出力することにより,マルチモーダル対話システムを実現します.SUNABAを用いる際には、SUNABAで設定した BOTIDと TopicIdを提出していただくことにより,AWS上で立ち上げたマルチモーダル対話システムとの接続を事務局で行います.

ユーザからの入力は音声および顔画像であり,音声認識によりテキストに変換されたテキストとマルチモーダル(MM)認識により推定される顔の向きおよび感情をシステム が受け取ります.システム出力では発話のためのテキストに加え,表情と姿勢を用いる ことができます.発話は音声合成により音声に変換され,また,表情と姿勢 および音声から推定された口の動きを元に CGが生成されます.図中の青い部分で示された処理を行うためのソフトウェアが事務局から提供され,本ページで これらのモジュールの利用方法についてまとめています.

開発の際には手元の環境でシステムを構築しテストすることが可能です.各サービス(音声認識,MM認識,音声合成,表情制御,姿勢制御)とはそれぞれに対応するポート(8888, 4500, 3456, 20000, 21000)で接続し制御することになります.一方で評価を行う際には,参加者が構築したシステムを Dockerイメージの形式で提出していただき,評価用のPC上で Dockerを再生することによりシステムを起動します.参加者からは,AWS上の firewallの設定のために,参加者のシステムの IPアドレスの情報を提供していただきます.

以下の記述において「 一般開発者向け」と記載されている箇所以外は、一般開発者とSUNABAによる開発者に共通の事項です。

事前準備のステップ

本ライブコンペで用いるソフトウェアを利用するためのステップは以下のとおりです.

Dockerイメージの提出方法

一般開発者の参加者には、docker saveコマンドを用いて、ビルド済みdockerイメージを提出していただきます。

イメージはサイズが大きくなることが予想されるため、gzipに圧縮したxxx.tar.gzファイルを指定されたGoogle Driveにアップロードしてください。

また、gzipで圧縮するため、wsl上でdocker saveコマンドおよびgzipコマンドを実行することも可能です。

コマンドは公式リファレンス(https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/save/)を参考にしてください。

環境構築

推奨環境


貸与以外でインストールするソフトウェア


インストール方法

方法1:installer.batを使用する (推奨)

installer.batを使用することにより、必要なソフトウェアのインストールを半自動化することができます。

VoiceMeeter Bananaを既にインストール済みで、C:\Program Files (x86)\VB\Voicemeeter\voicemeeterpro.exe以外に置いている場合、未インストールと判断されます。その場合はこのインストールをスキップしてください。

このバッチファイルでは、上記のソフトウェア4種類とAnazonPollyServerのアクセスキーおよびシークレットキーの設定を行います。

installer.batをダブルクリックして、インストーラスクリプトを起動してください。

初めて実行した場合以下のような流れになります。

これから、貸与式ソフトウェア以外に必要なソフトウェアのインストールを行います。

ただし、インストール済みのものはインストールをスキップします。

#### 注意! ####

- ソフトウェアがインストールされていないと判断された場合、自動的にソフトウェアのダウンロードとインストールが行われます。

- 時どきほかのウィンドウの背面にインストーラが隠れる場合があります。その場合はウィンドウを探してください。

- Voicemeeterのインストールのチェックには、デフォルトでのインストール先を探します。もし、既にインストール済みで、"C:\Program Files (x86)\VB\Voicemeeter\voicemeeterpro.exe"以外においてある場合は、処理に気を付けてこのinstaller.batを使用してください。

#### 注意! ####

上記の注意点を理解したら、何かのキーを押して、インストールを始めてください。

Javaがインストールされていません。`https://www.java.com/ja/download/windows_manual.jsp`からWindows オフライン (64ビット)をインストールします。 

インストールが完了しました。

VoicemeeterBananaがインストールされていません。`https://vb-audio.com/Voicemeeter/banana.htm`からインストールします。

インストールが完了しました。

.aws\credentialsの設定がまだの場合、設定を行ってください。

続行するには何かキーを押してください . . .

Pythonがインストールされていません。

インストールが完了しました。

Docker for Windowsがインストールされていません。`https://docs.docker.com/desktop/install/windows-install/`からインストールします。必ずWSL2バックエンドを有効化してください。

インストールが完了しました。


全てのインストールが完了していると以下のように表示されます。

これから、貸与式ソフトウェア以外に必要なソフトウェアのインストールを行います。

ただし、インストール済みのものはインストールをスキップします。

#### 注意! ####

- ソフトウェアがインストールされていないと判断された場合、自動的にソフトウェアのダウンロードとインストールが行われます。

- 時どきほかのウィンドウの背面にインストーラが隠れる場合があります。その場合はウィンドウを探してください。

- Voicemeeterのインストールのチェックには、デフォルトでのインストール先を探します。もし、既にインストール済みで、"C:\Program Files (x86)\VB\Voicemeeter\voicemeeterpro.exe"以外においてある場合は、処理に気を付けてこのinstaller.batを使用してください。

#### 注意! ####

上記の注意点を理解したら、何かのキーを押して、インストールを始めてください。

Javaはインストールされています。

VoicemeeterBananaはインストールされています。

.aws\credentialsの設定がまだの場合、設定を行ってください。

OK

OK

続行するには何かキーを押してください . . .

Pythonはインストールされています。

Python 3.10.9

Docker for Windowsはインストールされています。


方法:マニュアルでインストール

Java

システムを動かすためには Java Runtime Environment (JRE)をインストールする必要があります. 以下の URLから,実行環境に合わせて"Windowsオフライン"または "Windowsオフライン(64ビット)"をインストールしてください.

https://www.java.com/ja/download/windows_manual.jsp

VoiceMeeterBanana

音声合成によって生成した音声を元に口の形を推定するるのですが,そのためには音声を再生すると共に,再生した音声をシステムにループバックする必要があります.VoiceMeeterBananaは これを実現するミキサーアプリです.以下の URLから"Voicemeeter 2.0.6.2 (EXE file)"をダウンロードしインストールしてください.

https://vb-audio.com/Voicemeeter/banana.htm

AmazonPollyServer (音声合成)

以下のバッチファイルを起動してください.

AmazonPollyServer/docs/OpenCredentialsDirectory.bat

このバッチファイルにより"ユーザ\.aws"ディレクトリが開くので,このディ レクトリに生成された credentialsファイルをメモ帳などのテキストエディ タで開き,事務局から受領したアクセスキーとシークレットアクセスキーを 入力し保存してください.

aws_access_key_id = ***

aws_secret_access_key = ***

Python

Pythonのサイト上はかなり複雑でインストールすべきファイルがどれか判断しかねることがあるので、その場合は以下のリンクをダウンロードし、インストールしてください。

https://www.python.org/ftp/python/3.10.11/python-3.10.11-amd64.exe

Docker for Windows

今回から一般開発者にはdocker imageでの提出を求めるため、dockerが必要になります。

以下からDocker for Windowsをダウンロードし、インストールしてください。

https://docs.docker.com/desktop/install/windows-install/

インストールの際、WSL2を使用する方は、WSL2の有効化オプションが出てくるため、その際に有効化を忘れずに行ってください。

(もし忘れた場合は、Docker Desktopの設定からあとから変更できます)

動作の確認

対話システムに必要なすべてのソフトウェアの起動

start.batをダブルクリックしてセットアップスクリプトを起動してください。

このバッチファイルによって、以下の順番にソフトウェアが起動していきます。(手動で行う場合は、以下の手順に則り起動してください)


サンプル対話システムの起動 (一般開発者向け)

サンプル対話システムの起動により、次のことを確認できます。


次の手順に則り、サンプル対話システムを起動してください。

ステップ1:dockerイメージの作成

コマンドプロンプト、Powershell、WSL2のいずれかを起動し、以下のコマンドを実行する。

docker build dslc6 -t dslc6

このコマンドにより、dslc6/dockerfileに基づくdockerイメージが作成されます。

ステップ2:dockerコンテナの起動およびサンプル対話システムの実行

コマンドプロンプト、Powershell、WSL2のいずれかにおいて、以下のコマンドを実行する。

docker run --add-host="host.docker.internal:host-gateway" --rm -it dslc6

このコマンドを実行すると、以下のようにして対話が開始されます。

ipがNoneだったため、host.docker.internalをipアドレスとして設定します。

ipがNoneだったため、host.docker.internalをipアドレスとして設定します。

ipがNoneだったため、host.docker.internalをipアドレスとして設定します。

ipがNoneだったため、host.docker.internalをipアドレスとして設定します。

ipがNoneだったため、host.docker.internalをipアドレスとして設定します。

こんにちは。オウム返しをします。

これ以降、話しかけることによって、

Ericaが「はい、<話しかけた言葉>、ですね」とオウム返しが始まります。


その他Tips

dslclibのインストール方法 (一般開発者向け)

dslclibをインストールするためには、pip install dslclibを実行します。

dslclibは、開発者の要望やその他ソフトウェアアップデートを受け、バージョンアップデートが行われる可能性があります。(顔向きの検出が 2023/7/6から配布されるサーバで実装されたため、現時点では dslclibは顔向きの取得には対応していません)

ライブラリのチェンジログを確認するなどして、定期的にpip install -U dslclibを実行することをお勧めします。

dslclibはPyPI (https://pypi.org/project/dslclib/で公開され、ソースコード及びチェンジログはGitHub(https://github.com/yuta0306/dslclib)に公開してあります。

また,dslclibのリファレンスは https://yuta0306.github.io/dslclib/ で公開しています.

v0.1.3をリリースしました(6/30)

v0.2.0をリリースしました(7/6)

dockerを使うときに、「ERROR: error during connect: this error may indicate that the docker daemon is not running: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/_ping": open //./pipe/docker_engine: The system cannot find the file specified.」 (一般開発者向け)

これは、dockerデーモンが起動していないことに起因します。

焦らずに、Docker Desktopを起動することによって、これは対処されます。


口形状生成のための VoicemeeterBananaの設定

仮想ミキサーソフトウェアVoicemeeterBanana を使用すると,再生した音声のループバックデバイスが使えるようになります. ソフトウェアをインストールして,VoicemeeterBananaを起動してください.例えば,A1に再生デバイスを指定し,コントロールパネルの「サウンド」→「再生」タブでVoicemeeterinputを「規定のデバイス」に,「録音」タブでVoicemeeterOutputを「規定のデバイス」に設定します.この状態でOculusLipSyncServerを起動すれば,再生された音声のループバックがOculusLipSyncServerに入力され,音声に合わせた口形状が計算されます.以下の図に設定の例を示します.

口形状生成は音が出力された後で行われるため,音声よりも口形状は遅れて表示されることになります.この問題は音声の再生を遅延させることにより解決できます.

下記の図に示すように VoiceMeeterBananaのSystem Settings/Opitionsの中で出力のDelayを指定できますので,ここでユーザが聞く音声のOUTの部分に 300msecを設定してください.

環境構築に必要なスペック

一連のシステムが動作するOSは Windowsのみとなっています.Core i7以上の CPUで 16GBメインメモリクラスのPCを推奨します. GPUおよびカメラが必要です.

SUNABAからのChatGPTの利用

講習会(2023/09/17)の説明資料SUNABA上で設定をコピー&ペーストするためのテキスト

SUNABAを使った対話システムの構築方法をまとめています.SUNABAから ChatGPTを呼び出す方法についても説明しています.


通信プロトコル (一般開発者向け)

一般開発者向けライブラリを用いて開発する場合は、このライブラリが以下の通信を担うためこのセクションは不要です。

 GoogleSpeechRecognitionServer (音声認識)

<送信プロトコル>

音声認識スタート start\n

音声認識スタート stop\n

スタートコマンドは一度送ればずっと音声認識する


<受信プロトコル>

音声認識スタート startrecog:

音声認識途中結果 interimresult:

音声認識最終結果 result:

最終結果の信頼度 confidence:


[受信サンプル上から下に時系列]

startrecog:

interimresult:今日

interimresult:今日は

interimresult:今日は

result:こんにちは

confidence:0.8813719153404236

AmazonPollyServer (音声合成)

本アプリがTCPサーバとなり,音声信号の配信または再生を行います.

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

FaceRecognitionServer (マルチモーダル認識)

port: 4500
本アプリがTCPサーバとなり,起動時に指定されたカメラデバイスによって得られた画像の認識結果が以下のフォーマットで送信されます.データは改行(\n)区切りで送信されますので,受信側では改行区切りでパースしてください.

{"timestamp": 1688616222.1594214, "emotion_class": "happy", "emotion_score": 0.6541043519973755, "rotation": {"pitch": 1.885061722321587, "roll": 1.7159196951966813, "yaw": -14.977122629767711}}

emotion_classの値は、neutral, happy, surprise, sad, angry, disgust, fearの7つのうちのいずれかです。詳細については、使用しているライブラリ pypaz(https://github.com/oarriaga/paz)を参照してください。

rotationには顔の向きとして以下の 3つの角度が返されます。

詳細については、仕様しているライブラリ mediapipe(https://github.com/google/mediapipe)を参照してください。

本サーバは感情と顔向きに加えてユーザの年齢と性別も推定して返します。サーバの起動時にオプションで与えた時間間隔毎(デフォルトは5秒)に、age, gender_class, gender_scoreが付与された値が送信されます。

{"timestamp": 1688616222.2129126, "emotion_class": "happy", "emotion_score": 0.6082495450973511, "rotation": {"pitch": 2.565784904789064, "roll": 1.3329546925062552, "yaw": -16.604506635835993}, "age": 28, "gender_class": "Man", "gender_score": 99.90630745887756}

詳細については、使用しているライブラリ deepface(https://github.com/serengil/deepface)を参照してください。