Help us understand the problem. What is going on with this article?

Unityで手っ取り早くマイクの音声を文字列にする

More than 1 year has passed since last update.

今のご時世でUnityでマイク入力を文字列に変換する方法を調べて、これが一番手っ取り早いかなぁ~と
Windows.Speechもやってみましたが動かないのでIntelRealsenseSDKになりました。
※IntelRealsenseのカメラがなくても動きます

1.IntelRealsenseSDKのダウンロード

IntelRealsenseSDKのページからFree DownloadでSDKをダウンロードします。
(ユーザ登録とか必要でめんどくさい)

その後、
e5b0a33c9c64a31e6dc577a04536ab3d.png

Intel RealSense SDK for WindowsのDwonloadボタンを押します。

c1668ccdc29d0c54dfd1c9c473261e72.png

どのバージョンとどのインストーラ―をダウンロードしますか?って聞かれるので
【2016 R2】でめんどくさいので【intel_rs_sdk_offline_package】をダウンロードしました。
(別にwebsetupでも良いかと思います)

2.IntelRealsenseSDKのインストール

ダウンロードしたインストーラーを実行します。
何をインストールしますか? 聞かれるので、Unity用のSDKと日本語解析するモジュールをインストールします。
具体的には

  • Intel RealSense SDK
    • Universal Windows Platform Extension
  • Intel RealSense SDK Runtime
    • Core (必ずチェックが入ってる)
  • Speech Recognition and Synthesis
    • Japanese
    • Speech Recognition and Synthesis

これだけ入れればOKです

1.png

2.png

チェック後、インストールを行います。

3.Unity上で必要なPackageを入れる

Unityで必要なPackageは以下のところにありますので
【C:\Program Files (x86)\Intel\RSSDK\framework\Unity\UnityCSharp.unitypackage】
パッケージをインポートします。
無題.png

4.サンプルコード

こんな感じのサンプルコードです。
適当なオブジェクトに貼り付けて実行です

VoiceInputTest.cs
using UnityEngine;

public class VoiceInputTest : MonoBehaviour
{
    private PXCMSession session;
    private PXCMAudioSource source;
    private PXCMSpeechRecognition sr;
    private PXCMSpeechRecognition.Handler handler;

    public void Start()
    {
        session = PXCMSession.CreateInstance();
        source = session.CreateAudioSource();

        PXCMAudioSource.DeviceInfo dinfo = null;

        source.QueryDeviceInfo(0, out dinfo);
        source.SetDevice(dinfo);
        Debug.Log(dinfo.name);

        session.CreateImpl<PXCMSpeechRecognition>(out sr);

        PXCMSpeechRecognition.ProfileInfo pinfo;
        sr.QueryProfile(out pinfo);
        pinfo.language = PXCMSpeechRecognition.LanguageType.LANGUAGE_JP_JAPANESE;
        sr.SetProfile(pinfo);

        handler = new PXCMSpeechRecognition.Handler();
        handler.onRecognition = (x) => Debug.Log(x.scores[0].sentence);
        sr.SetDictation();
        sr.StartRec(source, handler);
    }

    void OnDisable()
    {
        if (sr != null)
        {
            sr.StopRec();
            sr.Dispose();
        }

        if (session != null)
            session.Dispose();
    }

}

もし、複数マイクがある場合は
source.QueryDeviceInfo(0, out dinfo);
ここの0を1とか2とかして試してみてください

5.実行

実行してマイクでなにかしゃべるとコンソールに表示されます

c8e36cc51d8681936fe5952d52c8c5bc.png


うまくいかないパターン

  • マイクデバイスが違う
    • コンソールに出てくるマイクの名前を確認してください
  • LANGUAGE_JP_JAPANESEをLANGUAGE_US_ENGLISHにするとなんかコンソールに出る
    • SDKを一度removeして再度インストールしてみてください

サンプル2

よくわからないと言われたのでラムダ式を使わないパターンを想像で書いてみました
想像で書いたので違うかもしれません。
(Syntaxチェックすらしてません)

VoiceInputTest.cs
using UnityEngine;

public class VoiceInputTest : MonoBehaviour
{
    private PXCMSession session;
    private PXCMAudioSource source;
    private PXCMSpeechRecognition sr;
    private PXCMSpeechRecognition.Handler handler;

    private const string matchstr = "あああ";

    public void Start()
    {
        session = PXCMSession.CreateInstance();
        source = session.CreateAudioSource();

        PXCMAudioSource.DeviceInfo dinfo = null;

        source.QueryDeviceInfo(0, out dinfo);
        source.SetDevice(dinfo);
        Debug.Log(dinfo.name);

        session.CreateImpl<PXCMSpeechRecognition>(out sr);

        PXCMSpeechRecognition.ProfileInfo pinfo;
        sr.QueryProfile(out pinfo);
        pinfo.language = PXCMSpeechRecognition.LanguageType.LANGUAGE_JP_JAPANESE;
        sr.SetProfile(pinfo);

        handler = new PXCMSpeechRecognition.Handler();
        handler.onRecognition = OnRecognition;
        sr.SetDictation();
        sr.StartRec(source, handler);
    }

    private void OnRecognition(PXCMSpeechRecognition.RecognitionData data)
    {
        if(matchstr.Equals(data.scores[0].sentence)
        {
           Debug.Log("同じ文字");
        }else{
           Debug.Log("違う文字");
        }
    }

    void OnDisable()
    {
        if (sr != null)
        {
            sr.StopRec();
            sr.Dispose();
        }

        if (session != null)
            session.Dispose();
    }

}
miyumiyu
virtualcast
VRシステム(バーチャルキャスト)の開発、運営、企画
https://virtualcast.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした