Синтез речи

41

Поддержка аудио и видео — ключевой "столп" платформы WPF. Тем не менее, WPF также включает библиотеки, вращающиеся вокруг двух менее широко используемых средств мультимедиа: синтеза и распознавания речи.

Оба эти средства поддерживаются классами из сборки System.Speech.dll. По умолчанию Visual Studio не добавляет ссылок на эту сборку в новые проекты WPF, так что в своих проектах это понадобится делать самостоятельно.

Речь — это второстепенная часть WPF. Хотя поддержка речи формально считается частью WPF, и она появилась, начиная с версии NET Framework 3.0, пространства имен классов для поддержки речи начинаются с System.Speech, а не System.Windows.

Синтез речи — это средство, генерирующее аудиосигнал разговора на основе предоставленного текста. Синтез речи не является встроенным средством в WPF — это средство доступности операционной системы Windows. Такие системные утилиты, как Narrator (облегченное средство чтения экрана), включены в Windows и используют синтез речи для помощи пользователям в навигации по основным диалоговым окнам. В общем случае, синтез речи может применяться для создания аудиоруководств и "говорящих" инструкций, хотя заранее записанное аудио обеспечивает более высокое качество.

Синтез речи имеет смысл, когда требуется создать аудио для динамического текста — другими словами, когда на момент компиляции неизвестно, какие слова должны быть произнесены во время выполнения. Но если аудио неизменно, то предварительно записанное легче использовать, это более эффективно, к тому же качество звука выше. Единственная причина отдать предпочтение синтезу речи — это когда нужно прочитать огромный объем текста, и предварительная его запись непрактична.

Хотя все современные версии Windows имеют встроенный синтез речи, используемый ими компьютеризованный голос отличается. В Windows ХР используется голос, похожий на голос робота и называемый Sam, в то время как в Windows Vista и Windows 7 включает более натуральный женский голос по имени Anna. Для всех этих систем доступны для загрузки и установки также дополнительные голоса.

Воспроизведение речи обманчиво просто. Все, что понадобится — это создать экземпляр класса SpeechSynthesizer из пространства имен System.Speech.Synthesis и вызвать его метод Speak() со строкой текста, например:

SpeechSynthesizer synthesizer = new SpeechSynthesizer();
synthesizer.Speak("Hello, world");

При использовании такого подхода — передаче простого текста объекту SpeechSynthesizer — в некоторой степени утрачивается контроль. Могут встречаться слова, которые произносятся неправильно, с неправильными ударениями или не с должной скоростью. Чтобы получить больший контроль над произносимым текстом, необходимо использовать класс PromptBuilder для конструирования определения речи.

Вот как можно изменить предыдущий пример с полностью эквивалентным кодом, в котором применяется PromptBuilder:

PromptBuilder prompt = new PromptBuilder();
prompt.AppendText("Hello, world");
SpeechSynthesizer synthesizer = new SpeechSynthesizer();
synthesizer.Speak(prompt);

Этот код не дает никаких преимуществ. Однако класс PromptBuilder содержит в себе множество других методов, которые можно применять для настройки произношения текста. Например, можно акцентировать определенное слово (или несколько слов), используя перегруженную версию метода AppendText(), которая принимает значение из перечисления PromptEmphasis. Хотя точный эффект от акцентирования слова зависит от используемого голоса, следующий код подчеркивает слово "are" в предложении "How are you?":

PromptBuilder prompt = new PromptBuilder();
prompt.AppendText("How ");
prompt.AppendText("are ",PromptEmphasis.Strong);
prompt.AppendText("you");

Метод AppendText() имеет еще две перегрузки: одна принимает значение PromptRate, которое позволяет увеличивать или уменьшать скорость, а другая — значение PromptVolume, позволяющее увеличивать или уменьшать громкость.

Для изменения сразу нескольких деталей необходимо использовать объект PromptStyle. Этот объект является оболочкой для значений PromptEmphasis, PromptRate и PromptVolume. Можно задавать значения для всех трех параметров либо только для одного или двух, которые нужны.

В действительности PromptBuilder — это оболочка для стандарта Synthesis Markup Language (SSML). Будучи таковым, он разделяет все ограничения этого стандарта. Когда вызываются методы PromptBuilder, то "за кулисами" генерируется соответствующий код разметки SSML. Для просмотра финального SSML-представления кода можно вызвать PromptBuilder.ToXml() в конце работы. Кроме того, можно также вызвать PromptBuilder.AppendSsml(), взяв существующий код разметки SSML и добавив его в поток чтения текста.

Пройди тесты
Лучший чат для C# программистов