2012-07-17 16 views
14

Ich führe Text-zu-Sprache aus und möchte einige spezielle Aussprachen in einer Lexikon-Datei angeben. Ich habe MSDN's AddLexicon example wörtlich gelaufen, und es spricht den Satz, aber es tut nicht Verwenden Sie das gegebene Lexikon, scheint etwas gebrochen zu sein.Wie verwende ich ein Lexikon mit SpeechSynthesizer?

Hier ist das bereitgestellte Beispiel:

using System; 
using Microsoft.Speech.Synthesis; 

namespace SampleSynthesis 
{ 
    class Program 
    { 
    static void Main(string[] 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(); 
    } 
    } 
} 

und Lexikon-Datei:

<lexicon version="1.0" 
     xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon 
     http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd" 
     alphabet="x-microsoft-ups" xml:lang="en-US"> 


    <lexeme> 
    <grapheme> whatchamacallit </grapheme> 
    <phoneme> W S1 AX T CH AX M AX K S2 AA L IH T </phoneme> 
    </lexeme> 

</lexicon> 

Die Konsole öffnet, wird der Text gesprochen, aber die neue Aussprache wird nicht verwendet. Ich habe natürlich die Datei auf c:\test\whatchamacallit.pls wie angegeben gespeichert.

Ich habe versucht, Variationen des Uri und Speicherort der Datei (zB @"C:\Temp\whatchamacallit.pls", @"file:///c:\test\whatchamacallit.pls"), absolute und relative Pfade, es in die Build-Ordner kopieren usw.

Ich lief Process Monitor und die Datei wird nicht zugegriffen. Wenn es ein Verzeichnis-/Dateiberechtigungs-Problem wäre (was nicht der Fall ist), würde ich immer noch die Nachrichten mit Zugriffsverweigerung sehen, aber ich protokolliere überhaupt keine Referenz außer der gelegentlichen aus meinem Texteditor. Ich sehe die Datei zugegriffen, wenn ich versuche File.OpenRead.

Leider gibt es keine Fehlermeldungen bei der Verwendung eines Müll Uri.

Bei weiteren Untersuchungen habe ich festgestellt, dass dieses Beispiel von Microsoft.Speech.Synthesis ist, während ich hier System.Speech.Synthesis verwende. Aber von dem, was ich sagen kann, sind sie bis auf einige zusätzliche Informationen und Beispiele identisch und beide weisen auf die gleiche Spezifikation hin. Könnte das immer noch das Problem sein?

prüft ich das Projekt die richtige .NET Framework 4.

ich das Beispiel von MSDN zu verwenden, wird auf examples from the referenced spec verglichen, sowie diejenigen geradezu, aber es hat nicht geholfen versucht. Angesichts der Tatsache, dass die Datei scheint nicht zugegriffen zu werden, bin ich nicht überrascht.

(Ich kann PromptBuilder.AppendTextWithPronunciation ganz gut bedienen, aber es ist eine schlechte Alternative für meinen Anwendungsfall.)

ist das Beispiel auf MSDN gebrochen? Wie verwende ich ein Lexikon mit SpeechSynthesizer?

Antwort

9

Nach vielen Recherchen und Fallstricken kann ich Ihnen versichern, dass Ihre Annahme einfach falsch ist. Aus irgendeinem Grund System.Speech.Synthesis.SpeechSynthesizer.AddLexicon() fügt das Lexikon zu einer internen Liste hinzu, aber verwendet es überhaupt nicht. Scheint so, als hätte noch niemand versucht es zu benutzen und dieser Bug ist unbemerkt geblieben.

Microsoft.Speech.Synthesis.SpeechSynthesizer.AddLexicon() (die zu dem Microsoft Speech SDK gehört) auf der anderen Seite funktioniert wie erwartet (es übergibt das Lexikon an das COM-Objekt, das es wie angekündigt interpretiert).

Bitte auf diese Anleitung, wie man das SDK installieren: http://msdn.microsoft.com/en-us/library/hh362873%28v=office.14%29.aspx

Hinweise:

  • Menschen berichtet die 64-Bit-Version COM Ausnahmen verursachen (da die Bibliothek nicht korrekt installiert werden kann) ich dies auf einer 64-Bit-Windows-7-Maschine bestätigt
    • die x86-Version verwenden umgeht das Problem
  • sicher sein, die Laufzeit vor dem SDK
  • sicher sein, installieren, um eine Runtime-Sprache zu installieren (wie auf der gelinkten Seite adviced) als das SDK nicht den Standard-System Spricht-Engine nicht verwendet
+0

ich meinte, was ich kann sagen, dass die _Dokumentation_ identisch ist. Endlich eine Antwort! Vielen Dank! –

+1

Die Dokumentation ist identisch und dies wurde nirgendwo als bekannter Bug erwähnt, was ziemlich komisch ist. Wie auch immer, du bist willkommen, hoffe es hilft :) –

+0

Ja, einfach funktioniert überhaupt nicht. –

Verwandte Themen