Что означает «Значение не попадает в ожидаемый диапазон» при ошибке времени выполнения? - PullRequest
1 голос
/ 14 апреля 2010

Я пишу плагин (файл dll) с помощью / clr и пытаюсь реализовать распознавание речи с помощью .NET. Но когда я запускаю его, я получаю ошибку во время выполнения, в которой говорится: «Значение не попадает в ожидаемый диапазон», что означает сообщение?

    public ref class Dialog : public System::Windows::Forms::Form
    {
       public: SpeechRecognitionEngine^ sre;

       private: System::Void btnSpeak_Click(System::Object^  sender, System::EventArgs^  e) 
       {
         Initialize();
       }

       protected: void Initialize()
       {  
          //create the recognition engine
          sre = gcnew SpeechRecognitionEngine();

          //set our recognition engine to use the default audio device
          sre->SetInputToDefaultAudioDevice();

          //create a new GrammarBuilder to specify which commands we want to use
          GrammarBuilder^ grammarBuilder = gcnew GrammarBuilder();

          //append all the choices we want for commands.
          //we want to be able to move, stop, quit the game, and check for the cake.
          grammarBuilder->Append(gcnew Choices("play", "stop"));

          //create the Grammar from th GrammarBuilder
          Grammar^ customGrammar = gcnew Grammar(grammarBuilder);

          //unload any grammars from the recognition engine
          sre->UnloadAllGrammars();

          //load our new Grammar
          sre->LoadGrammar(customGrammar);

          //add an event handler so we get events whenever the engine recognizes spoken commands
          sre->SpeechRecognized += gcnew EventHandler<SpeechRecognizedEventArgs^> (this, &Dialog::sre_SpeechRecognized);

          //set the recognition engine to keep running after recognizing a command.
              //if we had used RecognizeMode.Single, the engine would quite listening after
          //the first recognized command.
          sre->RecognizeAsync(RecognizeMode::Multiple);

          //this->init();
       }  

       void sre_SpeechRecognized(Object^ sender, SpeechRecognizedEventArgs^ e)
       {
          //simple check to see what the result of the recognition was
          if (e->Result->Text == "play")
          {
             MessageBox(plugin.hwndParent, L"play", 0, 0);
          }

                  if (e->Result->Text == "stop")
          {
             MessageBox(plugin.hwndParent, L"stop", 0, 0);
          }
       }
    };

Ответы [ 3 ]

0 голосов
/ 15 ноября 2013

Возможно, вы используете Windows Pre-Vista (NT5) ... Эта ошибка из-за версии SAPI не 5.3 или выше ... Протестируйте код в Windows 7, все должно работать нормально ...

«Взаимодействие», которое вы получаете, относится к распределению между собственным кодом и библиотеками управляемого кода .net ...

Вы можете увидеть проблему в библиотеке, строки с 299 по 325: Исходный код для .NET Framework в C #, RecognizerBase.cs исходный код в C # .NET .

0 голосов
/ 04 апреля 2018

Я столкнулся с этой ошибкой пару дней назад на работе. После тщательного изучения и отладки я обнаружил следующее:

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/fc9ba226-7170-49d8-9fb3-c8de05d5b542/systemspeechrecognition-exception-after-prolonged-use?forum=windowsgeneraldevelopmentissues

В частности, ответ от Зака ​​Барнарда очень полезен:

Возможно, я нашел решение этой проблемы, хотя, жертвуя альтернативами, я установил для MaxAlternates значение 1, и у меня не было исключения после запуска программы в течение двух дней. Надеюсь, это кому-нибудь поможет.

Правда, я не до конца понимаю, почему выбрасывается это исключение. Однако установка MaxAlternates на 1 для объекта SpeechRecognitionEngine предотвращает это.

Поскольку автор первоначального вопроса никогда не говорил, что это за проблема, это может быть решение или нет.

0 голосов
/ 12 июля 2013

Мне кажется, я знаю, что вызывает эту ошибку.

Ошибка происходит на линии

SpeechRecognitionEngine.SetInputToDefaultAudioDevice();

Ошибка означает, что каналы устройства ввода находятся вне диапазона принятых каналов. Это потому, что иногда в Windows XP устройство ввода имеет 0 каналов. Это неверный возврат при вызове, что приводит к ошибке. Это не значит, что микрофон не работает.

Что вы можете сделать - это сначала записать ввод в файл wav, а затем распознать речь из этого файла wav, например:

SpeechRecognitionEngine.SetInputToWaveFile("input.wav");

Надеюсь, это решит проблему для вас.

...