2012-07-17 12 views
14

Wykonuję tekst do mowy i chciałbym podać jakieś specjalne wymowy w pliku leksykonu. Zdałem dosłowniei mówi to zdanie, ale nie używa ono podanego leksykonu, coś wygląda na zepsute.Jak używać leksykonu z SpeechSynthesizer?

Oto warunkiem przykład:

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(); 
    } 
    } 
} 

i leksykon file:

<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> 

Konsola otwiera tekst jest używany, ale nowy wymowa nie jest używany. Oczywiście zapisałem plik pod numerem c:\test\whatchamacallit.pls.

Próbowałem wariantów lokalizacji Uri i plików (np @"C:\Temp\whatchamacallit.pls", @"file:///c:\test\whatchamacallit.pls"), ścieżek bezwzględnych i względnych, kopiując je w folderze build itp

Pobiegłem Process Monitor a plik nie jest dostępny . Gdyby to był problem z uprawnieniami do katalogu/pliku (który nie jest) nadal widziałbym komunikaty odmowy dostępu, jednak nie loguję się w ogóle, z wyjątkiem sporadycznego z mojego edytora tekstu. Widzę dostęp do pliku, gdy próbuję File.OpenRead.

Niestety nie ma komunikatów o błędach podczas korzystania ze śmieci Uri.

W toku dalszych badań zdałem sobie sprawę, że ten przykład pochodzi z Microsoft.Speech.Synthesis, natomiast używam tutaj System.Speech.Synthesis. Jednak z tego, co mogę powiedzieć, są one identyczne, z wyjątkiem niektórych dodatkowych informacji i przykładów i oba wskazują na tę samą specyfikację. Czy to nadal może być problem?

ja zweryfikowany projekt jest skonfigurowany do korzystania właściwa .NET Framework 4.

Porównałem przykład z MSDN do examples from the referenced spec, a także próbuje ci wprost, ale to nie pomogło. Biorąc pod uwagę, że plik nie jest dostępny, nie jestem zaskoczony.

(jestem w stanie wykorzystać PromptBuilder.AppendTextWithPronunciation dobrze, ale to słaba alternatywa dla mojego przypadku użycia.)

jest przykład na MSDN uszkodzony? Jak używać leksykonu z SpeechSynthesizer?

Odpowiedz

9

Po wielu badaniach i pułapkach mogę zapewnić, że twoje założenie jest po prostu błędne. Z jakiegoś powodu System.Speech.Synthesis.SpeechSynthesizer.AddLexicon() dodaje leksykon do listy wewnętrznej, ale w ogóle jej nie używa. Wygląda na to, że nikt wcześniej nie próbował go używać i ten błąd nie został zauważony.

Microsoft.Speech.Synthesis.SpeechSynthesizer.AddLexicon() (należący do Microsoft Speech SDK), z drugiej strony działa zgodnie z oczekiwaniami (przechodzi leksykon do obiektu COM, który interpretuje to jak w reklamie).

Proszę odnieść się do tej instrukcji, w jaki sposób zainstalować SDK: http://msdn.microsoft.com/en-us/library/hh362873%28v=office.14%29.aspx

Uwagi:

  • osoby zgłoszone w wersji 64-bitowej powodować wyjątki COM (ponieważ biblioteka nie zostanie poprawnie zainstalowany) , I potwierdził to na 64-bitowego systemu Windows 7 maszynie
    • użyciu wersji x86 obejście problemu nie
  • należy zainstalować środowisko wykonawcze przed SDK
  • należy również zainstalować Language Runtime (jak adviced na powiązanej stronie) jako SDK nie korzysta z silnika mowy domyślnego systemu
+0

Chciałem z tego co może powiedzieć, że _ dokumentacja_ jest identyczna. Wreszcie odpowiedź! Dzięki! –

+1

Dokumentacja jest identyczna i nie została nigdzie wymieniona jako znany błąd, co jest dość dziwne. W każdym razie, nie ma za co, mam nadzieję, że to pomaga :) –

+0

Tak, po prostu nie działa w ogóle. –