音声を認識し、テキストに変換して処理する必要に直面している人もいます。 この問題は何度も説明されており、その解決方法はGoogleが支援できるようにするためですが、私は個人的な問題を経験しました。つまり、「デフォルトで」インストールされていないマイクから音声認識を行う方法です。 同様の問題も発生した場合は、この記事が役立ちます。
つまり、Microsoft Windowsには音声認識用の2つの異なるエンジン(標準およびMicrosoft Speech SDK 11)があり、すぐにロシア語がサポートするのはそのうちの1つ、つまりロシア語がインストールされたMicrosoft Speech SDK 11だけであると言えます。 両方のエンジンのドキュメントを注意深く読むと、デバイスとして選択できるのはDefaultInputDeviceだけですが、より深く掘り下げる、つまりTelerik JustDecompileデコンパイラでアセンブリを開くと、すべてのクラスがCOMオブジェクトの単なるラッパーであり、必要なCOMオブジェクトだけであることがわかります機能です。 当然、すべてのプログラマーと同様に、私は怠け者であり、COMを使用したくないので、2つのソリューションを組み合わせます。 したがって、最初に必要なことは、これに必要なマイクのトークンを見つけることです。次の関数が存在します。
private SpeechLib.SpObjectToken FindMicByName(string name) { if (isot != null) { for (int i = 0; i < isot.Count; i++) { sot = isot.Item(i); string desc = sot.GetDescription(1033); string id = sot.Id; if (desc.Contains(name) != false) { break; } } return sot; } else return null; }
Tokenを取得した後、次の関数を使用して、認識エンジンクラスのプライベートメソッドを呼び出す必要があります。
public void SetMicByName(string name, ref System.Speech.Recognition.SpeechRecognitionEngine sre) { if (isot != null) { sre.SetInputToDefaultAudioDevice(); sot = FindMicByName(name); if (sot != null) { FieldInfo fi = sre.GetType().GetField("_sapiRecognizer", BindingFlags.Instance | BindingFlags.NonPublic); object _sapiRecognizer = fi.GetValue(sre); MethodInfo mi = _sapiRecognizer.GetType().GetMethod("SetInput", BindingFlags.Instance | BindingFlags.NonPublic); object[] parms = new object[] { sot, true }; mi.Invoke(_sapiRecognizer, parms); } } }
最後に、私の開発で使用されている補助クラスの全文を提供します。完全にまたは部分的に使用するか、必要なコードスニペットを自分で挿入することができます。 これらはすべてWindows 7、8、8.1、NET 4.0、4.5でテストされていますが、他のバージョンでも動作すると思います。
using System; using System.Reflection; namespace RMI.SmartHouse.Service {