見出し画像

Boltのサンプル ~SD Unityちゃんを音声で制御~

夏休みの宿題が終わっていないような(?)衝動にかられてGitHubにアップしました。SD Unityちゃんがアニメーションするだけのサンプルですが。音声認識に対応した為、Windows環境のみで動作します。

本当は機能パートごとに切り出して小分けしてサンプル化しようと思ってたのですが、そんなことを考えていると延々と出せなさそうなので。

タイトルに「~音声制御~」とか付けてみましたが、サンプル的にはもっと別なところにいろいろあるわけで・・・。いずれ徐々に説明できればと思ったり。


ダウンロード

※一応README.md参照推奨。


Boltのインストール

まず Tools > Install Bolt ではBoltがインストールできません。
(上部メニューバーのに Tool で出てこないので)
そこで以下の手順で手動でインストールします。

1)Projectウィンドウ内の"/Assets/Insall Bolt を見る。
2)そこにある Bolt_1_4_12_NET4.unitypackage をダブルクリック。
Import画面が出るのでOKでインポートします。

これでBoltが手動でインストールされます。


サンプルの機能

キーボード操作でSD Unityちゃんのアニメーションが切り替わります。
※各数字キーはフルキーの方です(テンキーではない)。

停止:[1]キー 
歩く:[2]キー
走る:[3]キー
ジャンプ:[SPACE]キー
カメラ切り替え:[C]キー ※クリックするごとに、回転視点 > Front視点 > TPS視点 > 回転視点に戻るように順に切り替え。


上記の操作が音声でも行えます。

停止:発音「とまる」「ストップ」
歩く:発音「あるく」「ウォーク」
走る:発音「はしる」「ラン」
ジャンプ:発音「とぶ」「ジャンプ」
カメラ切り替え:「カメラ」

マイクが必要ですが、テレワークなご時世になったので一家に1つはありますよね(ほんとに?。
ノートパソコンの内蔵マイクでも良いと思います。
コツは少し大きめの声で言うと良いです。
Windowsのマイク設定などはググってください!


他にマイクを使いそうなアプリは全て終了してからUnityを起動して下さい。
/Assets/Macros/KeywordFile に発音とコマンドの対応定義があります。
書き換えれば任意の音声で操作できます。


色々突っ込みどころの多い(説明どころの多い)サンプルかもしれませんが、とりあえず音声でSD Unityちゃんを操作できるのでやってみて下さい!
(夏休みの工作的なノリ)


補足

時間があればこのサンプルでやっていることについて少しずつ説明していこうかと思います。

Boltをインストールできないとき

C#を併用している場合、 Tools > Install Bolt だとインストールできない場合があります(今回はこのケース)。

その場合は同梱のパッケージを手動でインストールします。
・Bolt_1_4_12_NET3.unitypackage  ※.net3用
・Bolt_1_4_12_NET4.unitypackage  ※.net4用



SimpleAnimation

今回アニメーションにはUnity公式提供の SimpleAnimation を利用しています。

ただ少々問題(?)がありまして。
アニメーションの再生が終了したかどうかが正しく判定できませんでした。
(ジャンプ等ではアニメの終了まで待ってから他アニメに遷移するので)

これは他の人も気づいてるようでネット上で回避策も散見されました。

色々考慮した結果、結局 SimpleAnimation のソースにアニメーション終了判定を返すメンバ関数を独自に追加しています。

一応 MIT LICENSEで改変配布もOKだったかと思います。
(問題がある場合はご連絡下さい)。

Boltでメカニムを使うと、アニメーション遷移管理が二重になりやすいので、SimpleAnimation はもうBoltの内蔵ノードになってても良いくらいな気がしてますね。


CSVインポータ的なナニカ

音声認識ワードとコマンド定義名をCSV形式で扱っています。

CSVファイル:/Assets/Macros/KeywordFile

で、まぁそのCSVインポータをBoltノードで書いてみたわけですが。

感想「Bolt側でCSVインポータのノードください、オネガイシマス」(笑。

なかなかのメンドクサソウなノードが出来上がりまして。
(/Assets/Macros/ReadCsv)
「Boltノードで作るより、C#で書いた方が早い」と言われる所以はここらにありそうです。

UE4のCSVインポータ実装はあれはあれでちょっとアレなので、Boltはもうちょっとなんとかした実装で是非・・・。

/Assets/Macros/KeywordFile の定義ワードを書き換えると色々な音声で認識できるので遊べます。
(必殺技を叫ぶようなゲームも作れるかも?)

この辺の認識具合は Amazon Alexa のアプリを書いた人ならわかると思いますが、今回は「ウォーク」が認識しにくいので「ウオーク」等複数の発音を当てたりして対策しています。


Bolt側でCSV読込後に、認識ワード/対応コマンド(AotDictionary型)
を引数に C#側の音声認識開始関数を叩いています。

BoltのGraph変数(AotDictionary型)をC#から直接見に行くこともできそうでしたが、Bolt側でCSV読込完了後に取りにいかないと等々面倒だったので。
※少し前の記事での Start() 等の起動順序の話に関連。
 → https://note.com/maruton/n/n1282b893ea6b

ちなみに AotDictionary はBolt独自のDictionary型で、通常のDictionaryとは使い方が異なるようでした。この辺有益な情報がみつからず(Unity公式にエントリ程度は追加されていた)。

デバッガで見るとObject型の先に Key,Value が見えるのでどこかに型定義があってそれでキャストすればいいのでは?とは思いますが。

とりあえず短時間でなんとかしたかったので、AotDictionary の基底をさかのぼると ICollection が祖先にいたので適当にそこらのメンバでごにょごにょしました。

ちなみにC#側でCSVインポートしていないのは、そこをBoltでやってみたかったから、それだけです。











最近の話

暑いです。忙しいです。
仕事はUnityになったので、それはそれで良いのですが。


私事の3Dモデリングも7割くらい完成のとこでモチベがだだ下がりです。

音楽制作はIQ向上とモチベ向上に寄与するらしいですね。
なのでRoland System-1とかでツマミをグリグリして気晴らししてます(作曲してるとは言っていない)。
Plugout音源を買い足すなら Jupiter-Xm 買った方が?とか、ちょっと暑さでやられてきています(金銭感覚。
Eurobeatいいですね。
F,G,Amのコードだけでもそれっぽく聞こえるという不思議(作曲してるとは言っていない)。

某YouTuber動画を見てから「アコーディオン高いなぁ~でも面白そうだなぁ~」と谷口楽器のサイトを値段におののきながらまじまじ眺めていたり。
Roland のVアコーディオンがもう少し安ければ・・・でも安いのは20万だよね?(金銭感覚。


この記事が気に入ったらサポートをしてみませんか?