今のご時世でUnityでマイク入力を文字列に変換する方法を調べて、これが一番手っ取り早いかなぁ~と
Windows.Speechもやってみましたが動かないのでIntelRealsenseSDKになりました。
※IntelRealsenseのカメラがなくても動きます
1.IntelRealsenseSDKのダウンロード
IntelRealsenseSDKのページからFree DownloadでSDKをダウンロードします。
(ユーザ登録とか必要でめんどくさい)
Intel RealSense SDK for WindowsのDwonloadボタンを押します。
どのバージョンとどのインストーラ―をダウンロードしますか?って聞かれるので
【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です
チェック後、インストールを行います。
3.Unity上で必要なPackageを入れる
Unityで必要なPackageは以下のところにありますので
【C:\Program Files (x86)\Intel\RSSDK\framework\Unity\UnityCSharp.unitypackage】
パッケージをインポートします。
4.サンプルコード
こんな感じのサンプルコードです。
適当なオブジェクトに貼り付けて実行です
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.実行
実行してマイクでなにかしゃべるとコンソールに表示されます
うまくいかないパターン
- マイクデバイスが違う
- コンソールに出てくるマイクの名前を確認してください
- LANGUAGE_JP_JAPANESEをLANGUAGE_US_ENGLISHにするとなんかコンソールに出る
- SDKを一度removeして再度インストールしてみてください
サンプル2
よくわからないと言われたのでラムダ式を使わないパターンを想像で書いてみました
想像で書いたので違うかもしれません。
(Syntaxチェックすらしてません)
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();
}
}