Archive for 20 декабря, 2012
Распознавание и обработка речи (часть 2)
Преобразование текста в речь
Еще одна, не менее интересная задача, это преобразование текста в человеческую речь. Чтобы реализовать подобный функционал в приложении первым делом нужно определить возможность ID_CAP_SPEECH_RECOGNITION в манифесте приложения:
<Capabilities>
<Capability Name="ID_CAP_SPEECH_RECOGNITION" />
</Capabilities>
Теперь можно переходить к синтезу голоса. Для этого воспользуемся пространством имен Windows.Phone.Speech.Synthesis, которое содержит всего несколько полезных классов:
· InstalledVoices – этот класс содержит всего два свойства (All и Default) и позволяет предоставить информацию об установленных языках на телефоне пользователя. Тут программист может проверить, есть ли требуемый язык и подобрать тот, который подходит для данной ситуации, в противном случае система возьмет язык по умолчанию;
· VoiceInformation – этот класс содержит информацию о голосе. Тут содержится язык, пол синтезатора (как ни странно звучит). Используется совместно с InstalledVoices при обращении к свойству Default или переборе всей коллекции доступных языков в All. Сам по себе объект класса создать нельзя;
· SpeechSynthesizer – вот это и есть самый интересный класс, который выполняет преобразование текста в речь.
Фактически, чтобы преобразовать текст в речь, достаточно создать объект класса SpeechSynthesizer и вызвать метод SpeakTextAsync. Как видно из названия метода, он является асинхронным и поддерживает подход вызова через async/await. Естественно, чтобы вызвать метод, желательно проверить наличие нужного Вам языка, а еще лучше, установить его в качестве текущего с помощью метода SetVoice. Код ниже проверяет наличие русского языка, а в случае его присутствия, произносит фразу фразу «Привет», используя женский и мужской голос последовательно:
if ((from a in InstalledVoices.All where a.Language.Contains("ru") select a).Count() > 0) { SpeechSynthesizer sr = new SpeechSynthesizer(); sr.SetVoice((from a in InstalledVoices.All where a.Language.Contains("ru") select a).First()); await sr.SpeakTextAsync("Привет"); sr.SetVoice((from a in InstalledVoices.All where a.Language.Contains("ru") select a).Last()); await sr.SpeakTextAsync("Привет"); }
Естественно, что преобразование текста в речь на основе простого текста не очень интересно, так как часто нужно использовать женский и мужской голос в одном абзаце, использовать разные языки, отправлять приложению событие при завершении произнесения части фразы и др. Все это можно делать, если использовать не простой текст, а набор инструкций, описанных с помощью специального языка Speech Synthesis Markup Language (SSML). Традиционно SSML базируется на XML и поддерживается в классе SpeechSynthesizer двумя методами: SpeakSsmlAsync и SpeakSsmlFromUriAsync. Первый метод принимает в качестве параметров строку, содержащую SSML, а второй – путь к файлу с соответствующими инструкциями.
Рассмотрим все элементы, из которых может состоять SSML документ:
· audio – позволяет вставить заранее подготовленный аудио файл. Это позволяет снабдить монолог дополнительными аудио эффектами. В качестве атрибута используется src – путь к файлу;
· break – позволяет задавать паузу. Для этого используется атрибут duration, который задает паузу в секундах или миллисекундах или атрибут strength, принимающий одно из предопределенных значений;
· emphasis – теоретически этот элемент должен позволять произносить текст с разным уровнем интонации, но это в Windows Phone 8 пока не реализовано;
· lexicon – этот элемент позволяет задать разработчику собственный лексикон, базируясь на специально созданной для этого спецификации Pronunciation Lexicon Specification (PLS). Это необходимо для сложных приложений, где необходимо четко задать набор слов и правильное их произношение;
· mark – позволяет задать метку, используя атрибут name. При достижении метки в приложении генерируется событие BookmarkReached. Это позволяет легко синхронизировать речь с происходящим на экране.
· p и s – позволяют задать параграф или высказывание. Элементы не обязательные, но имеют важный атрибут xml:lang, который позволяет переустановить язык;
· phoneme – с помощью этого элемента можно задать специальное произношение для заданной группы символов. Очень часто это касается имен;
· prosody – содержит много атрибутов, но пока поддерживается только volume, который позволяет задать громкость от 0 до 100;
· say—as – позволяет задать произношения для дат, времени, числительных и др. Очень полезный элемент, учитывая то, что те же даты пишутся по разному;
· speak – задает коневой элемент для всего SSML документа;
· sub – позволяет задать развернутое написание для аббревиатур;
· voice – позволяет задать голос, указав мужской или женский, язык и другие параметры.
Если Вы создаете файл с расширением ssml, то Visual Studio автоматически включает систему IntelliSense, что очень удобно. Пример простого ssml файла:
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="ru-RU"> <s xml:lang="ru">Чтобы сказать добрый день по английски, произнесите</s> <s xml:lang="en">Good morning</s> </speak>
Код, который может открыть этот файл может выглядеть вот так:
SpeechSynthesizer sr = new SpeechSynthesizer(); string path = Package.Current.InstalledLocation.Path + "\\text.ssml"; Uri url = new Uri(path, UriKind.Absolute); await sr.SpeakSsmlFromUriAsync(url);
Не забудьте проверить, что в свойствах файла указано Build Action = Content. По умолчанию это не происходит и Вы получите исключение о том, что файл не найден.
Конкурс для Windows Phone разработчиков в Украине
Вспомнил, что не писал о таком замечательном конкурсе: http://wp8.promorc.com, который мы сейчас проводим для всех разработчиков и студентов в Украине.
На конкурсе 4 номинации:
· Лучшее приложение (тут все, что угодно – бизнес, социалка и др.)
· Лучшая игра
· Лучшее студенческое приложение (чтобы дать возможность студентам получить приз с хорошим приложением, если их вытеснят разработчики из первых двух номинаций.)
· Лучшее приложение для Windows Phone 8 (тут речь идет о приложениях, которые утилизируют новые возможности платформы. Чем лучше и полезней эта утилизация, тем лучше для конкурса)
Ограничения: только жители Украины, приложение должно быть опубликовано с украинского аккаунта (смысл делать метрики другой стране?) и приложение должно быть опубликовано в ходе конкурса (нас интересует что-то новенькое).
До конца конкурса осталось еще 54 дня. Поэтому время еще есть.
Imagine Cup 2013: Участникам по футболке
Если Вы украинский студент и все еще решаете, нужно ли принимать участие в Imagine Cup 2013, то рекомендую поспешить, так как для многих номинаций регистрация закрывается 15 января!
Хочу также сообщить, что все украинские студенты, которые зарегистрируются до 15 января в номинациях Windows 8, Windows Phone или Windows Azure и пройдут во второй раунд (ответят на достаточное количество вопросов в первом раунде), получат по бесплатной футболке с соответствующим логотипом.
Сайт конкурса в мире: http://imaginecup.com
Сайт конкурса в Украине: http://imaginecup.com.ua
Регистрация доступна по ссылке: http://imaginecup.com/IC13/Competition/Register