当我尝试运行该程序时,它会抛出此错误:对象引用未设置为对象的实例。代码有问题吗?救命啊!
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] })));
}
}
答案 0 :(得分:2)
var ri = SpeechRecognitionEngine.InstalledRecognizers().
Where(r => r.Id == RecognizerId).FirstOrDefault();
这里,FirstOrDefault()返回序列中的第一个对象,如果找不到匹配则返回null。 然后在下一行中,您尝试访问对象的Id属性,该属性可能为null。
在赋值后执行null检查,如果它不为null,则仅使用ri。 E.g。
if (ri != null)
{
...
}
或者使用First()方法代替FirstOrDefault()并使用try catch块包围代码以处理序列为空时的情况。
但是你得到null的原因可能就是真正的问题所在。 ri为null,因为没有安装ID为RecognizerId的识别器。我没有看到你设置它的代码,所以环顾那一部分。
另外,请看一下此页面上的示例,它可能只包含您需要的内容:http://msdn.microsoft.com/en-us/library/system.speech.recognition.speechrecognitionengine.installedrecognizers.aspx