オンラインMTGでアドベンチャーゲーム風のUIで会話する方法
成果物
前段
オンラインMTGに皆さん飽きてきたかと思います。 私も最初は背景を変えたりアバターになったり色々したのですが、それも飽きてしまいました。 というわけで今回はひと手間加えてアドベンチャーゲーム風のUIで会話する方法をご紹介したいと思います。 これを改良すればなんか素敵なアプリケーションもできるかもしれないので、ぜひ皆さんご検討くださいませ。
アドベンチャーゲームのヒロインになろう!
アドベンチャーゲーム(ADV)とは、エロゲ、ギャルゲ、乙女ゲーなどのコンピュータゲームのいちジャンルです。 具体的には以下のように構成されています。
出展: Nintendo Switch版「CLANNAD」が2019年春に配信決定。タッチスクリーン操作&5.1chサラウンドに対応し,Dangopediaも収録(4Gamer.net)
要素としては、
- 背景
- キャラクター立ち絵
- セリフウィンドウ
- セリフ
があり、これらを構築すればADVの登場人物になることができます。
アプローチの検討
今回は実写の人間をキャラクターと見立て、背景素材を挿入させ、その上にセリフウインドウ、セリフと乗せることにしましょう。 そのためには
- Webカメラから取得した映像から人物を切り出す
- セリフをリアルタイムに取得する
ことが必要になってきます。 前者に関しては
という方法があり、今回は一番簡便なZoomのバーチャル背景+OBSのクロマキー処理を利用します。 ちなみに、自分でバーチャル背景機能相当のものを実装する場合、Azule Kinectなどの深度センサーを活用すると良いでしょう。
後者に関しては
という方法があり、今回はGoogle Speech to Textを使います。
データの流れ
ざっくり以下のようになる
OBSのVirtualCamがMacだと使えないのでCamTwistを利用する 基本的にこの構造であとはパパッとやればなんとかなる。
各実装
Google Speech to Textで音声をテキストにする
こちらに関してはStackOverflowなどの記事のほうが詳しいので割愛する というか音声ストリームの変換はサンプルがあるので、そのままパクる https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/speech/microphone/transcribe_streaming_mic.py
OBSのテキストを自動更新する
https://github.com/Palakis/obs-websocket と https://github.com/Elektordi/obs-websocket-py を使う 使い方はWebSocketで繋げてcallするだけ
from obswebsocket import obsws, requests ws = obsws('localhost', 4444) ws.connect() # body プロパティに message を入れて更新 ws.call(requests.SetTextFreetype2Properties(*['body', None, None, None, None, None, 'Hiragino Kaku Gothic Pro', 0, 48, 'W6', None, None, None, message, None, None]))
結び
というわけで、雑実装でADVのキャラクターになってみた。 もうちょい時間を使って実装すればまともなADV UIが完成すると思われるので、皆さんにもやってほしい。