Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 464 / 16 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 17:

Распознавание и синтез речи, работа с камерой

Аннотация: Данная лабораторная работа посвящена использованию функций распознавания и синтеза речи а так же описанию концепции фотоприложений.

Цель работы: освоить методы работы с системой распознавания и синтеза речи, освоить концепцию создания фотоприложений

Распознавание речи

Возможности платформы 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