2014-03-04 7 views
6

Ich versuche, Text in C# mithilfe der Microsoft Speech-Objektbibliothek in Audio zu konvertieren. Ich habe dies erfolgreich gemacht, wenn ich das Audio direkt in eine WAV-Datei speicherte, aber mein Hauptziel ist es, das Audio in einem Byte-Array zu speichern, das ich dann in die Antwort in asp.net schreiben kann (damit der Endbenutzer es herunterladen kann) ihre Maschine).Wie wav Byte-Array zu Antwort mit Microsoft Speech Object Library schreiben?

Wenn ich versuche, die WAV-Datei zu öffnen, die auf die heruntergeladene Antwort geschrieben wurde, wird nichts abgespielt und es wird ein Fehler angezeigt, wie Windows Media Player die Datei nicht öffnen kann.

Der folgende Code zeigt, was ich arbeite und was nicht.

Hat jemand irgendwelche Ideen von dem, was ich im zweiten Teil fehlen kann, wenn ich nur versuche, das Byte-Array als WAV in die Antwort zu schreiben?

 //////////////////////////////////////////////// 
     // THIS WORKS 
     //SpVoice my_Voice = new SpVoice();     //declaring and initializing SpVoice Class 
     //SpeechVoiceSpeakFlags my_Spflag = SpeechVoiceSpeakFlags.SVSFlagsAsync; // declaring and initializing Speech Voice Flags 

     //SpFileStream spFileStream = new SpFileStream();  //declaring and Initializing fileStream obj 
     //SpeechStreamFileMode spFileMode = SpeechStreamFileMode.SSFMCreateForWrite; //declaring fileStreamMode as to Create or Write 
     //spFileStream.Open("C:\\temp\\hellosample.wav", spFileMode, false); 
     //my_Voice.AudioOutputStream = spFileStream; 
     //my_Voice.Speak("test text to audio in asp.net", my_Spflag); 
     //my_Voice.WaitUntilDone(-1); 
     //spFileStream.Close(); 
     //////////////////////////////////////////////// 

     //////////////////////////////////////////////// 
     // THIS DOES NOT WORK 
     SpVoice my_Voice = new SpVoice();     //declaring and initializing SpVoice Class 
     SpeechVoiceSpeakFlags my_Spflag = SpeechVoiceSpeakFlags.SVSFlagsAsync; // declaring and initializing Speech Voice Flags 

     SpMemoryStream spMemStream = new SpMemoryStream(); 
     spMemStream.Format.Type = SpeechAudioFormatType.SAFT11kHz8BitMono; 
     object buf = new object(); 
     my_Voice.AudioOutputStream = spMemStream; 
     my_Voice.Speak("test text to audio!", my_Spflag); 
     my_Voice.WaitUntilDone(-1); 
     spMemStream.Seek(0, SpeechStreamSeekPositionType.SSSPTRelativeToStart); 
     buf = spMemStream.GetData(); 
     byte[] byteArray = (byte[])buf; 
     Response.Clear(); 
     Response.ContentType = "audio/wav"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=mergedoutput.wav"); 
     Response.BinaryWrite(byteArray); 
     Response.Flush(); 
     //////////////////////////////////////////////// 

Antwort

3

Ich möchte, dass Sie die SpeechSynthesizer Klasse in der System.Speech Versammlung statt Microsoft Speech-Objektbibliothek verwenden, empfehlen, da die Montage in .NET-Bibliotheken enthalten ist.

Ich poste ein Beispiel unten, um zu erklären, wie Sie Ihr Problem mit der SpeechSynthesizer Klasse lösen, die auf ASP.NET MVC gemacht wird. Ich hoffe, dies löst Ihr Problem.

public class HomeController : Controller 
{ 
    public async Task<ActionResult> Index() 
    { 
     Task<FileContentResult> task = Task.Run(() => 
     { 
      using (var synth = new SpeechSynthesizer()) 
      using (var stream = new MemoryStream()) 
      { 
       synth.SetOutputToWaveStream(stream); 
       synth.Speak("test text to audio!"); 
       byte[] bytes = stream.GetBuffer(); 
       return File(bytes, "audio/x-wav"); 
      } 
     }); 

     return await task; 
    } 
} 
+0

Ich denke, ich würde eine Lösung nur mit Sapi brauchen ... Haben Sie eins damit? – Yashasvi

+0

Sie meinen, dass Sie Microsoft Speech Object Library verwenden sollten? Wenn ja, kann ich fragen, warum es so ist? –

+0

bietet der Sprachsynthesizer eine asynchrone Möglichkeit, den gesuchten Text zurückzugeben? – Yashasvi

1

Ich erreichte es mit dem ISpStream. Verwenden Sie die Setbasestream-Funktion des ispstream, um sie an einen istream zu binden, und setzen Sie dann die Ausgabe von ispvoice auf diesen ispstream.

Hier ist meine Lösung, wenn jemand es will:

https://github.com/itsyash/MS-SAPI-demo

1

ich den Microsoft-Übersetzer-Dienst beendet und diese .net lib (http://translatorservice.codeplex.com/) um eine Verbindung herzustellen. Funktioniert super. Code unten:

 // Connect to translator service 
     SpeechSynthesizer speech = new SpeechSynthesizer("clientID", "secretKey"); 
     speech.AudioFormat = SpeakStreamFormat.MP3; 
     speechStream = speech.GetSpeakStream(text, language); 

     // Write it out to the stream 
     Response.Clear(); 
     Response.ContentType = "audio/mp3"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName + ""); 
     speechStream.CopyTo(Response.OutputStream); 
     Response.Flush();