前提・実現したいこと
Unityで作ったカスタムシェーダをOculusQuest2のマイクを使った音声認識を使って動かしたい
具体的にはヘッドセットをつけた状態で、声を発すると
声を出したポジションからシェーダーが実行されるようにしたいです。
(言葉で反応するのではなく単純に音を拾ってイベントを発生させたいのですが
ネットで調べても音声入力についてしか無く、困っています…
Unity初心者で拙い質問申し訳ないのですが、どうしても実現したく、
アドバイスくださると嬉しいです…)
参考サイト
↑こちらのサイトを参考にエコロケーションシェーダを作りました。
](dcd78c9cda8bb1b4843b02e33c82f3d8.png)
カスタムシェーダ
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/Echolocation" { Properties { _Color ("Color", Color) = (1, 1, 1, 1) _Center ("CenterX", vector) = (0, 0, 0) _Radius ("Radius", float) = 0 } SubShader { Pass { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float4 _Color; float3 _Center; float _Radius; struct v2f { float4 pos : SV_POSITION; float3 worldPos : TEXCOORD1; }; v2f vert(appdata_base v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; return o; } fixed4 frag(v2f i) : COLOR { float dist = distance(_Center, i.worldPos); float val = 1 - step(dist, _Radius - 0.1) * 0.5; val = step(_Radius - 1.5, dist) * step(dist, _Radius) * val; return fixed4(val * _Color.r, val * _Color.g,val * _Color.b, 1.0); } ENDCG } } FallBack "Diffuse" }
C# コントローラー
C#
1using UnityEngine; 2 3public class EcholocationController : MonoBehaviour 4{ 5 private static readonly int Center = Shader.PropertyToID("_Center"); 6 private static readonly int Radius = Shader.PropertyToID("_Radius"); 7 8 // ここにインスペクター上でEcholocationマテリアルをセットしておく 9 [SerializeField] private Material material; 10 11 // 半径が大きくなるスピード 12 [SerializeField][Min(0.0f)] private float speed = 5.0f; 13 14 // 現在の半径 15 private float radius; 16 17 // 半径の初期値は無限大としておく 18 private void OnEnable() 19 { 20 this.radius = Mathf.Infinity; 21 } 22 23 // 毎フレーム半径のセットおよび拡張を行う 24 private void Update() 25 { 26 this.material.SetFloat(Radius, this.radius); 27 this.radius += this.speed * Time.deltaTime; 28 } 29 30 // 他のスクリプトからEmitCallを実行することで 31 // 中心点を設定し、半径を0にリセットする 32 public void EmitCall(Vector3 position) 33 { 34 this.radius = 0.0f; 35 this.material.SetVector(Center, position); 36 } 37}
C# クリックでの呼び出し
C#
1using UnityEngine; 2 3[RequireComponent(typeof(EcholocationController))] 4public class EcholocationTest : MonoBehaviour 5{ 6 private EcholocationController controller; 7 private Camera mainCamera; 8 9 private void Start() 10 { 11 this.mainCamera = Camera.main; 12 this.controller = this.GetComponent<EcholocationController>(); 13 } 14 15 private void Update() 16 { 17 if (Input.GetMouseButtonDown(0) && Physics.Raycast(this.mainCamera.ScreenPointToRay(Input.mousePosition), out var hitInfo)) 18 { 19 this.controller.EmitCall(hitInfo.point); 20 } 21 } 22} 23}
経緯・試したこと
1.シーンを制作
2.こちらのサイトで質問し、別途C#スクリプトを用い、パソコン画面上でクリックしてシェーダーを動かすことに成功
3.OculusQuestで実装するためOculus Integrationをインストール
4.OculusQuest2にビルド→ビルド自体は成功
追記・
5.Azure Cognitive Services - Speech Serviceインストール
Speech SDK のインストール
↑こちらのサイトを参考にしました。
6.Input.GetMouseButtonDown(0)の部分を音声認識にしたらいいのかと思うが、どうしたらいいのかわからない
7.とりあえずマイクから認識するAudioConfigをC#スクリプトで作ってみる
マイクから認識する
↑こちらを参考にしました。
C# マイクから認識する
C#
1using System; 2using System.IO; 3using System.Threading.Tasks; 4using Microsoft.CognitiveServices.Speech; 5using Microsoft.CognitiveServices.Speech.Audio; 6 7class Program 8{ 9 async static Task FromMic(SpeechConfig speechConfig) 10 { 11 using var audioConfig = AudioConfig.FromDefaultMicrophoneInput(); 12 using var recognizer = new SpeechRecognizer(speechConfig, audioConfig); 13 14 Console.WriteLine("Speak into your microphone."); 15 var result = await recognizer.RecognizeOnceAsync(); 16 Console.WriteLine($"RECOGNIZED: Text={result.Text}"); 17 } 18 19 async static Task Main(string[] args) 20 { 21 var speechConfig = SpeechConfig.FromSubscription("<paste-your-subscription-key>", "<paste-your-region>"); 22 await FromMic(speechConfig); 23 } 24}
補足情報(FW/ツールのバージョンなど)
Oculus Integration
MacOS BigSur バージョン11.2.3
unityバージョン2021.1.15fi
ヘッドセット・ OculusQuest2
音声認識API・ Azure Cognitive Services - Speech Service
よろしくお願いいたします
追記・
Azure Cognitive Services - Speech Serviceという音声認識APIをいれてみましたが
導入の仕方がわからずまたしてもつまっています…。
あなたの回答
tips
プレビュー