2

/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);
          }
       }
    };
4

3 に答える 3

1

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 .

于 2013-11-14T23:04:53.160 に答える
1

このエラーの原因はわかっていると思います。

エラーは行で発生します

SpeechRecognitionEngine.SetInputToDefaultAudioDevice();

このエラーは、入力デバイスのチャネルが受け入れられるチャネルの範囲外であることを意味します。これは、Windows XP では入力デバイスのチャンネルが 0 である場合があるためです。これは、呼び出されたときに誤って返されるため、エラーにつながります。これは、マイクが機能しないという意味ではありません。

できることは、最初に入力を wav ファイルに記録し、次にその wav ファイルから音声を認識することです。次のようにします。

SpeechRecognitionEngine.SetInputToWaveFile("input.wav");

これで問題が解決することを願っています。

于 2013-07-12T13:31:17.083 に答える