2016-07-05 22 views
2

ホームオートメーションプロジェクトの一部として、ロックされたWindowsコンピュータで実行する必要がある音声認識プログラムを作成しようとしています。しかし、SpeechRecognitionEngineは、コンピュータがロックされているときに認識を停止しているように見えます(コンピュータがロックされていない状態でも継続します)。コンピュータがロックされているときにSpeechRecognitionEngineが認識を停止する

私の現在のテストプログラムは次のようになります。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Microsoft.Speech.Recognition; 
using System.Globalization; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     SpeechRecognitionEngine sre; 

     public Form1() 
     { 
      InitializeComponent(); 
      CultureInfo ci = new CultureInfo("en-us"); 
      sre = new SpeechRecognitionEngine(ci); 
      sre.SetInputToDefaultAudioDevice(); 
      GrammarBuilder gb = new GrammarBuilder("Hello"); 
      sre.LoadGrammarAsync(new Grammar(gb)); 
      sre.SpeechRecognized += sre_SpeechRecognized; 
      sre.RecognizeAsync(RecognizeMode.Multiple); 
     } 

     void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
     { 
      listBox1.Items.Add(DateTime.Now.ToString() + " " + e.Result.Text); 
     } 
    } 
} 

それはマイクのライブオーディオストリームにSpeechRecognitionEngine(おそらくSetInputToAudioStreamまたはSetInputToWaveStreamメソッドを使用して)の入力を変更することができます場合、私は思ったんだけどその方法で問題を回避してください。コンピューターが(SoundRecorderで試したときに)マイクがオフになっていないようです。

残念ながら、私はマイク入力のライブストリームを取得する方法を見つけることができませんでした。

+0

私はコンピュータが問題なくロックされながら記録するために、サウンドレコーダーを使用して試してみました。また、マイクをスピーカーにループするためにNAudioを使用する小さなプログラムを作成しました。これはコンピュータがロックされた状態でも機能します。残念ながら、NAudioにSpeechRecognitionEngineで使用できるストリームを提供する方法を見つけることができませんでした。だから、コンピュータがロックされているときにマイクが利用できるようです。そして、サービスの利用に関して、システムサービスはマイクとスピーカーにアクセスできないようです。 –

答えて

2

私は、このStackOverflowの答え(https://stackoverflow.com/a/11813276/2950065)からNAudio(http://naudio.codeplex.com/)とSpeechStreamerクラスを使用して回避策を見つけました。

更新されたテストプログラムは、それは、コンピュータがロックされたときに認識するために続けて次のようになります。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Microsoft.Speech.Recognition; 
using System.Globalization; 
using NAudio.Wave; 
using System.IO; 
using System.IO.Pipes; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     SpeechRecognitionEngine sre; 
     WaveIn wi; 
     SpeechStreamer ss; 

     public Form1() 
     { 
      InitializeComponent(); 

      WaveCallbackInfo callbackInfo = WaveCallbackInfo.FunctionCallback(); 
      wi = new WaveIn(callbackInfo); 
      ss = new SpeechStreamer(100000); 
      wi.DataAvailable += wi_DataAvailable; 
      wi.StartRecording(); 

      CultureInfo ci = new CultureInfo("en-us"); 
      sre = new SpeechRecognitionEngine(ci); 
      // The default format for WaveIn is 8000 samples/sec, 16 bit, 1 channel 
      Microsoft.Speech.AudioFormat.SpeechAudioFormatInfo safi = new Microsoft.Speech.AudioFormat.SpeechAudioFormatInfo(8000, Microsoft.Speech.AudioFormat.AudioBitsPerSample.Sixteen, Microsoft.Speech.AudioFormat.AudioChannel.Mono); 
      sre.SetInputToAudioStream(ss, safi); 
      GrammarBuilder gb = new GrammarBuilder("Hello"); 
      sre.LoadGrammarAsync(new Grammar(gb)); 
      sre.SpeechRecognized += sre_SpeechRecognized; 
      sre.RecognizeAsync(RecognizeMode.Multiple); 
     } 

     void wi_DataAvailable(object sender, WaveInEventArgs e) 
     { 
      ss.Write(e.Buffer, 0, e.BytesRecorded); 
     } 

     void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
     { 
      listBox1.Items.Add(DateTime.Now.ToString() + " " + e.Result.Text); 
     } 
    } 
} 
関連する問題