つまり、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 { /// <summary> /// . /// </summary> public class MicSelector : IDisposable { #region private SpeechLib.SpInProcRecoContext _siprc; private SpeechLib.ISpeechObjectTokens _isot; private SpeechLib.SpObjectToken _sot; private bool _isDisposed; #endregion #region /// <summary> /// . /// </summary> public MicSelector() { _siprc = new SpeechLib.SpInProcRecoContext(); _isot = _siprc.Recognizer.GetAudioInputs(null, null); _sot = null; } #endregion #region /// <summary> /// . /// </summary> public SpeechLib.ISpeechObjectTokens Isot { get { return _isot; } } #endregion #region /// <summary> /// . /// </summary> /// <param name="name"> .</param> /// <param name="sre"> .</param> 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); if (fi != null) { object sapiRecognizer = fi.GetValue(sre); MethodInfo mi = sapiRecognizer.GetType().GetMethod("SetInput", BindingFlags.Instance | BindingFlags.NonPublic); object[] parms = { _sot, true }; mi.Invoke(sapiRecognizer, parms); } } } } /// <summary> /// . /// </summary> /// <param name="name"> .</param> /// <param name="sre"> .</param> public void SetMicByName(string name, ref Microsoft.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); if (fi != null) { object sapiRecognizer = fi.GetValue(sre); MethodInfo mi = sapiRecognizer.GetType().GetMethod("SetInput", BindingFlags.Instance | BindingFlags.NonPublic); object[] parms = { _sot, true }; mi.Invoke(sapiRecognizer, parms); } } } } /// <summary> /// . /// </summary> /// <returns> .</returns> public SpeechLib.ISpeechObjectTokens UpdateDeviceList() { if (_siprc != null) { _isot = _siprc.Recognizer.GetAudioInputs(null, null); return _isot; } return null; } /// <summary> /// . /// </summary> public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion #region /// <summary> /// . /// </summary> protected virtual void Dispose(bool disposing) { if (!_isDisposed) { if (disposing) { _sot = null; _isot = null; _siprc = null; } _isDisposed = true; } } /// <summary> /// . /// </summary> /// <param name="name"> .</param> /// <returns> .</returns> 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); if (desc.Contains(name)) { break; } } return _sot; } return null; } #endregion } }