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による開発者に共通の事項です。
事前準備のステップ
本ライブコンペで用いるソフトウェアを利用するためのステップは以下のとおりです.
エントリ(参加登録)
ソフトウェアを利用するためには参加登録が必要です.
ソフトウェア仕様に関する誓約書の事務局への提出
Amazon Polly(音声合成のWebサービスです)を使うための AWSのアクセスキーの受領
ソフトウェアのダウンロード (共有される開発者用Google Driveのフォルダを丸ごとダウンロードし、解凍してください)
GoogleSpeechRecognitionServer (音声認識)
AmazonPollyServer (音声合成)
CGEricaSet (CG生成)
dslc6 (dockerイメージ、一般開発者向けライブラリおよびサンプルコード)
一般開発者向けライブラリdslclibは、PyPI経由でのインストールに切り替えました。(6/25)
上記と同時にdockerfileも一部更新されました。
dslclib v0.2.0へバージョンアップデートを行い,リリースしました.(7/6)
上記アップデートに伴い,sample.pyが更新されました.7/6以前にdslc6をダウンロードした方は,もう一度ダウンロードをお願いします.
FaceRecognitionServer (感情認識と顔向き認識)
WebSocketBridge2 (Web上GoogleSpeechRecognitionServerをwebsocket経由で取得するためのブリッジ)
installer.bat (上記貸与ソフトウェア以外の半自動化インストーラ)
start.bat (実行環境の自動作成)
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/)を参考にしてください。
環境構築
推奨環境
Windows 11
RAM 16GB以上
CUDA 12.1 (一般開発者でGPUを使う方)
WSL2 (一般開発者でWSLを使う方)
貸与以外でインストールするソフトウェア
Java
VoiceMeeter Banana
Python
Docker for Window
インストール方法
方法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はインストールされています。
方法2:マニュアルでインストール
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をダブルクリックしてセットアップスクリプトを起動してください。
このバッチファイルによって、以下の順番にソフトウェアが起動していきます。(手動で行う場合は、以下の手順に則り起動してください)
AmazonPollyServer (音声合成)
AmazonPollyServer\00-launch-AmazonPollyServer.bat
Voicemeeter Banana (口形状生成のための手動セットアップが要求されます)
VoicemeeterPro
デバイスの指定
ウィンドウ右上のA1を押し、規定デバイスを指定します。
コントロールパネル > サウンドが自動で開いたのち、次の設定
「再生」でVoicemeeterinputを「規定デバイス」
「録音」でVoiceemteroutputを「規定デバイス」
上記の設定を適切に行わないと、これ以降のソフトウェアが正常に機能しなくなります。UIなどの詳細は本ページにある「口形状生成のための VoicemeeterBananaの設定」を参照してください。
CGErica
CGEricaSet\01-OculusLipSync\OculusLipSyncServer.exe
CGEricaSet\02-CGErica\CGErica.exe
CGEricaSet\03-MiracleErica\launcherset\Erica@CG.bat
CGEricaSet\04-JointMapper\run-Erica.bat
FaceRecognitionServer (感情認識、顔向き認識)
FaceRecognitionServer\run.bat
WebSocketBridge2 (音声認識サーバをsocket経由で取得)
WebSocketBridge2\Launcher2-TCPServer.bat
GoogleSpeechRecognitionServer (音声認識)
Web上のconnectボタンを押すことでソケット経由での認識結果取得が可能になります
サンプル対話システムの起動 (一般開発者向け)
サンプル対話システムの起動により、次のことを確認できます。
ソフトウェアの起動が適切に行われているか。
ライブラリdslclibの使い方
対話システムの動作概要
次の手順に則り、サンプル対話システムを起動してください。
ステップ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サーバとなり,音声信号の配信または再生を行います.
通信方式は同期通信
文字コードは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
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つの角度が返されます。
pitch: 上下。上がプラス。
roll: 回転(首をかしげる動き)。右にかしげるとプラス。
yaw: 横向き。左がプラス。
詳細については、仕様しているライブラリ 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)を参照してください。