SwiftでVisionOSのアプリを作っていく。
作りたいのは音声認識したらプロンプトが入力されて、AIが360度画像を作って、それが空間に表示されるもの。
メタバース×生成AIでなんかおもろいことしろとの無茶ぶりに対して久しぶりにアプリ作ってみた。制作時間は3時間くらい?実装はOculus Integration→DictationRecognizer→DeepLAPI→SkyBoxAI APIという感じ。UnityからのSkyBoxAI APIの呼び出しはAISkyboxGeneratorというリポジトリを使用 pic.twitter.com/N8uVvPgPUI
— decchi (@decchi) 2023年10月30日
Swift触るの初めてなので、まずはこちらの30Daysから使いたい機能二つを自分のまっさらなプロジェクトにコピーして組み合わせてみるところから
あんまりメモせずがむしゃらにやっていたので記憶が曖昧
360度画像表示
こちらを参考に360度画像表示をする!
Day14: Progressive and Full view
— SATOSHI (@shmdevelop) 2023年7月15日
ImmersiveSpaceの2つのタイプでの表示サンプル
現実が一部見えるProgressive
完全にCG内空間の表示となるFull
空間が丸ごと変わると没入感が大きく違いそうですねhttps://t.co/FBB0oR2yPQ#30_days_visionOS#visionOS pic.twitter.com/xhrGiqDu2Z
表示する360度画像はAssetsというところにあらかじめセットしておくみたい
左下の+からImageSetというのを追加して、画像を入れた
なんか怒られてた。黄色マークだから無視していいかと思ったらこれだと画像表示されずダメだった。JPGって大文字なのがダメだった
表示されない時こんな感じの真っ黒になる
あとinfoのところもなんかサンプルと同じように設定し直さないとダメだった気がする
これで無事表示された
何もせずとも、日本語も使えるんだね
音声認識
Day19: Speech Recognition
— SATOSHI (@shmdevelop) 2023年7月23日
visionOSで音声認識機能
現状では en のみ、つまり英語のみ認識可能でした
日本語対応待ちましょう
またToggleのカスタムスタイル実装も入れてみました
視線+音声入力や操作の場面は今後増えるでしょうねhttps://t.co/FBB0oR2yPQ#30_days_visionOS#visionOS pic.twitter.com/tEX6jdd5JM
360度画像表示と合体してできた。
初めてswiftファイルを追加した。
入力した言葉をテキストに表示するのはChatGPTに聞いた。すごい簡単だった
UI要素を書く場所にText(speechRecognizer.transcript)を追加するだけだった
警告が出る
この時は動いていたけど、後の方で色々別の処理追加したら、音声認識開始して何かをしゃべるとアプリが落ちるようになってしまった;;
結局この仕組みは使わず、デフォルトの TextFieldを追加したら、キーボードが出てきてそこで音声認識でも入力できるので別にいいかってなった。
アプリアイコン設定
アプリアイコンがないとテンションが上がらないので設定することにした。
AppIconというエリアはAsstsに最初からあるけどどこに画像設定するのかわからない・・・
と思ったらスクロールしたらNo Contentの下の方に設定する場所あった
適当にBackもFrontもトマシープアイコンにしたら、Backは透過じゃなくて塗りつぶしされてるものじゃないとダメと怒られた
Figmaで作った
元画像が小さいとその大きさが反映されるんだ・・・
ちゃんとした大きさに設定し直した。
いい感じだけど他のアプリみたいに影が落ちない・・・なんで;;
Xcodeのプレビューだと落ちてるな・・・Simulatorの不具合かな?
その他
SkyboxLAI社のapiを使って、音声認識してプロンプトとして与えて360度画像を作ってもらい、それを表示したい。
API投げて画像をローカルに落とすところまでは、先輩の力でなんとかできた。最初ChatGPTにドキュメント投げて作ってもらってたけど全然的外れなことしてた気がする。
ドキュメント
api-documentation.blockadelabs.com
生成された画像を空間に表示する部分がうまくいかない
ローカルのパス名とファイル名からWindowに画像を表示するのはなんとかできた。
わかったこと
Viewの中では変数に何かを入れることはできない
Buttonの中のTaskとかの中でしかできないことがある
onAppearがUnityでいうStart()代わり
.onAppear {
Task {
await openImmersiveSpace(id: "ImmersiveSpace_Full")
}
}
Viewの中はフラグとかが変化したら随時いつでも反応するらしい
最後に
UnityC#ちょっと触ってただけの人間が初めて作るべきものじゃなかった・・・
最近ずっとUIしかしてないし
ChatGPTがVisionOSの情報や最新のSwiftの情報を持ってないのもキツイ。検索してって言ったら検索してくれるけど。
次回はSwiftのUIの構築の方を勉強!!