2011-02-12 26 views
11

Estoy intentando cambiar el tono del texto hablado a través de SSML y .NET SpeechSynthesizer (System.Speech.Synthesis)SpeechSynthesizer .NET control de tono

SpeechSynthesizer synthesizer = new SpeechSynthesizer(); 
PromptBuilder builder = new PromptBuilder(); 
builder.AppendSsml(@"C:\Users\me\Documents\ssml1.xml"); 
synthesizer.Speak(builder); 

El contenido del archivo ssml1.xml es:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<ssml:speak version="1.0" 
xmlns:ssml="http://www.w3.org/2001/10/synthesis" 
xml:lang="en-US"> 
<ssml:sentence> 
Your order for <ssml:prosody pitch="+30%" rate="-90%" >8 books</ssml:prosody> 
will be shipped tomorrow. 
</ssml:sentence> 
</ssml:speak> 

la tasa se reconoce: "8 libros" se speaken mucho más lento que el resto, pero no importa qué valor se establece para "terreno de juego", no hace ninguna diferencia! Los valores permitidos se pueden encontrar aquí:

http://www.w3.org/TR/speech-synthesis/#S3.2.4

Me estoy perdiendo algo o está cambiando el terreno de juego no soportado por el motor de voz de Microsoft?

Fritz

Respuesta

2

Mientras que el motor SsmlParser utilizado por System.Speech acepta un atributo pitch en el método ProcessProsody, que no lo procesa.

Solo procesa los atributos range, rate, volume y duration. También analiza contour pero se procesa como range (no sé por qué) ...

Editar: si usted realmente no necesita leer el texto de un archivo XML SSML, puede crear el texto mediante programación.
En lugar de

builder.AppendSsml(@"C:\Users\me\Documents\ssml1.xml"); 

uso

builder.Culture = CultureInfo.CreateSpecificCulture("en-US"); 
builder.StartVoice(builder.Culture); 
builder.StartSentence(); 

builder.AppendText("Your order for "); 

builder.StartStyle(new PromptStyle() { Emphasis = PromptEmphasis.Strong, Rate = PromptRate.ExtraSlow }); 
builder.AppendText("8 books"); 
builder.EndStyle(); 

builder.AppendText(" will be shipped tomorrow."); 

builder.EndSentence(); 
builder.EndVoice(); 
+0

Me pregunto si hay alguna otra API de motor de voz que puede ser utilizado con .NET y que procesa órdenes de tono? – fritz

+0

@fritz: no hay muchas API .NET. Hay muchas API nativas, aunque muchas de ellas son "gratuitas". He usado ** eSpeak ** (no .NET) con éxito, mejor resultado que desde 'System.Speech', pero no ha leído bien SSML. –

+0

¿Hay alguna manera de cantar con .NET speech o cualquier otra alternativa? Estoy buscando una API que admita las tres funciones de control: 1) Habla 2) Precisión estable del tono 3) Control de duración. ¿Hay tal cosa? Obviamente prefiero una API impulsada musicalmente. – Shimmy