新規トピックを開始
回答済み

STYLYで音声認識はできますか

実現したいこと
声を発するとUnity#Cスクリプトを実行したい

https://baba-s.hatenablog.com/entry/2018/10/04/130000
↑のサイトのカスタムシェーダを#Cスクリプトを書き

クリックでシェーダを実行するようにしているところを

声を発するとシェーダを実行するようにしたいです。

STYLYでは実装可能でしょうか…?


現在使っている#Cスクリプト


#Cスクリプト コントローラー

image



#Cスクリプト クリックで実行

image



使用ツールなど

Oculus Quest 2
unityバージョン2019.3.6fi
MacOS BigSur バージョン11.2.3


初心者で拙い質問で申し訳ないのですが、

回答お待ちしております…


最も良い回答

返信ありがとうございます。


状況としては、スクリプトからシェーダーを動かすことはできるが、デバイスの位置がわからないため中心の座標がわからない、という状態でしょうか。


デバイスの位置を取得するだけであれば、Main Cameraがそのままデバイスの位置になっているため、MaicCameraの座標を取得すればデバイスの位置も取得できるはずです。


添付の画像はMainCameraの子オブジェクトにCubeを置いて顔を動かしたものです。MainCameraとデバイスの位置が同期されていることがわかるかと思います。


もし、わからないことがあればまた質問ください。



image


image


コメント数: 3Sorted by 古い順

ご質問ありがとうございます。


STYLYでは一部のアセットを除き、標準以外のC#スクリプトを利用することはできません。ですので、ロジックを追加するには、PlayMakerというアセットもしくはSTYLY Intaraction SDK をご利用ください。


以下の画像は、PlayMakerを使ってEcholocationシェーダーを動かす場合の一例です。


音声による入力については、PlayMakerが対応しているか現在調査中ですので、もうしばらくお待ちください。

STYLYが対応している機能については、STYLY Documentに載っていますので合わせてご確認ください。

image


image


image


ご回答ありがとうございます…!

音声認識は難しいとのこと、確認いたしました。

具体的に実現したいことは


1.ヘッドセットを付けた状態で声を発する

2.声を発した位置(ヘッドセットの位置など)からShaderが実行される

です。

 現段階ではこのようなスクリプトを書いてみております…

using UnityEngine;
using System.Linq;

[RequireComponent(typeof(EcholocationController))]
public class EcholocationTest : MonoBehaviour
{
    private EcholocationController controller;
    private Camera mainCamera;
    private AudioSource aud;

    private void Start() {
      this.mainCamera = Camera.main;
      this.controller = this.GetComponent<EcholocationController>();

      aud = GetComponent<AudioSource>();
      aud.clip = Microphone.Start(null, true, 999, 44100);
      // マイクからのAudio-InをAudioSourceに流す
      aud.loop = true;
      // ループ再生にしておく
      while (!(Microphone.GetPosition("") > 0)){}
      // マイクが取れるまで待つ。空文字でデフォルトのマイクを探してくれる
      aud.Play();
      // 再生する
    }

private void Update() {
      float vol = GetAveragedVolume(aud);

      // Camera cam;
      // cam = Camera.main;


      var cameraForward = Camera.main.transform.rotation;
      Debug.Log(cameraForward);

      if ( vol > 0.03 ) {
      Debug. Log(cameraForward);
      this.controller.EmitCall(cameraForward);
      }
      
      
//        if (volume >= 0.1f  && Physics.Raycast(this.mainCamera.ScreenPointToRay(Input.mousePosition), out var hitInfo))
//        {
//            this.controller.EmitCall(hitInfo.point);
//        }
    }

    float GetAveragedVolume(AudioSource audio) {
      float[] data = new float[256];
      float a = 0;
      audio.GetOutputData( data, 0 );
      foreach (float s in data) { a += Mathf.Abs(s); }
      return a/256.0f;
    }
}

 

Unityから直接Oculusにビルドしてみているのですが
(STYLY質問フォームなのに、すいません…)
しかしながら、ヘッドセット=カメラの位置に追従して実行させる方法がわからず

結局詰まっております…


なにかいい方法がありましたら、アドバイスいただけると幸いです。

答え

返信ありがとうございます。


状況としては、スクリプトからシェーダーを動かすことはできるが、デバイスの位置がわからないため中心の座標がわからない、という状態でしょうか。


デバイスの位置を取得するだけであれば、Main Cameraがそのままデバイスの位置になっているため、MaicCameraの座標を取得すればデバイスの位置も取得できるはずです。


添付の画像はMainCameraの子オブジェクトにCubeを置いて顔を動かしたものです。MainCameraとデバイスの位置が同期されていることがわかるかと思います。


もし、わからないことがあればまた質問ください。



image


image


ログイン 又は 登録 コメント投稿のため