2010-10-06 5 views
0

Je joue avec l'utilisation de TTS intégré dans .NET 4 et je veux que le discours se produise immédiatement, mais je rencontre plutôt un décalage entre quand j'appelle Parler et quand je reçois l'audio.Réduire au minimum le retard en utilisant System.Speech.Synthesis

Je suis en train de développer une minuterie de compte à rebours simple qui appelle les cinq dernières secondes et l'achèvement (5 ... 4 ... 3 ... 2 ... 1 ... Fait), mais quand l'écran mises à jour avec la nouvelle heure, le TTS est en retard, s'aggravant pour chaque invocation. J'ai essayé d'utiliser SpeakAsync, mais cela n'a fait qu'empirer les choses. Actuellement, Speak est appelé en dehors du thread d'interface utilisateur (dans le gestionnaire d'événements Timer Tick).

Existe-t-il un moyen de minimiser ce décalage, tel que le pré-calcul de la parole et sa mise en cache ou la création d'une sorte de thread TTS spécial?

Répondre

0

Je lisais en quelque sorte après l'appel d'API dont j'avais besoin au moins une centaine de fois. Je cherchais SpeechSynthesizer.SetOutputToWaveStream.

MemoryStream stream = new MemoryStream(); 
SpeechSynthesizer synth = new SpeechSynthesizer(); 
synth.SetOutputToWaveStream(stream); 
synth.Play(text); 
stream.Position = 0; 
SoundPlayer player = new SoundPlayer(stream); 
player.Play(); 

Ce code utilisera TTS pour transformer le texte en fichier WAV diffusé dans un flux. Vous devez réinitialiser la position du MemoryStream de sorte que lorsque vous créez un SoundPlayer à partir de celui-ci, il commence à lire le flux depuis le début au lieu de la fin. Une fois le SoundPlayer initialisé, vous pouvez l'enregistrer quelque part afin de pouvoir le lire plus tard au lieu d'avoir à attendre que le TTS s'initialise et joue le son.

Questions connexes