从内存流中读取时,Naudio和Syn语音为空引用错误

时间:2016-09-13 02:11:44

标签: c# naudio memorystream

我很确定我做得对,但我似乎无法弄清楚导致此错误的原因或解决方法。任何帮助,将不胜感激。代码如下,错误如下。

代码。我发布了所有内容,因为我不知道这个错误的相关内容。

    public class voiceStuff
  {
    public WaveInEvent waveInStream;
    private static StreamSpeechRecognizer _recognizer;
    WaveFileWriter writer;
    private MemoryStream mem;
    public void record()
    {

      waveInStream.NumberOfBuffers = 2;
      waveInStream.StartRecording();
      recognize();
    }

    public void recognize()
    {
      Console.ReadKey();
      waveInStream.StopRecording();
    }

    public voiceStuff()
    {
      Logger.LogReceived += Logger_LogReceived;
      waveInStream = new WaveInEvent();
      waveInStream.NumberOfBuffers =2;
      waveInStream.WaveFormat = new WaveFormat(16000, 1);
      mem = new MemoryStream();
      writer = new WaveFileWriter(mem, waveInStream.WaveFormat);
      waveInStream.DataAvailable += onDataAvailable;
      var modelPath = Path.Combine(Directory.GetCurrentDirectory(), "model/en-us");
      var dictionaryPath = Path.Combine(modelPath, "cmudict-en-us.dict");
      var languageModelPath = Path.Combine(modelPath, "en-us.lm.dmp");
      var configuration = new Configuration
      {
        AcousticModelPath = modelPath,
        DictionaryPath = dictionaryPath,
        LanguageModelPath = languageModelPath,
        UseGrammar = true,
        GrammarPath = "Models",
        GrammarName = "hello"
      };
      _recognizer = new StreamSpeechRecognizer(configuration);
      waveInStream.StartRecording();
      Console.ReadKey();
      waveInStream.StopRecording();
      Thread.Sleep(50);

      _recognizer.StartRecognition(mem, new TimeFrame(mem.Length));
      SpeechResult result = _recognizer.GetResult();
      _recognizer.StopRecognition();
      Console.WriteLine("result: " + result?.GetHypothesis());

      //syn speech
    }

    public void onDataAvailable(object sender, WaveInEventArgs e)
    {
      writer.Write(e.Buffer, 0, e.BytesRecorded);

    }
    static void Logger_LogReceived(object sender, LogReceivedEventArgs e)
    {
          Console.WriteLine(e.Message);
        }
      }

错误

     9/12/2016 9:55:42 PM Error StreamSpeechRecognizer System.NullReferenceException: Object reference not set to an instance of an object.
       at Syn.Speech.Linguist.Dictionary.TextDictionary.Allocate()
       at Syn.Speech.Linguist.Language.Grammar.Grammar.Allocate()
       at Syn.Speech.Linguist.Flat.FlatLinguist.Allocate()
       at Syn.Speech.Decoders.Search.SimpleBreadthFirstSearchManager.Allocate()
       at Syn.Speech.Recognizers.Recognizer.Allocate()
       at Syn.Speech.Api.StreamSpeechRecognizer.StartRecognition(Stream stream, TimeFrame timeFrame)
    9/12/2016 9:55:42 PM Error StreamSpeechRecognizer Syn.Speech.Helper.IllegalStateException: Expected state Ready actual state Allocating
       at Syn.Speech.Recognizers.Recognizer.CheckState(State desiredState)
       at Syn.Speech.Recognizers.Recognizer.Recognize(String referenceText)
       at Syn.Speech.Api.AbstractSpeechRecognizer.GetResult()
    9/12/2016 9:55:42 PM Error StreamSpeechRecognizer Syn.Speech.Helper.IllegalStateException: Expected state Ready actual state Allocating
       at Syn.Speech.Recognizers.Recognizer.CheckState(State desiredState)
       at Syn.Speech.Recognizers.Recognizer.Deallocate()
       at Syn.Speech.Api.StreamSpeechRecognizer.StopRecognition()

1 个答案:

答案 0 :(得分:0)

至少,您需要Dispose WaveFileWriter来完成WAV文件结构。但是,请注意处理内存流。我通常将它包装在NAudio的实用程序类IgnoreDisposeStream

然后,您需要将MemoryStream倒回到开头,然后再将其传递给语音识别。