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

Используйте распознавание речи для предоставления входных данных, указания действия или команды и выполнения задач.

Важные API: Windows.Media.SpeechRecognition

Распознавание речи состоит из среды выполнения речи, API распознавания для программирования среды выполнения, готовых к использованию грамматик для диктовки и веб-поиска, а также системного пользовательского интерфейса по умолчанию, помогающего пользователям обнаруживать и использовать функции распознавания речи.

Настройка распознавания речи

Для поддержки распознавания речи с приложением пользователь должен подключиться и включить микрофон на своем устройстве и принять политику конфиденциальности Майкрософт, предоставив приложению разрешение на его использование.

Чтобы автоматически запрашивать у пользователя разрешение на доступ к звуковому каналу микрофона и использовать его (пример из примера синтеза речи и синтеза речи, показанный ниже), просто задайте возможность устройства микрофона в манифесте пакета приложения. Дополнительные сведения см . в объявлениях возможностей приложений.

Политика конфиденциальности для доступа к микрофону

Если пользователь нажимает кнопку "Да", чтобы предоставить доступ к микрофону, приложение добавляется в список утвержденных приложений на странице "Параметры "> Конфиденциальность —> микрофон". Однако, так как пользователь может отключить этот параметр в любое время, необходимо убедиться, что ваше приложение имеет доступ к микрофону, прежде чем пытаться использовать его.

Если вы также хотите поддерживать диктовку, Кортана или другие службы распознавания речи (например, предопределенную грамматику, определенную в ограничении раздела), необходимо также подтвердить включение распознавания речи в Интернете (параметры —> конфиденциальность —> речь).

В этом фрагменте показано, как приложение может проверить, присутствует ли микрофон и имеет ли он разрешение на использование.

public class AudioCapturePermissions
{
    // If no microphone is present, an exception is thrown with the following HResult value.
    private static int NoCaptureDevicesHResult = -1072845856;

    /// <summary>
    /// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
    /// the Cortana/Dictation privacy check.
    ///
    /// You should perform this check every time the app gets focus, in case the user has changed
    /// the setting while the app was suspended or not in focus.
    /// </summary>
    /// <returns>True, if the microphone is available.</returns>
    public async static Task<bool> RequestMicrophonePermission()
    {
        try
        {
            // Request access to the audio capture device.
            MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();
            settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
            settings.MediaCategory = MediaCategory.Speech;
            MediaCapture capture = new MediaCapture();

            await capture.InitializeAsync(settings);
        }
        catch (TypeLoadException)
        {
            // Thrown when a media player is not available.
            var messageDialog = new Windows.UI.Popups.MessageDialog("Media player components are unavailable.");
            await messageDialog.ShowAsync();
            return false;
        }
        catch (UnauthorizedAccessException)
        {
            // Thrown when permission to use the audio capture device is denied.
            // If this occurs, show an error or disable recognition functionality.
            return false;
        }
        catch (Exception exception)
        {
            // Thrown when an audio capture device is not present.
            if (exception.HResult == NoCaptureDevicesHResult)
            {
                var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
                await messageDialog.ShowAsync();
                return false;
            }
            else
            {
                throw;
            }
        }
        return true;
    }
}
/// <summary>
/// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
/// the Cortana/Dictation privacy check.
///
/// You should perform this check every time the app gets focus, in case the user has changed
/// the setting while the app was suspended or not in focus.
/// </summary>
/// <returns>True, if the microphone is available.</returns>
IAsyncOperation<bool>^  AudioCapturePermissions::RequestMicrophonePermissionAsync()
{
    return create_async([]() 
    {
        try
        {
            // Request access to the audio capture device.
            MediaCaptureInitializationSettings^ settings = ref new MediaCaptureInitializationSettings();
            settings->StreamingCaptureMode = StreamingCaptureMode::Audio;
            settings->MediaCategory = MediaCategory::Speech;
            MediaCapture^ capture = ref new MediaCapture();

            return create_task(capture->InitializeAsync(settings))
                .then([](task<void> previousTask) -> bool
            {
                try
                {
                    previousTask.get();
                }
                catch (AccessDeniedException^)
                {
                    // Thrown when permission to use the audio capture device is denied.
                    // If this occurs, show an error or disable recognition functionality.
                    return false;
                }
                catch (Exception^ exception)
                {
                    // Thrown when an audio capture device is not present.
                    if (exception->HResult == AudioCapturePermissions::NoCaptureDevicesHResult)
                    {
                        auto messageDialog = ref new Windows::UI::Popups::MessageDialog("No Audio Capture devices are present on this system.");
                        create_task(messageDialog->ShowAsync());
                        return false;
                    }

                    throw;
                }
                return true;
            });
        }
        catch (Platform::ClassNotRegisteredException^ ex)
        {
            // Thrown when a media player is not available. 
            auto messageDialog = ref new Windows::UI::Popups::MessageDialog("Media Player Components unavailable.");
            create_task(messageDialog->ShowAsync());
            return create_task([] {return false; });
        }
    });
}
var AudioCapturePermissions = WinJS.Class.define(
    function () { }, {},
    {
        requestMicrophonePermission: function () {
            /// <summary>
            /// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
            /// the Cortana/Dictation privacy check.
            ///
            /// You should perform this check every time the app gets focus, in case the user has changed
            /// the setting while the app was suspended or not in focus.
            /// </summary>
            /// <returns>True, if the microphone is available.</returns>
            return new WinJS.Promise(function (completed, error) {

                try {
                    // Request access to the audio capture device.
                    var captureSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
                    captureSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio;
                    captureSettings.mediaCategory = Windows.Media.Capture.MediaCategory.speech;

                    var capture = new Windows.Media.Capture.MediaCapture();
                    capture.initializeAsync(captureSettings).then(function () {
                        completed(true);
                    },
                    function (error) {
                        // Audio Capture can fail to initialize if there's no audio devices on the system, or if
                        // the user has disabled permission to access the microphone in the Privacy settings.
                        if (error.number == -2147024891) { // Access denied (microphone disabled in settings)
                            completed(false);
                        } else if (error.number == -1072845856) { // No recording device present.
                            var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
                            messageDialog.showAsync();
                            completed(false);
                        } else {
                            error(error);
                        }
                    });
                } catch (exception) {
                    if (exception.number == -2147221164) { // REGDB_E_CLASSNOTREG
                        var messageDialog = new Windows.UI.Popups.MessageDialog("Media Player components not available on this system.");
                        messageDialog.showAsync();
                        return false;
                    }
                }
            });
        }
    })

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

Ограничение определяет слова и фразы (словарь), которые приложение распознает во входных данных речи. Ограничения находятся в основе распознавания речи и обеспечивают приложению больший контроль над точностью распознавания речи.

Для распознавания входных данных речи можно использовать следующие типы ограничений.

Предопределенные грамматики

Предопределенные диктовки и грамматики веб-поиска обеспечивают распознавание речи для приложения без необходимости создавать грамматику. При использовании этих грамматик распознавание речи выполняется удаленной веб-службой, а результаты возвращаются на устройство.

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

Грамматика веб-поиска, например грамматика диктовки, содержит большое количество слов и фраз, которые может сказать пользователь. Однако он оптимизирован для распознавания терминов, которые обычно используются при поиске в Интернете.

Примечание.

 Так как предопределенные диктовки и грамматики веб-поиска могут быть большими, и так как они находятся в сети (не на устройстве), производительность может быть не так быстро, как и с пользовательской грамматикой, установленной на устройстве.  

Эти предопределенные грамматики можно использовать для распознавания до 10 секунд ввода речи и не требует усилий по разработке в вашей части. Однако для них требуется подключение к сети.

Чтобы использовать ограничения веб-службы, поддержка ввода речи и диктовки должна быть включена в параметрах, включив параметр "Узнать меня" в разделе "Параметры " Конфиденциальность —>> речь, рукописный ввод и ввод.

Здесь мы покажем, как проверить, включен ли вход речи и открыть параметры — конфиденциальность —>> речь, рукописный ввод и ввод страницы, если нет.

Сначала мы инициализируем глобальную переменную (HResultPrivacyStatementDeclined) в значение HResult 0x80045509. См. сведения об обработке исключений в C# или Visual Basic.

private static uint HResultPrivacyStatementDeclined = 0x80045509;

Затем мы перехватим все стандартные исключения во время распознавания и проверяем, равно ли значение HResultPrivacyStatementDeclined. В этом случае мы отображаем предупреждение и вызов await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); , чтобы открыть страницу параметров.

catch (Exception exception)
{
  // Handle the speech privacy policy error.
  if ((uint)exception.HResult == HResultPrivacyStatementDeclined)
  {
    resultTextBlock.Visibility = Visibility.Visible;
    resultTextBlock.Text = "The privacy statement was declined." + 
      "Go to Settings -> Privacy -> Speech, inking and typing, and ensure you" +
      "have viewed the privacy policy, and 'Get To Know You' is enabled.";
    // Open the privacy/speech, inking, and typing settings page.
    await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); 
  }
  else
  {
    var messageDialog = new Windows.UI.Popups.MessageDialog(exception.Message, "Exception");
    await messageDialog.ShowAsync();
  }
}

См. раздел SpeechRecognitionTopicConstraint.

Ограничения программного списка

Ограничения программного списка обеспечивают упрощенный подход к созданию простых грамматик с помощью списка слов или фраз. Ограничение списка хорошо подходит для распознавания коротких, уникальных фраз. Явное указание всех слов в грамматике также повышает точность распознавания, так как подсистема распознавания речи должна обрабатывать только речь, чтобы подтвердить соответствие. Список также можно обновить программным способом.

Ограничение списка состоит из массива строк, представляющих входные данные речи, которые приложение принимает для операции распознавания. Вы можете создать ограничение списка в приложении, создав объект ограничения списка распознавания речи и передав массив строк. Затем добавьте этот объект в коллекцию ограничений распознавателя. Распознавание выполняется успешно, когда распознаватель речи распознает любую из строк в массиве.

См. раздел SpeechRecognitionListConstraint.

Грамматики SRGS

Грамматика грамматики распознавания речи (SRGS) является статическим документом, который, в отличие от ограничения программного списка, использует формат XML, определенный SRGS версии 1.0. Грамматика SRGS обеспечивает наибольший контроль над интерфейсом распознавания речи, позволяя записывать несколько семантических значений в одном распознавании.

См. раздел SpeechRecognitionGrammarFileConstraint.

Ограничения голосовых команд

Используйте XML-файл определения голосовой команды (VCD), чтобы определить команды, которые пользователь может сказать инициировать действия при активации приложения. Дополнительные сведения см. в статье "Активация приложения переднего плана с помощью голосовых команд через Кортана".

См. раздел SpeechRecognitionVoiceCommandDefinitionConstraint/

Обратите внимание , что используемый тип ограничения зависит от сложности создаваемого интерфейса распознавания. Любой может быть лучшим выбором для конкретной задачи распознавания, и вы можете найти использование для всех типов ограничений в приложении. Сведения о начале работы с ограничениями см. в разделе "Определение настраиваемых ограничений распознавания".

Предопределенная грамматика диктовки универсального приложения Для Windows распознает большинство слов и коротких фраз на языке. Он активируется по умолчанию, когда объект распознавателя речи создается без пользовательских ограничений.

В этом примере показано, как:

  • Создайте распознаватель речи.
  • Компилируйте ограничения универсального приложения Windows по умолчанию (грамматики не были добавлены в набор грамматики распознавателя речи).
  • Запустите прослушивание речи с помощью базового пользовательского интерфейса распознавания и отзывов TTS, предоставляемых методом RecognizeWithUIAsync . Используйте метод RecognizeAsync, если пользовательский интерфейс по умолчанию не требуется.
private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Compile the dictation grammar by default.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Настройка пользовательского интерфейса распознавания

Когда приложение пытается распознавание речи путем вызова SpeechRecognizer.RecognizeWithUIAsync, в следующем порядке отображаются несколько экранов.

Если вы используете ограничение на основе предопределенной грамматики (диктовки или веб-поиска):

  • Экран прослушивания .
  • Экран мышления .
  • Экран "Услышано" или экран ошибки.

Если вы используете ограничение на основе списка слов или фраз или ограничения на основе файла грамматики SRGS:

  • Экран прослушивания .
  • Экран сказал ли вы , если пользователь сказал, может быть интерпретирован как более одного потенциального результата.
  • Экран "Услышано" или экран ошибки.

На следующем рисунке показан пример потока между экранами для распознавателя речи, использующего ограничение на основе файла грамматики SRGS. В этом примере распознавание речи успешно выполнено.

Начальный экран распознавания для ограничения на основе файла грамматики sgrs

экран промежуточного распознавания для ограничения на основе файла грамматики sgrs

окончательный экран распознавания ограничения на основе файла грамматики sgrs

Экран прослушивания может содержать примеры слов или фраз, которые приложение может распознать. Здесь показано, как использовать свойства класса SpeechRecognizerUIOptions (полученного путем вызова свойства SpeechRecognizer.UIOptions) для настройки содержимого на экране прослушивания.

private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Listen for audio input issues.
    speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;

    // Add a web search grammar to the recognizer.
    var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");


    speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
    speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
    speechRecognizer.Constraints.Add(webSearchGrammar);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
    //await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Примеры