vendredi, août 01, 2008

Synthétiseur vocal en C# : SAPI 5.3

Si vous souhaitez utiliser la synthese vocal dans l'une de vos applications C# en .NET 3.0, je vous conseil de regarder le namespace System.Speech qui permet d'utiliser SAPI (Microsoft Speech API), en ce qui concerne les version sous Vista la 5.3 est disponible. Par contre, pour XP, il faut voir vers la 5.1 :
SAPI 5.1 SDK téléchargement

Optionnel : Pour obtenir les voix en francais, voici un article qui donne une solution :
Synthese vocal en francais

Je n'ai pas regardé, mais peut être que l'on peut passer l'installation du SDK ... car il me semble que les voix sont installés par défaut. Voir dans Panneau de configuration, Voix.

Maintenant que nous avons notre SAPI d'installer, nous allons créer un nouveau projet de type application .NET 3.0 (on est pas obligé de faire du XAML, mais c'est vous qui voyez).

L'objectif de cette petite application et de faire parler votre ordinateur. Avec cette meme librairie, il est possible de faire de la reconnaissance vocale mais je n'ai pas encore abordé le sujet.

1er étape : référencer System.Speech qui est une Dll de .NET 3.0
2eme étape : faire parler au synthétiseur une phrase toute simple
Contrairement a ce que l'on pourrait penser, c'est tout simple !! :)
Voici les quelques lignes de code à ajouter :
System.Speech.Synthesis.SpeechSynthesizer synthetizer = = new System.Speech.Synthesis.SpeechSynthesizer();
//En mode asynchrone
synthetizer.SpeakAsync("Bonjour");
//En mode synchrone
// synthetizer.Speak("Bonjour");


Ensuite, on peut réaliser des textes un peu plus élaborer en utilisant le PromptBuilder qui permet de structurer son texte. Attention, cette fois-ci, le synthetiseur prend la voix correspondant à la culture du système et non plus la voix par défaut. C'est la raison pour laquelle, j'ai précisé la culture dans l'exemple suivant, qui donne la date et l'heure du système :
System.Speech.Synthesis.PromptBuilder pBuilder = new System.Speech.Synthesis.PromptBuilder(System.Globalization.CultureInfo.GetCultureInfo("fr-FR")) ;
pBuilder.AppendText("Nous sommes le :");
pBuilder.AppendTextWithHint(DateTime.Now.ToString("dd/MM/yyyy"), System.Speech.Synthesis.SayAs.Date);
pBuilder.AppendBreak();
pBuilder.AppendText("Il est : ");
pBuilder.AppendTextWithHint(DateTime.Now.ToString("HH:mm:ss"), System.Speech.Synthesis.SayAs.Time24);
synthetizer.SpeakAsync(pBuilder);


.AppendText(string text) réalise la même chose que ce que nous avons utilisé tout à l'heure.
.AppendTextWithHint(string text, SayAs sayAs) lit le texte en fonction du type de donné dont il s'agit par exemple : .AppendTextWithHint("01/01/2008",SayAs.Date) sera lu comme "1er Aout 2008"
.AppendBreak() comme son nom l'indique, cela permet de réaliser une pause entre les mots. Il est possible de préciser le temps de la pause avec un TimeSpan.

Voilà pour un premier test. J'espère pouvoir faire des tests avec la reconnaissance vocal et vous tenir informer.

1 commentaire:

Anonyme a dit…

Sympa comme exemple, simple efficace et bien commenté, c'est parfait pour quelqu'un comme moi qui veut se faire une idée avant de mettre les mains dans le cambouis :p ! J'espère que tu te pencheras bientôt sur la reconnaissance vocale, car j'aimerai avoir d'autres sons de cloches que ce que j'ai pu voir jusqu'ici (notamment s'il est possible de faire une reconnaissance dans la langue de Molière, je serai très intéressé !).