2017-07-11 1 views
1

Ich habe den Chatbot-Client mit Text ausgeführt, möchte ihn aber jetzt in Voice umwandeln, aber ich bin mir nicht sicher, wie ich den Stream vom Mikro für den Post bekommen kann. Für die Aufzeichnung von Audio Ich verwende NAudio aber, wenn der Speicherstrom zu senden erhalte ich eine Fehlermeldung,Lex Chatbot C# Client mit Stimme

System.IO.IOException: Kann nicht in der Nähe Strom, bis alle Bytes geschrieben sind.

Hier ist mein Code:

private void recordAudio() 
     { 
      if (memoryStream == null) 
       memoryStream = new MemoryStream(); 
      sourceStream = new NAudio.Wave.WaveIn(); 
      sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(16000, 1); 
      waveIn = new NAudio.Wave.WaveInProvider(sourceStream); 
      waveWriter = new WaveFileWriter(new IgnoreDisposeStream(memoryStream), waveIn.WaveFormat); 
      sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable); 
      buff = new BufferedWaveProvider(waveIn.WaveFormat); 
      sourceStream.StartRecording(); 
      mytimer.Enabled = true; 

     } 
     private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e) 
     { 
      buff.AddSamples(e.Buffer, 0, e.BytesRecorded); 

      Console.WriteLine("test"); 
     } 
      void mytimer_Tick(object sender, EventArgs e) 
     { 

      if (sourceStream != null) 
      { 
       sourceStream.StopRecording(); 
       waveWriter.Flush(); 



       var amazonLexClient = new AmazonLexClient(Amazon.RegionEndpoint.USEast1); 
       var amazonPostRequest = new Amazon.Lex.Model.PostContentRequest(); 
       var amazonPostResponse = new Amazon.Lex.Model.PostContentResponse(); 
       amazonPostRequest.BotAlias = "voiceBot"; 
       amazonPostRequest.BotName = "voiceBot"; 
       amazonPostRequest.ContentType = "audio/l16; rate=16000; channels=1"; 
       amazonPostRequest.UserId = "user"; 
       amazonPostRequest.InputStream = memoryStream; 
       amazonPostRequest.UserId = "test"; 
       try 
       { 
        amazonPostResponse = amazonLexClient.PostContent(amazonPostRequest); 
        Console.WriteLine("Got a response"); 
       } 

       catch (Exception w) 
       { 
        Console.WriteLine("{0} Exception caught.", e); 
        Console.WriteLine(w.Message); 
       } 
+0

versuchen, vorhandene Audiodateien zuerst zu veröffentlichen, dann aufzuzeichnen. –

+0

Mögliches Duplikat von [Der Stream kann nicht geschlossen werden, bis alle Bytes geschrieben wurden (GoodData API)] (https://stackoverflow.com/questions/19025834/cannot-close-stream-until-all-bytes-are-written-gooddata-api) –

Antwort