Распознавание и синтез речи, работа с камерой
Цель работы: освоить методы работы с системой распознавания и синтеза речи, освоить концепцию создания фотоприложений
Распознавание речи
Возможности платформы Windows Phone 8 по распознаванию и синтезу речи можно использовать для организации взаимодействия приложения с пользователем. Так, пользователь может отдавать приложению голосовые команды, которые приложение может воспринять благодаря подсистеме распознавания речи. Приложение, в свою очередь, используя функцию синтеза речи, преобразования текста в речь – информировать пользователя о каких-либо событиях.
Здесь мы рассмотрим учебное приложение, которое позволяет пользователю выполнять голосовые команды и выдаёт сообщения пользователю, используя функцию преобразования текста в речь. Этот пример основан на примере "Speech for Windows Phone: Speech recognition and text-to-speech" ("Речевые возможности Windows Phone: распознавание речи и преобразование текста в речь"), http://code.msdn.microsoft.com/Speech-recognition-and-debe5858/.
Приложение, рис. 49.1, обладает следующими функциями.
увеличить изображение
Рис. 49.1. Проект приложения, реализующего возможности распознавания и синтеза речи
На главной странице расположен прямоугольник со скруглёнными краями, цвет заливки которого можно менять, используя голосовые команды. После нажатия на кнопку Запустить распознавание речи приложение переходит в режим непрерывного распознавания речи. В приложении подготовлен словарь, содержащий названия цветов, которые сопоставляются с кистями, имеющими соответствующий цвет. Когда пользователь называет цвет, приложение пытается распознать команду. Если команда распознана, используется синтезатор речи для оповещения о том, что цвет будет изменен и цвет фигуры меняется. Если команда не распознана, выводится сообщение с сообщением об этом и просьбой повторить еще раз, то же самое сообщение проговаривается с использованием синтезатора речи. Синтезатор речи достаточно гибок, например, он воспринимает не только русскоязычные слова, даже при условии настройки системы на русский язык, но и слова, введенные на латинице.
В Листинге 49.1 вы можете видеть код файла MainPage.xaml.cs, где реализован функционал приложения.
using Microsoft.Phone.Controls; using System; using System.Collections.Generic; using System.Windows; using System.Windows.Media; using Windows.Foundation; using Windows.Phone.Speech.Recognition; using Windows.Phone.Speech.Synthesis; //Перед запуском приложения в эмуляторе, удостоверьтесь в правильной работе микрофона и звуковой подсистемы. //Вы можете проверить эти возможности, выполнив длительное нажатие на кнопку Пуск в эмулятор, //приняв заявление о конфиденциальности и испытав работу системы, сказав, например "Запустить Internet Explorer" // Для успешной работы данного приложения требуется включение следующих возможностей в WMAppManifest.xml // ID_CAP_SPEECH_RECOGNITION // ID_CAP_MICROPHONE // ID_CAP_NETWORKING namespace P17_1 { public partial class MainPage : PhoneApplicationPage { SpeechSynthesizer _synthesizer; // Объект для синтеза речи (text-to-speech, TTS) SpeechRecognizer _recognizer; // Объект для распознавания голосовых команд IAsyncOperation<SpeechRecognitionResult> _recoOperation; // Используется для отметы текущей асинхронной операции распознавани речи bool _recoEnabled = false; // Если это свойство установлено в true, будет происходить распознавание речи Dictionary<string, SolidColorBrush> _colorBrushes; // Словарь названий цветов, которые распознаёт программа и соответствующих кистей // Конструктор public MainPage() { InitializeComponent(); } //Пользователь перешел на страницу. Если необходимо, выполняем инициализацию protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { //Настраиваем словарь объектов цветовых кистей SolidColorBrush . if (_colorBrushes == null) { _colorBrushes = new Dictionary<string, SolidColorBrush>(); _colorBrushes.Add("красный", new SolidColorBrush(Colors.Red)); _colorBrushes.Add("голубой", new SolidColorBrush(Colors.Cyan)); _colorBrushes.Add("синий", new SolidColorBrush(Colors.Blue)); _colorBrushes.Add("жёлтый", new SolidColorBrush(Colors.Yellow)); _colorBrushes.Add("оранжевый", new SolidColorBrush(Colors.Orange)); _colorBrushes.Add("пурпурный", new SolidColorBrush(Colors.Magenta)); _colorBrushes.Add("фиолетовый", new SolidColorBrush(Colors.Purple)); _colorBrushes.Add("черный", new SolidColorBrush(Colors.Black)); _colorBrushes.Add("глубокий черный", new SolidColorBrush(Colors.Black)); _colorBrushes.Add("зелёный", new SolidColorBrush(Colors.Green)); _colorBrushes.Add("белый", new SolidColorBrush(Colors.White)); _colorBrushes.Add("темно-серый", new SolidColorBrush(Colors.DarkGray)); _colorBrushes.Add("коричневый", new SolidColorBrush(Colors.Brown)); _colorBrushes.Add("серый", new SolidColorBrush(Colors.Gray)); } try { // Создаем объекты для распознавания и синтеза речиs. if (_synthesizer == null) { _synthesizer = new SpeechSynthesizer(); } if (_recognizer == null) { _recognizer = new SpeechRecognizer(); // Задаем список цветов, который будет распознавать программа. _recognizer.Grammars.AddGrammarFromList("Colors", _colorBrushes.Keys); } } catch (Exception err) { txtResult.Text = err.ToString(); } base.OnNavigatedTo(e); } //Кнопка btnContinuousRecognition работает как переключатель. //При нажатии на неё запускается непрерывное распознавание речи. //При повторном нажатии распознавание речи останавливается. private async void btnContinuousRecognition_Click(object sender, RoutedEventArgs e) { // Изменение текста на кнопке. if (this._recoEnabled) { // Приведение состояния интерфейса к исходному _recoEnabled = false; btnContinuousRecognition.Content = "Запустить распознавание речи"; txtResult.Text = String.Empty; txtInstructions.Visibility = System.Windows.Visibility.Collapsed; // Отмена невыполненной операции распознавания, если таковая существует if (_recoOperation != null && _recoOperation.Status == AsyncStatus.Started) { _recoOperation.Cancel(); } return; } else { // Установка флага, указывающего на то, что мы находимся в режиме распознавания речи _recoEnabled = true; // Обновление интерфейса btnContinuousRecognition.Content = "Слушаю.... Прекратить?"; txtInstructions.Visibility = System.Windows.Visibility.Visible; } // Непрерывное распознавание речи до тех пор, пока пользователь это не отменит while (this._recoEnabled) { try { // Выполняем распознавание речи. _recoOperation = _recognizer.RecognizeAsync(); var recoResult = await this._recoOperation; // Проверяем уровень достоверности при попытке распознавания речи. if (recoResult.TextConfidence < SpeechRecognitionConfidence.Medium) { // Если уровень достоверности в данной попытке распознавания низок, // предлагаем пользователю попробовать снова. txtResult.Text = "Не могу понять вашу команду, пожалуйста, попробуйте еще раз."; await _synthesizer.SpeakTextAsync("Не могу понять вашу команду, пожалуйста, попробуйте еще раз."); } else { // Сообщаем об изменении цвета фигуры, обновляя текст в элементе управления // TextBox и синтезируя соответствующую фразу. txtResult.Text = "Изменение цвета на: " + recoResult.Text; await _synthesizer.SpeakTextAsync("Изменение цвета на " + recoResult.Text); // Устанавливаем цвет заливки фигуры на распознанный. rectangleResult.Background = TryGetBrush(recoResult.Text.ToLower()); } } catch (System.Threading.Tasks.TaskCanceledException) { // Игнорируем исключение, связанное с отменой распознавания recoOperation // Когда вызывается recoOperation.Cancel() для отмены асинхронной операции распознавания речи // из RecognizeAsync(), выдаётся исключение TaskCanceledException для указания на ранний выход из операции. } catch (Exception err) { // Обработка ошибки, связанной с политикой конфиденциальности. const int privacyPolicyHResult = unchecked((int)0x80045509); if (err.HResult == privacyPolicyHResult) { MessageBox.Show("Для того, чтобы запустить этот пример, нужно принять заявление о конфиденциальности. Для того, чтобы это сделать, перейдите в раздел Настройки > Голосовые функции и установите флаг 'Включить службу распознавания речи' "); _recoEnabled = false; btnContinuousRecognition.Content = "Запустить распознавание речи"; } else { txtResult.Text = "Error: " + err.Message; } } } } /// <summary> /// Возвращает объект SolidColorBrush который соответствует распознанному названию цвета. /// </summary> /// <param name="reco">Строка с распознанным названием цвета.</param> /// <returns>При обнаружении совпадения возврат кисти SolidColorBrush соответствующего цвета; в противном случае - белый цвет.</returns> private SolidColorBrush TryGetBrush(string recognizedColor) { if (_colorBrushes.ContainsKey(recognizedColor)) return _colorBrushes[recognizedColor]; return _colorBrushes["белый"]; } } }Листинг 49.1. Код файла MainPage.xaml.cs
Обратите внимание на то, что для успешной работы приложения в манифесте нужно объявить возможности ID_CAP_SPEECH_RECOGNITION, ID_CAP_MICROPHONE и ID_CAP_NETWORKING. Кроме того, перед тем, как пользователь сможет работать с системой распознавания речи, ему нужно включить соответствующий параметр в настройках телефона. Это справедливо и для эмулятора. Для отладки приложения в эмуляторе компьютер должен быть оснащён микрофоном.
Для распознавания речи здесь используются возможности объекта SpeechRecognizer из пространства имен Windows.Phone.Speech.Recognition (http://msdn.microsoft.com/en-us/library/windowsphone/develop/windows.phone.speech.recognition%28v=vs.105%29.aspx). В приложении формируется словарь, содержащий названия цветов и соответствующие названиям кисти. Этот словарь указывается в коллекции объектов грамматик объекта, используемого для распознавания речи. При работе с этим объектом можно использовать и грамматику по умолчанию, в данном случае мы пользуемся собственным словарём.
Когда нажата кнопка запуска распознавания речи, программа переходит в режим непрерывного распознавания. Она ожидает голосовую команду, после чего пытается её распознать. Если распознавание выполнено успешно, в данном случае это означает, что уровень достоверности, описывающий точность сопоставления произнесенной фразы в активной грамматике не ниже среднего, приложение сообщает об изменении цвета и вызывает метод, который находит в словаре кистей, по ключу, соответствующему распознанной команде (названию цвета) подходящую кисть, эта кисть и применяется к заливке фигуры.
Для синтеза речи используется объект SpeechSynthesizer из пространства имен Windows.Phone.Speech.Synthesis (http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207489%28v=vs.105%29.aspx). Приложение, выводя сведения о распознанной (или нераспознанной) команде после попытки распознавания, проговаривает соответствующие сообщения.
Подробности о функциях работы с речью на платформе Windows Phone 8 и дополнительные примеры вы можете найти на странице "Speech recognition for Windows Phone 8" ("Распознавание речи для Windows Phone 8"), http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207021%28v=vs.105%29.aspx. Микрофон, встроенный в устройства, работающие под управлением Windows Phone, можно использовать и для записи речи. Пример такого использования микрофона можно найти на странице "Microphone sample" ("Работа с микрофоном"), http://code.msdn.microsoft.com/wpapps/Microphone-Sample-b2ebe8b6