Шаг управления SpeechSynthesizer .NET

Я пытаюсь изменить высоту разговорного текста через SSML и .NET SpeechSynthesizer (System.Speech.Synthesis)

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

Содержимое файла ssml1.xml:

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

Скорость распознается: «8 книг» озвучиваются намного медленнее, чем остальные, но какое бы значение ни выставлялось для «высоты звука», это не имеет значения! Допустимые значения можно найти здесь:

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

Я что-то упустил или меняю высоту звука, просто не поддерживаемую механизмом Microsoft Speech?

фриц


person fritz    schedule 12.02.2011    source источник


Ответы (1)


Хотя механизм SsmlParser, используемый System.Speech, принимает атрибут pitch в методе ProcessProsody, он не обрабатывает его.

Он обрабатывает только атрибуты range, rate, volume и duration. Он также анализирует contour, но обрабатывается как range (не знаю почему) ...

Изменить: если вам действительно не нужно читать текст из XML-файла SSML, вы можете создать текст программно.
Вместо

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

использовать

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();
person Jaroslav Jandek    schedule 12.02.2011
comment
Интересно, есть ли какой-либо другой api речевого движка, который можно использовать с .net, и который обрабатывает команды питча? - person fritz; 13.02.2011
comment
@fritz: API .NET не так много. Существует много собственных API-интерфейсов, но не многие из них бесплатны. Я успешно использовал eSpeak (не .NET) - результат лучше, чем у System.Speech, но он плохо читал SSML. - person Jaroslav Jandek; 13.02.2011
comment
Есть ли способ петь с помощью .NET-речи или другой альтернативы? Я ищу API, который поддерживает три функции управления: 1) Речь 2) Точная стабильная высота звука 3) Контроль продолжительности. Что-то подобное существует? Я, очевидно, предпочитаю API, управляемый музыкой. - person Shimmy Weitzhandler; 05.10.2014