Распознавание и синтез речи, работа с камерой
Цель работы: освоить методы работы с системой распознавания и синтеза речи, освоить концепцию создания фотоприложений
Распознавание речи
Возможности платформы 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
