Comment utiliser un lexique avec SpeechSynthesizer?

Je fais de la synthèse vocale et j’aimerais préciser quelques prononciations spéciales dans un fichier de lexique. J’ai utilisé l’exemple AddLexicon de MSDN, mot pour mot, et il prononce la phrase mais n’utilise pas le lexique donné, quelque chose semble cassé.

Voici l’exemple fourni:

using System; using Microsoft.Speech.Synthesis; namespace SampleSynthesis { class Program { static void Main(ssortingng[] args) { // Initialize a new instance of the SpeechSynthesizer. using (SpeechSynthesizer synth = new SpeechSynthesizer()) { // Configure the audio output. synth.SetOutputToDefaultAudioDevice(); PromptBuilder builder = new PromptBuilder(); builder.AppendText("Gimme the whatchamacallit."); // Append the lexicon file. synth.AddLexicon(new Uri("c:\\test\\whatchamacallit.pls"), "application/pls+xml"); // Speak the prompt and play back the output file. synth.Speak(builder); } Console.WriteLine(); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } } 

et le lexique:

    whatchamacallit   W S1 AX T CH AX M AX K S2 AA L IH T    

La console s’ouvre, le texte est prononcé mais la nouvelle prononciation n’est pas utilisée. J’ai bien sûr enregistré le fichier dans c:\test\whatchamacallit.pls comme spécifié.

J’ai essayé des variantes d’URI et de l’emplacement du fichier (par exemple, @"C:\Temp\whatchamacallit.pls" , @"file:///c:\test\whatchamacallit.pls" ), des chemins absolus et relatifs, en le copiant. dans le dossier de construction, etc.

J’ai exécuté Process Monitor et le fichier n’est pas utilisé . Si c’était un problème d’autorisation répertoire / fichier (ce qui n’est pas le cas), je verrais toujours les messages d’access refusé, mais je n’enregistrerais aucune référence, sauf celle occasionnelle de mon éditeur de texte. Je vois le fichier File.OpenRead lorsque j’essaie File.OpenRead .

Malheureusement, il n’y a pas de message d’erreur lors de l’utilisation d’un Uri de déchets.

Après un examen plus approfondi, j’ai réalisé que cet exemple provient de Microsoft.Speech.Synthesis , alors que j’utilise System.Speech.Synthesis ici. Cependant, d’après ce que je peux dire, ils sont identiques, à l’exception de quelques informations supplémentaires et d’exemples, et les deux renvoient aux mêmes spécifications. Cela pourrait-il toujours être le problème?

J’ai vérifié que le projet est configuré pour utiliser le bon .NET Framework 4.

J’ai comparé l’exemple de MSDN avec des exemples de la spécification référencée , ainsi que d’essayer ceux-ci directement, mais cela n’a pas aidé. Étant donné que le fichier ne semble pas être accessible, je ne suis pas surpris.

(Je suis capable d’utiliser PromptBuilder.AppendTextWithPronunciation mais c’est une solution de rechange médiocre pour mon cas d’utilisation.)

Est-ce que l’exemple sur MSDN est cassé? Comment utiliser un lexique avec SpeechSynthesizer?

Après de nombreuses recherches et des pièges, je peux vous assurer que votre hypothèse est tout simplement fausse. Pour une raison quelconque, System.Speech.Synthesis.SpeechSynthesizer.AddLexicon() ajoute le lexique à une liste interne, mais ne l’utilise pas du tout. On dirait que personne n’a essayé de l’utiliser avant et que ce bug est passé inaperçu.

Microsoft.Speech.Synthesis.SpeechSynthesizer.AddLexicon() (qui appartient au kit de développement logiciel Microsoft Speech) fonctionne normalement comme il se doit (il transmet le lexique à l’object COM qui l’interprète comme indiqué).

Veuillez vous reporter à ce guide pour savoir comment installer le SDK: http://msdn.microsoft.com/en-us/library/hh362873%28v=office.14%29.aspx

Remarques:

  • des personnes ont signalé que la version 64 bits était à l’origine d’exceptions COM (car la bibliothèque n’était pas installée correctement), ce que j’ai confirmé sur une machine Windows 7 64 bits
    • utiliser la version x86 contourne le problème
  • assurez-vous d’installer le runtime avant le SDK
  • veillez également à installer une langue d’exécution (comme indiqué sur la page liée), car le SDK n’utilise pas le moteur de parole du système par défaut