2015-04-02 5 views
1

Использование SAPI MSDN, как вы отменяете операцию синхронного распознавания речи или, по крайней мере, останавливаете ее немедленно?Cancel Синхронное распознавание речи

Установка ввода в null возвращает ошибку, говорящую, что я не могу этого сделать, пока распознаватель распознает, и использование асинхронного распознавания не является вариантом.

Вот пример ниже

class MainClass { 

    static void Main() { 
      SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(); 
      recognizer.LoadGrammar(new DictationGrammar()); 
      recognizer.SetInputToDefaultAudioDevice(); 
      recognizer.Recognize(); 
    } 

    void MethodCalledFromOtherThread() { 
      //Since SpeechRecognitionEngine.Recognize() stops the current thread, 
      //this method is called from a different thread. 
      //I NEED the current thread to stop. 

      //Here I want to Cancel recognizer.Recognize  
     } 
} 
+1

Вы _might_ быть в состоянии достать исходный поток и бросить исключение на него, но [этот вопрос] (http://stackoverflow.com/questions/44656/is-there-a-good- method-in-c-sharp-for-throwing-the-exception-on-a-given-thread) объясняет, почему вы не должны этого делать. Можете ли вы объяснить, почему параметр async не работает для вас, учитывая, что у него есть специальный метод отмены? –

+0

@JamesThorpe Как мое приложение работает и настроено, операция Async будет стоить дорогостоящим с точки зрения производительности. – JackBarn

+0

По своей природе вы не можете отменить синхронизацию. Есть ли версия функций Beginxxx, Endxxx, которые вы могли бы использовать? –

ответ

3

Это MSDN article показывает, как использовать SAPI асинхронно без резьбы и с этим вы можете отменить операцию в любое время.

Вот очень простой пример того, как рано прекратить распознавание.

class Program 
{ 
    private static bool _userRequestedAbort = false; 

    // Indicate whether asynchronous recognition is complete. 

    static void Main(string[] args) 
    { 
     // Create an in-process speech recognizer. 
     using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new CultureInfo("en-US"))) 
     { 
      // Create a grammar for choosing cities for a flight. 
      Choices cities = new Choices(new string[] { "Los Angeles", "New York", "Chicago", "San Francisco", "Miami", "Dallas" }); 

      GrammarBuilder gb = new GrammarBuilder(); 
      gb.Append("I want to fly from"); 
      gb.Append(cities); 
      gb.Append("to"); 
      gb.Append(cities); 

      // Construct a Grammar object and load it to the recognizer. 
      Grammar cityChooser = new Grammar(gb); 
      cityChooser.Name = ("City Chooser"); 
      recognizer.LoadGrammarAsync(cityChooser); 

      bool completed = false; 

      // Attach event handlers. 
      recognizer.RecognizeCompleted += (o, e) => 
      { 
       if (e.Error != null) 
       { 
        Console.WriteLine("Error occurred during recognition: {0}", e.Error); 
       } 
       else if (e.InitialSilenceTimeout) 
       { 
        Console.WriteLine("Detected silence"); 
       } 
       else if (e.BabbleTimeout) 
       { 
        Console.WriteLine("Detected babbling"); 
       } 
       else if (e.InputStreamEnded) 
       { 
        Console.WriteLine("Input stream ended early"); 
       } 
       else if (e.Result != null) 
       { 
        Console.WriteLine("Grammar = {0}; Text = {1}; Confidence = {2}", e.Result.Grammar.Name, e.Result.Text, e.Result.Confidence); 
       } 
       else 
       { 
        Console.WriteLine("No result"); 
       } 

       completed = true; 
      }; 

      // Assign input to the recognizer and start an asynchronous 
      // recognition operation. 
      recognizer.SetInputToDefaultAudioDevice(); 

      Console.WriteLine("Starting asynchronous recognition..."); 
      recognizer.RecognizeAsync(); 

      // Wait for the operation to complete. 
      while (!completed) 
      { 
       if (_userRequestedAbort) 
       { 
        recognizer.RecognizeAsyncCancel(); 
        break; 
       } 

       Thread.Sleep(333); 
      } 

      Console.WriteLine("Done."); 
     } 

     Console.WriteLine(); 
     Console.WriteLine("Press any key to exit..."); 
     Console.ReadKey(); 
    } 
} 
+1

Недостаточно ответов только на Linkupflow. – Sildoreth

+1

Хорошо, я добавлю некоторое значение в ближайшее время и не просто вырезаю и вставляю –

+0

Не будет «Thread.Sleep» остановить распознаватель речи – JackBarn

Смежные вопросы