2017-05-04 2 views
3

Ich verwende Microsoft Speech Synthesis und möchte die Ausgabe an das Audio-Ausgabegerät meiner Wahl umleiten.Senden Sie Speech.Synthesizer an ein bestimmtes Gerät

Bisher habe ich den folgenden Code:

SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(); 
speechSynthesizer.SpeakAsync("Yea it works!"); 

Derzeit verwende ich:

speechSynthesizer.SetOutputToDefaultAudioDevice(); 

aber ich möchte eigentlich auf das Gerät meiner Wahl senden. Ich suche ein cscore-Beispiel, um das Ausgabegerät meiner Wahl zu steuern. Ich sehe, dass ich verwenden kann:

speechSynthesizer.SetOutputToWaveStream(); 

Das dauert einen „Stream“, aber ich weiß nicht, wie es zu füttern, dass.

Danke.

+0

Sie haben also die Daten in einem 'Stream'? In welchem ​​Format befinden sich die Daten? –

Antwort

2

Sie können MemoryStream erstellen und an die Klasse WaveOut von CSCore anhängen. WaveOut benötigt ein IWaveSource Argument, so dass Sie CSCores MediaFoundationDecoder verwenden können, um den Wellenstrom von SpeechSynthesizer zu konvertieren. Ich machte eine kleine Konsolenanwendung zur Veranschaulichung:

using System; 
using System.IO; 
using System.Speech.Synthesis; 
using CSCore; 
using CSCore.MediaFoundation; 
using CSCore.SoundOut; 

namespace WaveOutTest 
{ 
    class Program 
    { 
     static void Main() 
     { 
      using (var stream = new MemoryStream()) 
      using (var speechEngine = new SpeechSynthesizer()) 
      { 
       Console.WriteLine("Available devices:"); 
       foreach (var device in WaveOutDevice.EnumerateDevices()) 
       { 
        Console.WriteLine("{0}: {1}", device.DeviceId, device.Name); 
       } 
       Console.WriteLine("\nEnter device for speech output:"); 
       var deviceId = (int)char.GetNumericValue(Console.ReadKey().KeyChar); 

       speechEngine.SetOutputToWaveStream(stream); 
       speechEngine.Speak("Testing 1 2 3"); 

       using (var waveOut = new WaveOut { Device = new WaveOutDevice(deviceId) }) 
       using (var waveSource = new MediaFoundationDecoder(stream)) 
       { 
        waveOut.Initialize(waveSource); 
        waveOut.Play(); 
        waveOut.WaitForStopped(); 
       } 
      } 
     } 
    } 
} 
+1

Danke. Sehr kurze und hilfreiche Antwort - sehr geschätzt! –

Verwandte Themen