ksk-14 / ARassistant

0 stars 0 forks source link

ARアシスタント

前置き

Pullしても本アプリは体験できないため、ポートフォリオとしてスクリプトのみ掲載
(Wit AI・クラウド・IoTエッジなど、必要になる要素が多いため)

イメージ動画

https://youtu.be/5MmYWvEG_x8

概要

Meta Questアプリ
現実世界にアバターが出現し、プレイヤーの音声によって応答してくれる。
音声認識と IoT を組み合わせており、現実物への操作が可能になっている。
特定のハンドポーズをとることで、アバターが反応し、音声入力が開始される 。
現在の機能は以下

技術構成図

🔗オンプレ版の新構成図はこっち

ARアシスタント_モザイクアリ

技術構成 詳細

AWS

リソース 使用用途
Cognito セキュリティを高めるために使用
一時的な AWS のアクセス権を発行することで、Quest のソース内にアクセスキーを書く必要がなくなる
S3 Quest と AWS のファイル受け渡し場所
音声指示の解析 JSON データ・AWS で生成された音声ファイルを保管している
ここに音声解析データが届くことで Lambda が動き出す
Lambda 本アプリの最重要なコア部分のバックエンド処理を担当
アバターの応答内容判断・Polly に音声を作るように指示・S3 への音声保存・EC2 へシグナルを送信・外部 API へアクセス・IoT Core にパブリッシュなど、主要な処理は全てここで行っている。
本来は Private サブネットに DB を作り、そこにアクセスする予定だったので VPC 内に配置している
EC2 (VOICEVOX) 音声生成するために使用(速度問題で今回は未使用)
VOICEVOX のエディタを除いた、エンジンとコアを使用
公式が配布しているイメージでコンテナ構築
EC2 (Nginx) Web サーバー・リバースプロキシとして使用
外部からのシグナルを Flask アプリのポートへ転送している
EC2 (Flask) シグナル管理のためのアプリ
クラウドで音声生成が完了したのか・Quest で音声再生は終了したのか等の、各プラットフォーム間の状態管理するためのアプリとして機能している
各状態はメモリに保存しており、リクエストがあればその状態を返す仕様
Route53 AWS IoT Core のエンドポイントの名前解決をするために使用
Amazon Polly 音声生成するために使用
Lambda からのテキスト内容に沿った音声を生成する
AWS IoT Core ブローカーの役割
プロトコルは MQTT で、ラズパイと Lambda 間で通信を行い仲介する

Unity側(スクリプト説明)

C#スクリプト名 役割
AppManager アプリ全体を統括するスクリプト
各マネージャーを呼び出し、アプリの実行順序を管理する
Wit AIの音声認識後に呼び出され、検知インテントによって処理分岐を行う
AvatarManager アバターを管理するスクリプト
アバターの動き・音声再生・アニメーション・まばたきや表情管理など、アバターに関することは全てここで行っている
ConfigSingleton 環境変数管理シングルトン
シークレットキーやサーバーのIPなどはこのスクリプトを用いて、JSONファイルから読み込んでいる
FollowUpSingleton フォローアップ(お気遣い機能)の状態管理シングルトン
フォローアップの音声準備が出来たか否か・音声ファイルパスはどこか、等の状態を管理する
S3ClientSingleton S3のクライアント管理シングルトン
S3へのアップロードやダウンロードの際に必要になるクライアントをここで作成して使い回す
S3DownloadManager S3から音声ファイルをダウンロードするためのスクリプト
S3UploadManager S3に音声解析データファイルをアップロードするためのスクリプト
SignalManager クラウドと状態連携するためのスクリプト
EC2インスタンスにQuestの状態(音声再生が終わったか等)を送ったり、クラウドの状態(音声ファイル生成が完了したか等)をポーリングしたりする
フォローアップ有無の把握もここで行っており、クラウド連携の最重要なスクリプト
ここで送られたシグナルはLambdaがEC2に読み取りに行く
VoiceManager Wit AI管理のためのスクリプト
音声入力を開始したり、解析結果をJSON化したりしている

IoTエッジ側

デバイス 役割
Raspberry Pi Switchbot と IoT Core と通信する役割
IoT Core をサブスクライブしてメッセージを受信したら、そのメッセージ内容に応じた処理を実行
Switchbot との通信に関しては、公式が提供しているライブラリを使用
Switchbot との通信プロトコルは BLE 通信