一問一答きりたんAIエージェント(ミニ)を作った


一問一答できるきりたんAI(ミニ)を作りました。(応答パターンは3つのみです)
できたものはこれです。応答速度が遅いしょっぱい感じですが、応答速度の改善は今後の課題とします。
(Watson Speech To Textを使った音声認識に時間がかかっています)
このVRMモデルを使っています。

これを題材として、本記事では、Unity初心者(普段はPythonとC++を扱っています)がこれを作るまでの道のりをメモとして残します。(よくわからなかったらコメントいただければ)環境はMac Mojaveです。
会話返答はUbuntu上で実行しています。(Macでも実行できるはず)

3D表示部分

Unityのインストール

Unityは3Dエンジンで、3Dゲームの開発に必要なツールが色々とGUIで提供されています。
それ以外にも普及しているOSやデバイスの上で動くバイナリをビルドできます。

今回のアプリはMac上で実装しました。
Ubuntu 18.04でも一応開発できますが、Ubuntuに対応していないプラグインがかなり多いです。(今回使ったものだとLipsync)そして、プラグインはオープンソースでなく、ダイナミックライブラリが入っているだけのものも多いため、結果的にUbuntu上で動かすというより、Ubuntuに繋いだ実機での動作確認ができるのみになります。

Macに関しては特にてきとーにインストールすればOKです。
Ubuntuのインストール手順はこの記事を参考にしてください。
どちらもUnityインストール時にPCビルドサポートを追加しておいてください。

UniVRMのインストールと導入

UniVRMはVRM形式のモデルをUnity上で扱うためのものです。VRmをUnity上でロードしたり、
GUIで表情とかポーズを設定したり、Unity上のC#スクリプトで変更したりできます。

UniVRMは公式サイト通りに適当にインストール。
VRMをUnityのAssetsフォルダ以下にロードすると使えます。

Lipsyncプラグインの導入と設定

LipsyncはOVR LipsyncプラグインVRMLipsyncContextMorphTargetを使えば簡単にできます。 
この2つのプラグインをUnityにインストールした後に、OVRLipsyncコンポーネントを
VRMモデルと同じ階層のGameObjectにロードして、
VRMモデルに対して、VRMLipscynContextMorphTargetコンポーネントと、
OVRLipsyncContextを追加して、VRMLipscynContextMorphTargetにOVRLipscynContextを設定し、
OVRLipscynContextにAudioを設定して、AudioLoopbackにオンを入れればいいです。
VRMLipscynContextMorphTargetのSmoothnessとSensitivityはキャラの口と音声に応じて、調整してください。

Watson APIの組み込み

Watson APIはこのページを参考にすれば動かせます。ここで使っているExampleStreaming.csを改造して、今回の対話アプリを実装しました。
ソースコードはこれです。
いつものごとく、VRMにExampleStreamingをロードしてください。
Audio SourceにはLipsyncの入力に設定したAudioSourceを指定してください。

応答選択の構成

応答選択はあらかじめ発言とその応答のペアを作っておき、ユーザの発言の意味ベクトルに近い発言を探して、発言に紐づいた応答を返すという処理にしてます。意味ベクトルはcamphrの学習済みBERTで抽出、AnnoyでN次元の最近傍探索をするという構成にした。flaskをhttpサーバーとした。

実装手順

インストール

  • camphrのインストール
    • mecabのインストールとcamphrモジュールのインストールのみ
  • annoyのインストール
  • flaskのインストール

コード

ソースコードはこちらです。

いい感じの返答を検索するためのデータベース構築は次のコマンドでできます。

python preprocess_conversation_database.py

Webサーバーは次のように起動できます。(開発用)

FLASK_APP=app.py flask run --port 20020 --host 0.0.0.0 --reload --debugger

http://localhost:20020/kiritan/talk_to?message=疲れたにといった感じで発言を与えると、JSONで返答を返してくれます。audio_urlは音声へのURL(予め生成しておく必要あり), replyはメッセージです。

今後の課題

今後の発展の方向としては、純粋に対話システムとしてみると、
* 今回は、campherで使われているtransformersに同封されているBERTモデルで意味ベクトルを抽出した。
このtransformersのBERTは日本語版Wikipediaを学習データとして学習されているため、SNS会話データなどでFinetuneする必要がある。
* 会話データベースがほとんどないため、きりたんっぽい会話データセットを構築
* 文脈と感情情報の文章からの読み取りと会話ランク付けへの利用
* クラウドベースの会話サービスを検討 (柔軟性にかける可能性はあるが、学習データが豊富なはずなので、語彙とか表現とか多様なものに対応できる)

などが挙げられますが、一緒に暮らすためのAIを作っているので、
まずはモーションとの連携。その後、対話データベースの構築という流れになると思います。

その後、モーションや発話を反応として設定できるエディタを作っていき、
オープンにAIを作っていけるシステムを作ります。
「美少女AIの民主化」を目指してがんばります。