Edited at

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();
}

}