LoginSignup
65
54

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-27

今のご時世で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();
    }

}
65
54
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
65
54