C# Sprachausgabe überlappt sich

...komplette Frage anzeigen

2 Antworten

Benutze stattdessen die synchrone Speak()-Methode der SpeechSynthesizer-Klasse. Die wartet bis die Ausgabe getätigt wurde.

Was du alternativ machen kannst ist mit dem SpeakCompleted-Event und einer Warteschlange (Queue) zu arbeiten. In deine Queue reihst du den Text ein der gesprochen werden soll. War die Queue leer, startest du zusätzlich die Wiedergabe vom Peek()-Element. Im SpeakCompleted-Handler machst du das Dequeue und checkst ob noch zu sprechende Texte in der Queue sind, wenn ja startest du wieder SpeakAsync mit dem Peek-Element. Und schon hast du eine asynchrone Verarbeitungskette, ohne dass dein Programm blockiert oder du einen Text gleichzeitig ausgibst.

Also in etwa so:

private Queue<string> q = new Queue<string>();
private void Speak(string text)
{
    q.Enqueue(text);
    if(q.Count==1)
        speaker.SpeakAsync(q.Peek());
}
private void speaker_SpeakCompleted(object sender, EventArgs args)
{
    q.Dequeue();
    if(q.Count>0)
        speaker.SpeakAsync(q.Peek());     
}

Hat auch den Vorteil, dass du mittelt q.Peek() immer weißt, welcher Satz gerade gesprochen wird

Was möchtest Du wissen?