2012-07-17 16 views
14

Estoy realizando algunos textos a voz y me gustaría especificar algunas pronunciaciones especiales en un archivo de léxico. He corrido MSDN's AddLexicon example textualmente, y dice la oración pero hace no usa el léxico dado, algo parece estar roto.¿Cómo uso un léxico con SpeechSynthesizer?

Aquí está el ejemplo proporcionado:

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

y el léxico archivo:

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

La consola se abre, se habla el texto, pero la nueva pronunciación no se utiliza. Por supuesto, he guardado el archivo en c:\test\whatchamacallit.pls como se especifica.

He intentado variaciones de la dirección URI y el archivo (por ejemplo @"C:\Temp\whatchamacallit.pls", @"file:///c:\test\whatchamacallit.pls"), rutas absolutas y relativas, lo copia en la carpeta de construcción, etc.

me encontré Process Monitor y el archivo se no accedí. Si se tratara de un problema de permiso de directorio/archivo (que no lo es), aún vería los mensajes de acceso denegado, pero no registre ninguna referencia, excepto la ocasional de mi editor de texto. Veo el archivo al que accedí cuando intento File.OpenRead.

Desafortunadamente no hay mensajes de error cuando se usa un Uri de basura.

En la investigación posterior me di cuenta de que este ejemplo es de Microsoft.Speech.Synthesis, mientras que estoy usando System.Speech.Synthesis aquí. Sin embargo, por lo que puedo decir, son idénticos, excepto por alguna información adicional y ejemplos, y ambos apuntan a la misma especificación. ¿Podría ser este el problema?

que verifica que el proyecto está configurado para utilizar el correcto .NET Framework 4.

que comparó el ejemplo de MSDN a examples from the referenced spec, así como tratar los pura y simple pero no ha ayudado. Considerando que el archivo no parece ser accedido, no estoy sorprendido.

(soy capaz de utilizar PromptBuilder.AppendTextWithPronunciation muy bien, pero es una mala alternativa para mi caso de uso.)

es el ejemplo en MSDN roto? ¿Cómo uso un léxico con SpeechSynthesizer?

Respuesta

9

Después de mucha investigación y trampas puedo asegurarle que su suposición es simplemente incorrecta. Por alguna razón System.Speech.Synthesis.SpeechSynthesizer.AddLexicon() agrega el léxico a una lista interna, pero no la usa en absoluto. Parece que nadie intentó usarlo antes y este error pasó desapercibido.

Microsoft.Speech.Synthesis.SpeechSynthesizer.AddLexicon() (que pertenece al Microsoft Speech SDK) por otro lado funciona como se esperaba (pasa el léxico al objeto COM que lo interpreta como se anuncia).

Por favor refiérase a esta guía sobre cómo instalar el SDK: http://msdn.microsoft.com/en-us/library/hh362873%28v=office.14%29.aspx

Notas:

  • personas reportaron la versión de 64 bits para causar excepciones COM (porque la biblioteca no se instala correctamente) , me confirmó esto en una de 64 bits de Windows 7 máquina
    • utilizando la versión x86 eluda el problema
  • Asegúrese de instalar el tiempo de ejecución antes de que el SDK
  • Asegúrese de instalar también un lenguaje de tiempo de ejecución (como se aconsejó en la página enlazada) como el SDK no utiliza el motor de voz del sistema por defecto
+0

me refería a lo que puede decir que _documentation_ es idéntico. Finalmente una respuesta! ¡Gracias! –

+1

La documentación es idéntica y esto no se ha mencionado en ningún lugar como un error conocido, que es bastante extraño. De todos modos, de nada, espero que ayude :) –

+0

Sí, simplemente no funciona en absoluto. –

Cuestiones relacionadas