0

当我尝试运行程序时,它会抛出这个错误:对象引用未设置为对象的实例。代码有问题吗?帮助!

private void InitSpeechRecognition()
        {

            _audioSource = new KinectAudioSource
            {
                FeatureMode = true,
                AutomaticGainControl = false,
                SystemMode = SystemMode.OptibeamArrayOnly
            };
            var ri =
              SpeechRecognitionEngine.InstalledRecognizers().
                Where(r => r.Id == RecognizerId).FirstOrDefault();
            _engine = new SpeechRecognitionEngine(ri.Id);
            var gb = new GrammarBuilder { Culture = new CultureInfo("en-US") };


            gb.Append(CommandMessage.Choices);


            var g = new Grammar(gb);
            _engine.LoadGrammar(g);
            _engine.SpeechRecognized += SreSpeechRecognized;

            _audioStream = _audioSource.Start();
            _engine.SetInputToAudioStream(_audioStream,
                                          new SpeechAudioFormatInfo(
                                          EncodingFormat.Pcm, 16000, 16, 1,
                                          32000, 2, null));
            _engine.RecognizeAsync(RecognizeMode.Multiple);
        }

        private void SreSpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {

            if (CommandMessage.Commands.ContainsKey(e.Result.Text))
            {
                Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal,
                  new Action(() =>
                    Messenger.Default.Send(
                       new CommandMessage { Command = CommandMessage.Commands[e.Result.Text] })));
            }
        }
4

1 回答 1

2
var ri = SpeechRecognitionEngine.InstalledRecognizers().
            Where(r => r.Id == RecognizerId).FirstOrDefault();

在这里,FirstOrDefault() 要么返回序列中的第一个对象,要么返回 null 如果未找到匹配项。然后在下一行中,您尝试访问对象的 Id 属性,该属性可能为空。

赋值后检查是否为空,如果它不为空,则仅使用 ri。例如

  if (ri != null)
  {
    ...
  } 

或者使用 First() 方法而不是 FirstOrDefault() 并用 try catch 块包围代码以处理序列为空时的情况。

但是你得到 null 的原因可能是真正的问题所在。ri 为空,因为没有安装的识别器 ID 为 RecognizerId。我没有看到你设置它的代码,所以看看那部分。

此外,请查看此页面上的示例,它可能包含您需要的内容:http: //msdn.microsoft.com/en-us/library/system.speech.recognition.speechrecognitionengine.installedrecognizers.aspx

于 2012-05-17T09:22:38.103 回答