运行时错误中的“值不在预期范围内”是啥意思?

Posted

技术标签:

【中文标题】运行时错误中的“值不在预期范围内”是啥意思?【英文标题】:What does "Value does not fall within expected range" mean in runtime error?运行时错误中的“值不在预期范围内”是什么意思? 【发布时间】:2010-04-14 02:59:38 【问题描述】:

我正在使用 /clr 编写插件(dll 文件)并尝试使用 .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);
          
       
    ;

【问题讨论】:

异常的调用栈是什么? 调试器是您的朋友 - 加载它并找出哪一行导致您出现问题。不知道您的输入是什么以及您是如何传递它的,或者您的确切输出是什么,这很难提供帮助 @SLacks:对不起,我不明白你的问题,我是这种编程的新手。 @Romain:我无法使用调试器,因为我的项目没有生成 exe 文件。基本上,当我单击特定按钮时会调用 Initialize(),但即使在我开始说话之前,我也收到了这个错误。预期的输出是一个消息框,当我说“播放”时显示“播放”,当我说“停止”时显示“停止”。请帮帮我.. 使用 Visual Studio 附加到正在运行的进程(调试/附加到进程...),这样您就可以找出抛出异常的位置。或者,您可以捕获异常并显示堆栈跟踪。 【参考方案1】:

我想我知道是什么导致了这个错误。

错误发生在行

SpeechRecognitionEngine.SetInputToDefaultAudioDevice();

错误意味着输入设备的频道超出了可接受的频道范围。这是因为有时在 Windows XP 上输入设备有 0 个通道。这是调用时的错误返回,从而导致错误。这并不意味着麦克风不起作用。

您可以先将输入记录到 wav 文件中,然后从该 wav 文件中识别语音,如下所示:

SpeechRecognitionEngine.SetInputToWaveFile("input.wav");

我希望这可以为您解决问题。

【讨论】:

【参考方案2】:

您可能正在使用 Windows Pre-Vista (NT5)... 该错误是由于 SAPI 版本不是 5.3 或更高版本... 在 Windows 7 中测试代码,一切都应该运行正常...

您获得的“互操作”内容与本机代码和 .net 托管代码库之间的编组有关...

您可以在库中看到问题,第 299 到 325 行:Source code for the .NET framework in C#, RecognizerBase.cs source code in C# .NET。

【讨论】:

【参考方案3】:

几天前我在工作中遇到了这个错误。经过大量研究和调试后,我发现了以下内容:

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

特别是 Zach Barnard 的回答非常有帮助:

我可能已经找到了解决方案,尽管牺牲了 Alternates,我将 MaxAlternates 设置为 1,并且在运行程序两天后我没有出现异常。希望这对某人有所帮助。

诚然,我不完全理解为什么会抛出这个异常。但是,将 MaxAlternates 设置为 1 为您的 SpeechRecognitionEngine 对象会阻止它。

由于原始问题的作者从未说过实际问题是什么,这可能是一个解决方案,也可能不是。

【讨论】:

以上是关于运行时错误中的“值不在预期范围内”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

UWP StorageFile.CopyAsync() 引发错误:“值不在预期范围内。”

为啥 VsPerfAspNetCmd 会抛出错误“值不在预期范围内”?

Lync SDK 2013 - 加入会议抛出'价值不在预期范围内。'

将 MVC 视图转换为 HTML 字符串 - 错误“值不在预期范围内。”

Clickonce 下载更新 值不在预期范围内问题!

BackgroundTaskRegistration - 值不在预期范围内