Краткое руководство. Распознавание намерений с помощью службы "Речь" и LUIS
Внимание
LUIS будет прекращен 1 октября 2025 года. По состоянию на 1 апреля 2023 г. невозможно создать новые ресурсы LUIS. Мы рекомендуем перенести приложения LUIS в понимание общения, чтобы воспользоваться продолжением поддержки продуктов и многоязычными возможностями.
Беседная Распознавание речи (CLU) доступна для C# и C++ с пакетом SDK службы "Речь" версии 1.25 или более поздней. Ознакомьтесь с кратким руководством по распознаванию намерений с помощью пакета SDK службы "Речь" и CLU.
Справочные примеры пакета документации | (NuGet) | Дополнительные примеры на GitHub
В этом кратком руководстве показано, как распознать намерения из звуковых данных, полученных с микрофона, с помощью пакета SDK для службы "Речь" и службы "Распознавание речи". В частности, вы будете использовать пакет SDK для службы "Речь" и предварительно созданную предметную область в службе "Распознавание речи", чтобы определить намерения для системы домашней автоматики, например включение или выключение света.
Необходимые компоненты
- Подписка Azure — создайте бесплатную учетную запись.
- Создайте ресурс языка в портал Azure. Используйте бесплатную ценовую категорию (
F0
), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды. Ресурс службы "Речь" в этот раз не требуется. - Получите ключ ресурса языка и регион. После развертывания ресурса службы "Язык" выберите Перейти к ресурсу для просмотра ключей и управления ими.
Создание приложения LUIS для распознавания намерений
Чтобы выполнить инструкции в кратком руководстве по распознаванию намерений, необходимо создать учетную запись LUIS и проект с помощью портала LUIS предварительной версии. Для работы с этим кратким руководством требуется подписка LUIS в регионе, где доступна возможность распознавания намерений. Подписка на службу "Речь" не является обязательной.
В первую очередь необходимо создать учетную запись и приложение LUIS с помощью портала LUIS предварительной версии. Это приложение LUIS будет использовать предварительно созданную предметную область для домашней автоматики, которая предоставляет намерения, сущности и примеры речевых фрагментов. Когда все будет готово, вы получите работающую в облаке конечную точку LUIS, вызываемую с использованием пакета SDK для службы "Речь".
Чтобы создать приложение LUIS, выполните эти инструкции:
Когда все будет готово, вам потребуется следующее:
- повторная публикация с включенным параметром подготовки речи;
- первичный ключ LUIS;
- расположение LUIS;
- идентификатор приложения LUIS.
Вот как найти эти данные на портале LUIS предварительной версии:
На портале предварительной версии LUIS выберите свое приложение и нажмите кнопку Опубликовать.
Выберите рабочий слот, если используете
en-US
. Выберите Изменить параметры и установите переключатель параметра Подготовка речи в положение Вкл.. Затем нажмите кнопку Опубликовать.Внимание
Настоятельно рекомендуем включить подготовку речи. Это повысит точность распознавания речи.
На портале выберите вкладку Управление, а затем раздел Ресурсы Azure. На этой странице вы найдете ключ и расположение LUIS (иногда оно называется регионом) для ресурса прогнозирования LUIS.
Когда вы получите ключ и расположение, потребуется идентификатор приложения. Выберите Параметры. ИД вашего приложения доступно на этой странице.
Откройте проект в Visual Studio.
Затем откройте проект в Visual Studio.
- Запустите Visual Studio 2019.
- Загрузите проект и откройте
Program.cs
.
Добавление стандартного кода
Добавим код, который выступает в качестве основы для нашего проекта. Имейте в виду, что вы создали асинхронный метод RecognizeIntentAsync()
.
using System;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Intent;
namespace helloworld
{
class Program
{
public static async Task RecognizeIntentAsync()
{
}
static async Task Main()
{
await RecognizeIntentAsync();
Console.WriteLine("Please press <Return> to continue.");
Console.ReadLine();
}
}
}
Создание конфигурации службы "Речь"
Прежде чем инициализировать объект IntentRecognizer
, необходимо создать конфигурацию, использующую ключ и расположение ресурса прогнозирования LUIS.
Внимание
Ключ для начала работы и ключ разработки не будут работать. Необходимо использовать ранее созданные ключ прогнозирования и расположение. Дополнительные сведения см. в разделе Создание приложения LUIS для распознавания намерений.
Вставьте код в метод RecognizeIntentAsync()
. Обязательно обновите следующие значения:
- Замените
"YourLanguageUnderstandingSubscriptionKey"
ключом прогнозирования LUIS. - Замените
"YourLanguageUnderstandingServiceRegion"
расположением LUIS. Использование идентификатор региона из региона
Совет
Если вам нужна помощь с поиском этих значений, перейдите к разделу Создание приложения LUIS для распознавания намерений.
Внимание
Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.
var config = SpeechConfig.FromSubscription(
"YourLanguageUnderstandingSubscriptionKey",
"YourLanguageUnderstandingServiceRegion");
В этом примере для создания SpeechConfig
используется метод FromSubscription()
. Полный список доступных методов см. в статье SpeechConfig Class (Класс SpeechConfig).
Пакет SDK для службы "Речь" по умолчанию распознает использование языкового стандарта en-us. Сведения о выборе исходного языка см. в разделе об изменении исходного языка.
Инициализация объекта IntentRecognizer
Теперь создадим объект IntentRecognizer
. Этот объект создается внутри оператора using для обеспечения надлежащего выпуска неуправляемых ресурсов. Вставьте этот код в метод RecognizeIntentAsync()
непосредственно под конфигурацией службы "Речь".
// Creates an intent recognizer using microphone as audio input.
using (var recognizer = new IntentRecognizer(config))
{
}
Добавление модели LanguageUnderstandingModel и намерений
Необходимо сопоставить объект LanguageUnderstandingModel
с распознавателем намерений и добавить намерения, которые необходимо распознать. Мы будем использовать намерения из предварительно созданной предметной области для системы домашней автоматики. Вставьте этот код в оператор using из предыдущего раздела. Обязательно замените "YourLanguageUnderstandingAppId"
идентификатором приложения LUIS.
Совет
Если вам нужна помощь с поиском этих значений, перейдите к разделу Создание приложения LUIS для распознавания намерений.
// Creates a Language Understanding model using the app id, and adds specific intents from your model
var model = LanguageUnderstandingModel.FromAppId("YourLanguageUnderstandingAppId");
recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName1", "id1");
recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName2", "id2");
recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here");
В этом примере функция AddIntent()
используется для индивидуального добавления намерений. Если требуется добавить все намерения из модели, используйте AddAllIntents(model)
и передайте модель.
Распознавание намерения
В объекте IntentRecognizer
необходимо вызвать метод RecognizeOnceAsync()
. С помощью этого метода служба "Речь" узнает, что для распознавания отправляется одна фраза и что после идентификации фразы необходимо остановить распознавание речи.
В операторе using добавьте указанный ниже код под строкой модели.
// Starts recognizing.
Console.WriteLine("Say something...");
// Starts intent recognition, and returns after a single utterance is recognized. The end of a
// single utterance is determined by listening for silence at the end or until a maximum of about 30
// seconds of audio is processed. The task returns the recognition text as result.
// Note: Since RecognizeOnceAsync() returns only a single utterance, it is suitable only for single
// shot recognition like command or query.
// For long-running multi-utterance recognition, use StartContinuousRecognitionAsync() instead.
var result = await recognizer.RecognizeOnceAsync();
Отображение результатов распознавания (или ошибок)
Когда служба "Речь" возвращает результат распознавания, необходимо с ним что-то сделать. Мы оставим его как есть и выведем результат в консоли.
В операторе using под RecognizeOnceAsync()
добавьте этот код:
// Checks result.
switch (result.Reason)
{
case ResultReason.RecognizedIntent:
Console.WriteLine($"RECOGNIZED: Text={result.Text}");
Console.WriteLine($" Intent Id: {result.IntentId}.");
var json = result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult);
Console.WriteLine($" Language Understanding JSON: {json}.");
break;
case ResultReason.RecognizedSpeech:
Console.WriteLine($"RECOGNIZED: Text={result.Text}");
Console.WriteLine($" Intent not recognized.");
break;
case ResultReason.NoMatch:
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
break;
case ResultReason.Canceled:
var cancellation = CancellationDetails.FromResult(result);
Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");
if (cancellation.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}");
Console.WriteLine($"CANCELED: Did you update the subscription info?");
}
break;
}
Проверка кода
На этом этапе код должен выглядеть так:
Примечание.
Мы добавили несколько комментариев к этой версии.
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
// <skeleton_1>
using System;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Intent;
namespace helloworld
{
class Program
{
public static async Task RecognizeIntentAsync()
{
// </skeleton_1>
// Creates an instance of a speech config with specified subscription key
// and service region. Note that in contrast to other services supported by
// the Cognitive Services Speech SDK, the Language Understanding service
// requires a specific subscription key from https://www.luis.ai/.
// The Language Understanding service calls the required key 'endpoint key'.
// Once you've obtained it, replace with below with your own Language Understanding subscription key
// and service region (e.g., "westus").
// The default language is "en-us".
// <create_speech_configuration>
var config = SpeechConfig.FromSubscription(
"YourLanguageUnderstandingSubscriptionKey",
"YourLanguageUnderstandingServiceRegion");
// </create_speech_configuration>
// <create_intent_recognizer_1>
// Creates an intent recognizer using microphone as audio input.
using (var recognizer = new IntentRecognizer(config))
{
// </create_intent_recognizer_1>
// <add_intents>
// Creates a Language Understanding model using the app id, and adds specific intents from your model
var model = LanguageUnderstandingModel.FromAppId("YourLanguageUnderstandingAppId");
recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName1", "id1");
recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName2", "id2");
recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here");
// </add_intents>
// To add all of the possible intents from a LUIS model to the recognizer, uncomment the line below:
// recognizer.AddAllIntents(model);
// <recognize_intent>
// Starts recognizing.
Console.WriteLine("Say something...");
// Starts intent recognition, and returns after a single utterance is recognized. The end of a
// single utterance is determined by listening for silence at the end or until a maximum of about 30
// seconds of audio is processed. The task returns the recognition text as result.
// Note: Since RecognizeOnceAsync() returns only a single utterance, it is suitable only for single
// shot recognition like command or query.
// For long-running multi-utterance recognition, use StartContinuousRecognitionAsync() instead.
var result = await recognizer.RecognizeOnceAsync();
// </recognize_intent>
// <print_results>
// Checks result.
switch (result.Reason)
{
case ResultReason.RecognizedIntent:
Console.WriteLine($"RECOGNIZED: Text={result.Text}");
Console.WriteLine($" Intent Id: {result.IntentId}.");
var json = result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult);
Console.WriteLine($" Language Understanding JSON: {json}.");
break;
case ResultReason.RecognizedSpeech:
Console.WriteLine($"RECOGNIZED: Text={result.Text}");
Console.WriteLine($" Intent not recognized.");
break;
case ResultReason.NoMatch:
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
break;
case ResultReason.Canceled:
var cancellation = CancellationDetails.FromResult(result);
Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");
if (cancellation.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}");
Console.WriteLine($"CANCELED: Did you update the subscription info?");
}
break;
}
// </print_results>
// <create_intent_recognizer_2>
}
// </create_intent_recognizer_2>
// <skeleton_2>
}
static async Task Main()
{
await RecognizeIntentAsync();
Console.WriteLine("Please press <Return> to continue.");
Console.ReadLine();
}
}
}
// </skeleton_2>
Создание и запуск приложения
Теперь можно приступать к созданию приложения и проверке распознавания речи, используя службу "Речь".
- Скомпилируйте код. В строке меню Visual Studio последовательно выберите Сборка>Собрать решение.
- Запустите приложение. В строке меню выберите Отладка>Начать отладку или нажмите клавишу F5.
- Начните распознавание. Вам будет предложено произнести фразу на английском языке. Речь, записанная в виде текста, отправляется в службу "Речь" и выводится в консоли.
Справочные примеры пакета документации | (NuGet) | Дополнительные примеры на GitHub
В этом кратком руководстве показано, как распознать намерения из звуковых данных, полученных с микрофона, с помощью пакета SDK для службы "Речь" и службы "Распознавание речи". В частности, вы будете использовать пакет SDK для службы "Речь" и предварительно созданную предметную область в службе "Распознавание речи", чтобы определить намерения для системы домашней автоматики, например включение или выключение света.
Необходимые компоненты
- Подписка Azure — создайте бесплатную учетную запись.
- Создайте ресурс языка в портал Azure. Используйте бесплатную ценовую категорию (
F0
), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды. Ресурс службы "Речь" в этот раз не требуется. - Получите ключ ресурса языка и регион. После развертывания ресурса службы "Язык" выберите Перейти к ресурсу для просмотра ключей и управления ими.
Создание приложения LUIS для распознавания намерений
Чтобы выполнить инструкции в кратком руководстве по распознаванию намерений, необходимо создать учетную запись LUIS и проект с помощью портала LUIS предварительной версии. Для работы с этим кратким руководством требуется подписка LUIS в регионе, где доступна возможность распознавания намерений. Подписка на службу "Речь" не является обязательной.
В первую очередь необходимо создать учетную запись и приложение LUIS с помощью портала LUIS предварительной версии. Это приложение LUIS будет использовать предварительно созданную предметную область для домашней автоматики, которая предоставляет намерения, сущности и примеры речевых фрагментов. Когда все будет готово, вы получите работающую в облаке конечную точку LUIS, вызываемую с использованием пакета SDK для службы "Речь".
Чтобы создать приложение LUIS, выполните эти инструкции:
Когда все будет готово, вам потребуется следующее:
- повторная публикация с включенным параметром подготовки речи;
- первичный ключ LUIS;
- расположение LUIS;
- идентификатор приложения LUIS.
Вот как найти эти данные на портале LUIS предварительной версии:
На портале предварительной версии LUIS выберите свое приложение и нажмите кнопку Опубликовать.
Выберите рабочий слот, если используете
en-US
. Выберите Изменить параметры и установите переключатель параметра Подготовка речи в положение Вкл.. Затем нажмите кнопку Опубликовать.Внимание
Настоятельно рекомендуем включить подготовку речи. Это повысит точность распознавания речи.
На портале выберите вкладку Управление, а затем раздел Ресурсы Azure. На этой странице вы найдете ключ и расположение LUIS (иногда оно называется регионом) для ресурса прогнозирования LUIS.
Когда вы получите ключ и расположение, потребуется идентификатор приложения. Выберите Параметры. ИД вашего приложения доступно на этой странице.
Откройте проект в Visual Studio.
Затем откройте проект в Visual Studio.
- Запустите Visual Studio 2019.
- Загрузите проект и откройте
helloworld.cpp
.
Добавление стандартного кода
Добавим код, который выступает в качестве основы для нашего проекта. Имейте в виду, что вы создали асинхронный метод recognizeIntent()
.
#include "stdafx.h"
#include <iostream>
#include <speechapi_cxx.h>
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
using namespace Microsoft::CognitiveServices::Speech::Intent;
void recognizeIntent()
{
}
int wmain()
{
try
{
recognizeIntent();
}
catch (exception e)
{
cout << e.what();
}
cout << "Please press a key to continue.\n";
cin.get();
return 0;
}
Создание конфигурации службы "Речь"
Прежде чем инициализировать объект IntentRecognizer
, необходимо создать конфигурацию, использующую ключ и расположение ресурса прогнозирования LUIS.
Внимание
Ключ для начала работы и ключ разработки не будут работать. Необходимо использовать ранее созданные ключ прогнозирования и расположение. Дополнительные сведения см. в разделе Создание приложения LUIS для распознавания намерений.
Вставьте код в метод recognizeIntent()
. Обязательно обновите следующие значения:
- Замените
"YourLanguageUnderstandingSubscriptionKey"
ключом прогнозирования LUIS. - Замените
"YourLanguageUnderstandingServiceRegion"
расположением LUIS. Использование идентификатор региона из региона
Совет
Если вам нужна помощь с поиском этих значений, перейдите к разделу Создание приложения LUIS для распознавания намерений.
Внимание
Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.
auto config = SpeechConfig::FromSubscription(
"YourLanguageUnderstandingSubscriptionKey",
"YourLanguageUnderstandingServiceRegion");
В этом примере для создания SpeechConfig
используется метод FromSubscription()
. Полный список доступных методов см. в статье SpeechConfig Class (Класс SpeechConfig).
Пакет SDK для службы "Речь" по умолчанию распознает использование языкового стандарта en-us. Сведения о выборе исходного языка см. в разделе об изменении исходного языка.
Инициализация объекта IntentRecognizer
Теперь создадим объект IntentRecognizer
. Вставьте этот код в метод recognizeIntent()
непосредственно под конфигурацией службы "Речь".
// Creates an intent recognizer using microphone as audio input.
auto recognizer = IntentRecognizer::FromConfig(config);
Добавление модели LanguageUnderstandingModel и намерений
Необходимо сопоставить объект LanguageUnderstandingModel
с распознавателем намерений и добавить намерения, которые необходимо распознать. Мы будем использовать намерения из предварительно созданной предметной области для системы домашней автоматики.
Вставьте приведенный ниже код под строкой вашего IntentRecognizer
. Обязательно замените "YourLanguageUnderstandingAppId"
идентификатором приложения LUIS.
Совет
Если вам нужна помощь с поиском этих значений, перейдите к разделу Создание приложения LUIS для распознавания намерений.
// Creates a Language Understanding model using the app id, and adds specific intents from your model
auto model = LanguageUnderstandingModel::FromAppId("YourLanguageUnderstandingAppId");
recognizer->AddIntent(model, "YourLanguageUnderstandingIntentName1", "id1");
recognizer->AddIntent(model, "YourLanguageUnderstandingIntentName2", "id2");
recognizer->AddIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here");
В этом примере функция AddIntent()
используется для индивидуального добавления намерений. Если требуется добавить все намерения из модели, используйте AddAllIntents(model)
и передайте модель.
Распознавание намерения
В объекте IntentRecognizer
необходимо вызвать метод RecognizeOnceAsync()
. С помощью этого метода служба "Речь" узнает, что для распознавания отправляется одна фраза и что после идентификации фразы необходимо остановить распознавание речи. Для удобства мы дождемся завершения возврата.
Вставьте приведенный ниже код под строкой модели:
cout << "Say something...\n";
// Starts intent recognition, and returns after a single utterance is recognized. The end of a
// single utterance is determined by listening for silence at the end or until a maximum of about 30
// seconds of audio is processed. The task returns the recognition text as result.
// Note: Since RecognizeOnceAsync() returns only a single utterance, it is suitable only for single
// shot recognition like command or query.
// For long-running multi-utterance recognition, use StartContinuousRecognitionAsync() instead.
auto result = recognizer->RecognizeOnceAsync().get();
Отображение результатов распознавания (или ошибок)
Когда служба "Речь" возвращает результат распознавания, необходимо с ним что-то сделать. Мы оставим его как есть и выведем результат в консоли.
Вставьте код ниже под строкой auto result = recognizer->RecognizeOnceAsync().get();
.
// Checks result.
if (result->Reason == ResultReason::RecognizedIntent)
{
cout << "RECOGNIZED: Text=" << result->Text << std::endl;
cout << " Intent Id: " << result->IntentId << std::endl;
cout << " Intent Service JSON: " << result->Properties.GetProperty(PropertyId::LanguageUnderstandingServiceResponse_JsonResult) << std::endl;
}
else if (result->Reason == ResultReason::RecognizedSpeech)
{
cout << "RECOGNIZED: Text=" << result->Text << " (intent could not be recognized)" << std::endl;
}
else if (result->Reason == ResultReason::NoMatch)
{
cout << "NOMATCH: Speech could not be recognized." << std::endl;
}
else if (result->Reason == ResultReason::Canceled)
{
auto cancellation = CancellationDetails::FromResult(result);
cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
if (cancellation->Reason == CancellationReason::Error)
{
cout << "CANCELED: ErrorCode=" << (int)cancellation->ErrorCode << std::endl;
cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
cout << "CANCELED: Did you update the subscription info?" << std::endl;
}
}
Проверка кода
На этом этапе код должен выглядеть так:
Примечание.
Мы добавили несколько комментариев к этой версии.
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
// <skeleton_1>
#include "stdafx.h"
#include <iostream>
#include <speechapi_cxx.h>
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
using namespace Microsoft::CognitiveServices::Speech::Intent;
void recognizeIntent()
{
// </skeleton_1>
// Creates an instance of a speech config with specified subscription key
// and service region. Note that in contrast to other services supported by
// the Cognitive Services Speech SDK, the Language Understanding service
// requires a specific subscription key from https://www.luis.ai/.
// The Language Understanding service calls the required key 'endpoint key'.
// Once you've obtained it, replace with below with your own Language Understanding subscription key
// and service region (e.g., "westus").
// The default recognition language is "en-us".
// <create_speech_configuration>
auto config = SpeechConfig::FromSubscription(
"YourLanguageUnderstandingSubscriptionKey",
"YourLanguageUnderstandingServiceRegion");
// </create_speech_configuration>
// <create_intent_recognizer>
// Creates an intent recognizer using microphone as audio input.
auto recognizer = IntentRecognizer::FromConfig(config);
// </create_intent_recognizer>
// <add_intents>
// Creates a Language Understanding model using the app id, and adds specific intents from your model
auto model = LanguageUnderstandingModel::FromAppId("YourLanguageUnderstandingAppId");
recognizer->AddIntent(model, "YourLanguageUnderstandingIntentName1", "id1");
recognizer->AddIntent(model, "YourLanguageUnderstandingIntentName2", "id2");
recognizer->AddIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here");
// </add_intents>
// To add all of the possible intents from a LUIS model to the recognizer, uncomment the line below:
// recognizer->AddAllIntents(model);
// <recognize_intent>
cout << "Say something...\n";
// Starts intent recognition, and returns after a single utterance is recognized. The end of a
// single utterance is determined by listening for silence at the end or until a maximum of about 30
// seconds of audio is processed. The task returns the recognition text as result.
// Note: Since RecognizeOnceAsync() returns only a single utterance, it is suitable only for single
// shot recognition like command or query.
// For long-running multi-utterance recognition, use StartContinuousRecognitionAsync() instead.
auto result = recognizer->RecognizeOnceAsync().get();
// </recognize_intent>
// <print_results>
// Checks result.
if (result->Reason == ResultReason::RecognizedIntent)
{
cout << "RECOGNIZED: Text=" << result->Text << std::endl;
cout << " Intent Id: " << result->IntentId << std::endl;
cout << " Intent Service JSON: " << result->Properties.GetProperty(PropertyId::LanguageUnderstandingServiceResponse_JsonResult) << std::endl;
}
else if (result->Reason == ResultReason::RecognizedSpeech)
{
cout << "RECOGNIZED: Text=" << result->Text << " (intent could not be recognized)" << std::endl;
}
else if (result->Reason == ResultReason::NoMatch)
{
cout << "NOMATCH: Speech could not be recognized." << std::endl;
}
else if (result->Reason == ResultReason::Canceled)
{
auto cancellation = CancellationDetails::FromResult(result);
cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
if (cancellation->Reason == CancellationReason::Error)
{
cout << "CANCELED: ErrorCode=" << (int)cancellation->ErrorCode << std::endl;
cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
cout << "CANCELED: Did you update the subscription info?" << std::endl;
}
}
// </print_results>
// <skeleton_2>
}
int wmain()
{
try
{
recognizeIntent();
}
catch (exception e)
{
cout << e.what();
}
cout << "Please press a key to continue.\n";
cin.get();
return 0;
}
// </skeleton_2>
Создание и запуск приложения
Теперь можно приступать к созданию приложения и проверке распознавания речи, используя службу "Речь".
- Скомпилируйте код. В строке меню Visual Studio последовательно выберите Сборка>Собрать решение.
- Запустите приложение. В строке меню выберите Отладка>Начать отладку или нажмите клавишу F5.
- Начните распознавание. Вам будет предложено произнести фразу на английском языке. Речь, записанная в виде текста, отправляется в службу "Речь" и выводится в консоли.
Справочная документация | по Дополнительным примерам на GitHub
В этом кратком руководстве показано, как распознать намерения из звуковых данных, полученных с микрофона, с помощью пакета SDK для службы "Речь" и службы "Распознавание речи". В частности, вы будете использовать пакет SDK для службы "Речь" и предварительно созданную предметную область в службе "Распознавание речи", чтобы определить намерения для системы домашней автоматики, например включение или выключение света.
Необходимые компоненты
- Подписка Azure — создайте бесплатную учетную запись.
- Создайте ресурс языка в портал Azure. Используйте бесплатную ценовую категорию (
F0
), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды. Ресурс службы "Речь" в этот раз не требуется. - Получите ключ ресурса языка и регион. После развертывания ресурса службы "Язык" выберите Перейти к ресурсу для просмотра ключей и управления ими.
Вам также потребуется установить пакет SDK службы "Речь" для среды разработки и создать пустой пример проекта.
Создание приложения LUIS для распознавания намерений
Чтобы выполнить инструкции в кратком руководстве по распознаванию намерений, необходимо создать учетную запись LUIS и проект с помощью портала LUIS предварительной версии. Для работы с этим кратким руководством требуется подписка LUIS в регионе, где доступна возможность распознавания намерений. Подписка на службу "Речь" не является обязательной.
В первую очередь необходимо создать учетную запись и приложение LUIS с помощью портала LUIS предварительной версии. Это приложение LUIS будет использовать предварительно созданную предметную область для домашней автоматики, которая предоставляет намерения, сущности и примеры речевых фрагментов. Когда все будет готово, вы получите работающую в облаке конечную точку LUIS, вызываемую с использованием пакета SDK для службы "Речь".
Чтобы создать приложение LUIS, выполните эти инструкции:
Когда все будет готово, вам потребуется следующее:
- повторная публикация с включенным параметром подготовки речи;
- первичный ключ LUIS;
- расположение LUIS;
- идентификатор приложения LUIS.
Вот как найти эти данные на портале LUIS предварительной версии:
На портале предварительной версии LUIS выберите свое приложение и нажмите кнопку Опубликовать.
Выберите рабочий слот, если используете
en-US
. Выберите Изменить параметры и установите переключатель параметра Подготовка речи в положение Вкл.. Затем нажмите кнопку Опубликовать.Внимание
Настоятельно рекомендуем включить подготовку речи. Это повысит точность распознавания речи.
На портале выберите вкладку Управление, а затем раздел Ресурсы Azure. На этой странице вы найдете ключ и расположение LUIS (иногда оно называется регионом) для ресурса прогнозирования LUIS.
Когда вы получите ключ и расположение, потребуется идентификатор приложения. Выберите Параметры. ИД вашего приложения доступно на этой странице.
Открытие вашего проекта
- Откройте предпочтительную интегрированную среду разработки.
- Загрузите проект и откройте
Main.java
.
Добавление стандартного кода
Добавим код, который выступает в качестве основы для нашего проекта.
package speechsdk.quickstart;
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.intent.*;
/**
* Quickstart: recognize speech using the Speech SDK for Java.
*/
public class Main {
/**
* @param args Arguments are ignored in this sample.
*/
public static void main(String[] args) {
} catch (Exception ex) {
System.out.println("Unexpected exception: " + ex.getMessage());
assert(false);
System.exit(1);
}
}
}
Создание конфигурации службы "Речь"
Прежде чем инициализировать объект IntentRecognizer
, необходимо создать конфигурацию, использующую ключ и расположение ресурса прогнозирования LUIS.
Вставьте этот код в блок try / catch в main()
. Обязательно обновите следующие значения:
- Замените
"YourLanguageUnderstandingSubscriptionKey"
ключом прогнозирования LUIS. - Замените
"YourLanguageUnderstandingServiceRegion"
расположением LUIS. Используйте идентификатор региона из региона
Совет
Если вам нужна помощь с поиском этих значений, перейдите к разделу Создание приложения LUIS для распознавания намерений.
Внимание
Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.
// Replace below with with specified subscription key (called 'endpoint key' by the Language Understanding service)
String languageUnderstandingSubscriptionKey = "YourLanguageUnderstandingSubscriptionKey";
// Replace below with your own service region (e.g., "westus").
String languageUnderstandingServiceRegion = "YourLanguageUnderstandingServiceRegion";
// Creates an instance of intent recognizer with a given speech configuration.
// Recognizer is created with the default microphone audio input and default language "en-us".
try (SpeechConfig config = SpeechConfig.fromSubscription(languageUnderstandingSubscriptionKey, languageUnderstandingServiceRegion);
В этом примере для создания SpeechConfig
используется метод FromSubscription()
. Полный список доступных методов см. в статье SpeechConfig Class (Класс SpeechConfig).
Пакет SDK для службы "Речь" по умолчанию распознает использование языкового стандарта en-us. Сведения о выборе исходного языка см. в разделе об изменении исходного языка.
Инициализация объекта IntentRecognizer
Теперь создадим объект IntentRecognizer
. Вставьте этот код непосредственно под конфигурацией службы "Речь".
IntentRecognizer recognizer = new IntentRecognizer(config)) {
Добавление модели LanguageUnderstandingModel и намерений
Необходимо сопоставить объект LanguageUnderstandingModel
с распознавателем намерений и добавить намерения, которые необходимо распознать. Мы будем использовать намерения из предварительно созданной предметной области для системы домашней автоматики.
Вставьте приведенный ниже код под строкой вашего IntentRecognizer
. Обязательно замените "YourLanguageUnderstandingAppId"
идентификатором приложения LUIS.
Совет
Если вам нужна помощь с поиском этих значений, перейдите к разделу Создание приложения LUIS для распознавания намерений.
// Creates a language understanding model using the app id, and adds specific intents from your model
LanguageUnderstandingModel model = LanguageUnderstandingModel.fromAppId("YourLanguageUnderstandingAppId");
recognizer.addIntent(model, "YourLanguageUnderstandingIntentName1", "id1");
recognizer.addIntent(model, "YourLanguageUnderstandingIntentName2", "id2");
recognizer.addIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here");
В этом примере функция addIntent()
используется для индивидуального добавления намерений. Если требуется добавить все намерения из модели, используйте addAllIntents(model)
и передайте модель.
Распознавание намерения
В объекте IntentRecognizer
необходимо вызвать метод recognizeOnceAsync()
. С помощью этого метода служба "Речь" узнает, что для распознавания отправляется одна фраза и что после идентификации фразы необходимо остановить распознавание речи.
Вставьте приведенный ниже код под строкой модели:
System.out.println("Say something...");
// Starts recognition. It returns when the first utterance has been recognized.
IntentRecognitionResult result = recognizer.recognizeOnceAsync().get();
Отображение результатов распознавания (или ошибок)
Когда служба "Речь" возвращает результат распознавания, необходимо с ним что-то сделать. Мы оставим его как есть и выведем результат в консоли.
Вставьте приведенный ниже код под вызовом recognizeOnceAsync()
.
// Checks result.
if (result.getReason() == ResultReason.RecognizedIntent) {
System.out.println("RECOGNIZED: Text=" + result.getText());
System.out.println(" Intent Id: " + result.getIntentId());
System.out.println(" Intent Service JSON: " + result.getProperties().getProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult));
}
else if (result.getReason() == ResultReason.RecognizedSpeech) {
System.out.println("RECOGNIZED: Text=" + result.getText());
System.out.println(" Intent not recognized.");
}
else if (result.getReason() == ResultReason.NoMatch) {
System.out.println("NOMATCH: Speech could not be recognized.");
}
else if (result.getReason() == ResultReason.Canceled) {
CancellationDetails cancellation = CancellationDetails.fromResult(result);
System.out.println("CANCELED: Reason=" + cancellation.getReason());
if (cancellation.getReason() == CancellationReason.Error) {
System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
System.out.println("CANCELED: Did you update the subscription info?");
}
}
Проверка кода
На этом этапе код должен выглядеть так:
Примечание.
Мы добавили несколько комментариев к этой версии.
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
// <skeleton_1>
package speechsdk.quickstart;
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.intent.*;
/**
* Quickstart: recognize speech using the Speech SDK for Java.
*/
public class Main {
/**
* @param args Arguments are ignored in this sample.
*/
public static void main(String[] args) {
// </skeleton_1>
// <create_speech_configuration>
// Replace below with with specified subscription key (called 'endpoint key' by the Language Understanding service)
String languageUnderstandingSubscriptionKey = "YourLanguageUnderstandingSubscriptionKey";
// Replace below with your own service region (e.g., "westus").
String languageUnderstandingServiceRegion = "YourLanguageUnderstandingServiceRegion";
// Creates an instance of intent recognizer with a given speech configuration.
// Recognizer is created with the default microphone audio input and default language "en-us".
try (SpeechConfig config = SpeechConfig.fromSubscription(languageUnderstandingSubscriptionKey, languageUnderstandingServiceRegion);
// </create_speech_configuration>
// <create_intent_recognizer>
IntentRecognizer recognizer = new IntentRecognizer(config)) {
// </create_intent_recognizer>
// <add_intents>
// Creates a language understanding model using the app id, and adds specific intents from your model
LanguageUnderstandingModel model = LanguageUnderstandingModel.fromAppId("YourLanguageUnderstandingAppId");
recognizer.addIntent(model, "YourLanguageUnderstandingIntentName1", "id1");
recognizer.addIntent(model, "YourLanguageUnderstandingIntentName2", "id2");
recognizer.addIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here");
// </add_intents>
// To add all of the possible intents from a LUIS model to the recognizer, uncomment the line below:
// recognizer.addAllIntents(model);
// <recognize_intent>
System.out.println("Say something...");
// Starts recognition. It returns when the first utterance has been recognized.
IntentRecognitionResult result = recognizer.recognizeOnceAsync().get();
// </recognize_intent>
// <print_result>
// Checks result.
if (result.getReason() == ResultReason.RecognizedIntent) {
System.out.println("RECOGNIZED: Text=" + result.getText());
System.out.println(" Intent Id: " + result.getIntentId());
System.out.println(" Intent Service JSON: " + result.getProperties().getProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult));
}
else if (result.getReason() == ResultReason.RecognizedSpeech) {
System.out.println("RECOGNIZED: Text=" + result.getText());
System.out.println(" Intent not recognized.");
}
else if (result.getReason() == ResultReason.NoMatch) {
System.out.println("NOMATCH: Speech could not be recognized.");
}
else if (result.getReason() == ResultReason.Canceled) {
CancellationDetails cancellation = CancellationDetails.fromResult(result);
System.out.println("CANCELED: Reason=" + cancellation.getReason());
if (cancellation.getReason() == CancellationReason.Error) {
System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
System.out.println("CANCELED: Did you update the subscription info?");
}
}
// </print_result>
// <skeleton_2>
} catch (Exception ex) {
System.out.println("Unexpected exception: " + ex.getMessage());
assert(false);
System.exit(1);
}
}
}
// </skeleton_2>
Создание и запуск приложения
Нажмите клавишу F11 или выберите Запустить>Отладка. Слова, произносимые в микрофон, в течение следующих 15 секунд будут распознаны и записаны в окне консоли.
Справочные примеры пакета документации | (npm) | Дополнительные примеры в исходном коде библиотеки GitHub |
В этом кратком руководстве показано, как распознать намерения из звуковых данных, полученных с микрофона, с помощью пакета SDK для службы "Речь" и службы "Распознавание речи". В частности, вы будете использовать пакет SDK для службы "Речь" и предварительно созданную предметную область в службе "Распознавание речи", чтобы определить намерения для системы домашней автоматики, например включение или выключение света.
Необходимые компоненты
- Подписка Azure — создайте бесплатную учетную запись.
- Создайте ресурс языка в портал Azure. Используйте бесплатную ценовую категорию (
F0
), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды. Ресурс службы "Речь" в этот раз не требуется. - Получите ключ ресурса языка и регион. После развертывания ресурса службы "Язык" выберите Перейти к ресурсу для просмотра ключей и управления ими.
Вам также потребуется установить пакет SDK службы "Речь" для среды разработки и создать пустой пример проекта.
Создание приложения LUIS для распознавания намерений
Чтобы выполнить инструкции в кратком руководстве по распознаванию намерений, необходимо создать учетную запись LUIS и проект с помощью портала LUIS предварительной версии. Для работы с этим кратким руководством требуется подписка LUIS в регионе, где доступна возможность распознавания намерений. Подписка на службу "Речь" не является обязательной.
В первую очередь необходимо создать учетную запись и приложение LUIS с помощью портала LUIS предварительной версии. Это приложение LUIS будет использовать предварительно созданную предметную область для домашней автоматики, которая предоставляет намерения, сущности и примеры речевых фрагментов. Когда все будет готово, вы получите работающую в облаке конечную точку LUIS, вызываемую с использованием пакета SDK для службы "Речь".
Чтобы создать приложение LUIS, выполните эти инструкции:
Когда все будет готово, вам потребуется следующее:
- повторная публикация с включенным параметром подготовки речи;
- первичный ключ LUIS;
- расположение LUIS;
- идентификатор приложения LUIS.
Вот как найти эти данные на портале LUIS предварительной версии:
На портале предварительной версии LUIS выберите свое приложение и нажмите кнопку Опубликовать.
Выберите рабочий слот, если используете
en-US
. Выберите Изменить параметры и установите переключатель параметра Подготовка речи в положение Вкл.. Затем нажмите кнопку Опубликовать.Внимание
Настоятельно рекомендуем включить подготовку речи. Это повысит точность распознавания речи.
На портале выберите вкладку Управление, а затем раздел Ресурсы Azure. На этой странице вы найдете ключ и расположение LUIS (иногда оно называется регионом) для ресурса прогнозирования LUIS.
Когда вы получите ключ и расположение, потребуется идентификатор приложения. Выберите Параметры. ИД вашего приложения доступно на этой странице.
Добавление стандартного кода
Добавим код, который выступает в качестве основы для нашего проекта.
<!DOCTYPE html>
<html>
<head>
<title>Microsoft Azure AI Speech SDK JavaScript Quickstart</title>
<meta charset="utf-8" />
</head>
<body style="font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; font-size:13px;">
</body>
</html>
Добавление элементов пользовательского интерфейса
Теперь мы добавим базовый пользовательский интерфейс для полей ввода, создадим ссылку на код JavaScript пакета SDK службы "Речь" и получим токен авторизации, если он доступен.
Внимание
Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.
<body style="font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; font-size:13px;">
<div id="content" style="display:none">
<table width="100%">
<tr>
<td></td>
<td><h1 style="font-weight:500;">Microsoft Azure AI Speech SDK JavaScript Quickstart</h1></td>
</tr>
<tr>
<td align="right"><a href="https://learn.microsoft.com/azure/ai-services/speech-service/overview" target="_blank">Subscription</a>:</td>
<td><input id="subscriptionKey" type="text" size="40" value="subscription"></td>
</tr>
<tr>
<td align="right">Region</td>
<td><input id="serviceRegion" type="text" size="40" value="YourServiceRegion"></td>
</tr>
<tr>
<td align="right">Application ID:</td>
<td><input id="appId" type="text" size="60" value="YOUR_LANGUAGE_UNDERSTANDING_APP_ID"></td>
</tr>
<tr>
<td></td>
<td><button id="startIntentRecognizeAsyncButton">Start Intent Recognition</button></td>
</tr>
<tr>
<td align="right" valign="top">Input Text</td>
<td><textarea id="phraseDiv" style="display: inline-block;width:500px;height:200px"></textarea></td>
</tr>
<tr>
<td align="right" valign="top">Result</td>
<td><textarea id="statusDiv" style="display: inline-block;width:500px;height:100px"></textarea></td>
</tr>
</table>
</div>
<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>
<script>
// Note: Replace the URL with a valid endpoint to retrieve
// authorization tokens for your subscription.
var authorizationEndpoint = "token.php";
function RequestAuthorizationToken() {
if (authorizationEndpoint) {
var a = new XMLHttpRequest();
a.open("GET", authorizationEndpoint);
a.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
a.send("");
a.onload = function() {
var token = JSON.parse(atob(this.responseText.split(".")[1]));
serviceRegion.value = token.region;
authorizationToken = this.responseText;
subscriptionKey.disabled = true;
subscriptionKey.value = "using authorization token (hit F5 to refresh)";
console.log("Got an authorization token: " + token);
}
}
}
</script>
<script>
// status fields and start button in UI
var phraseDiv;
var statusDiv;
var startIntentRecognizeAsyncButton;
// subscription key, region, and appId for LUIS services.
var subscriptionKey, serviceRegion, appId;
var authorizationToken;
var SpeechSDK;
var recognizer;
document.addEventListener("DOMContentLoaded", function () {
startIntentRecognizeAsyncButton = document.getElementById("startIntentRecognizeAsyncButton");
subscriptionKey = document.getElementById("subscriptionKey");
serviceRegion = document.getElementById("serviceRegion");
appId = document.getElementById("appId");
phraseDiv = document.getElementById("phraseDiv");
statusDiv = document.getElementById("statusDiv");
startIntentRecognizeAsyncButton.addEventListener("click", function () {
startIntentRecognizeAsyncButton.disabled = true;
phraseDiv.innerHTML = "";
statusDiv.innerHTML = "";
});
if (!!window.SpeechSDK) {
SpeechSDK = window.SpeechSDK;
startIntentRecognizeAsyncButton.disabled = false;
document.getElementById('content').style.display = 'block';
document.getElementById('warning').style.display = 'none';
// in case we have a function for getting an authorization token, call it.
if (typeof RequestAuthorizationToken === "function") {
RequestAuthorizationToken();
}
}
});
</script>
Создание конфигурации службы "Речь"
Перед инициализацией объекта SpeechRecognizer
необходимо создать конфигурацию, использующую ключ и регион подписки. Вставьте код в метод startRecognizeOnceAsyncButton.addEventListener()
.
Примечание.
Пакет SDK для службы "Речь" по умолчанию распознает использование языкового стандарта en-us. Сведения о выборе исходного языка см. в разделе об изменении исходного языка.
// if we got an authorization token, use the token. Otherwise use the provided subscription key
var speechConfig;
if (authorizationToken) {
speechConfig = SpeechSDK.SpeechConfig.fromAuthorizationToken(authorizationToken, serviceRegion.value);
} else {
if (subscriptionKey.value === "" || subscriptionKey.value === "subscription") {
alert("Please enter your Microsoft Azure AI Speech subscription key!");
return;
}
startIntentRecognizeAsyncButton.disabled = false;
speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey.value, serviceRegion.value);
}
speechConfig.speechRecognitionLanguage = "en-US";
Создание конфигурации звука
Теперь вам нужно создать объект AudioConfig
, который указывает на устройство ввода. Вставьте этот код в метод startIntentRecognizeAsyncButton.addEventListener()
непосредственно под конфигурацией службы "Речь".
var audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput();
Инициализация объекта IntentRecognizer
Теперь создадим объект IntentRecognizer
с помощью созданных ранее объектов SpeechConfig
и AudioConfig
. Вставьте код в метод startIntentRecognizeAsyncButton.addEventListener()
.
recognizer = new SpeechSDK.IntentRecognizer(speechConfig, audioConfig);
Добавление модели LanguageUnderstandingModel и намерений
Необходимо сопоставить объект LanguageUnderstandingModel
с распознавателем намерений и добавить намерения, которые необходимо распознать. Мы будем использовать намерения из предварительно созданной предметной области для системы домашней автоматики.
Вставьте приведенный ниже код под строкой вашего IntentRecognizer
. Обязательно замените "YourLanguageUnderstandingAppId"
идентификатором приложения LUIS.
if (appId.value !== "" && appId.value !== "YOUR_LANGUAGE_UNDERSTANDING_APP_ID") {
var lm = SpeechSDK.LanguageUnderstandingModel.fromAppId(appId.value);
recognizer.addAllIntents(lm);
}
Примечание.
Пакет SDK службы "Речь" поддерживает только конечные точки LUIS версии 2.0. Нужно вручную изменить URL-адрес конечной точки версии 3.0, который можно найти в поле примера запроса, на шаблон URL-адреса версии 2.0. Для конечных точек LUIS версии 2.0 всегда используется один из двух следующих шаблонов:
https://{AzureResourceName}.cognitiveservices.azure.com/luis/v2.0/apps/{app-id}?subscription-key={subkey}&verbose=true&q=
https://{Region}.api.cognitive.microsoft.com/luis/v2.0/apps/{app-id}?subscription-key={subkey}&verbose=true&q=
Распознавание намерения
В объекте IntentRecognizer
необходимо вызвать метод recognizeOnceAsync()
. С помощью этого метода служба "Речь" узнает, что для распознавания отправляется одна фраза и что после идентификации фразы необходимо остановить распознавание речи.
Вставьте этот код под моделью:
recognizer.recognizeOnceAsync(
function (result) {
window.console.log(result);
phraseDiv.innerHTML = result.text + "\r\n";
statusDiv.innerHTML += "(continuation) Reason: " + SpeechSDK.ResultReason[result.reason];
switch (result.reason) {
case SpeechSDK.ResultReason.RecognizedSpeech:
statusDiv.innerHTML += " Text: " + result.text;
break;
case SpeechSDK.ResultReason.RecognizedIntent:
statusDiv.innerHTML += " Text: " + result.text + " IntentId: " + result.intentId;
// The actual JSON returned from Language Understanding is a bit more complex to get to, but it is available for things like
// the entity name and type if part of the intent.
statusDiv.innerHTML += " Intent JSON: " + result.properties.getProperty(SpeechSDK.PropertyId.LanguageUnderstandingServiceResponse_JsonResult);
phraseDiv.innerHTML += result.properties.getProperty(SpeechSDK.PropertyId.LanguageUnderstandingServiceResponse_JsonResult) + "\r\n";
break;
case SpeechSDK.ResultReason.NoMatch:
var noMatchDetail = SpeechSDK.NoMatchDetails.fromResult(result);
statusDiv.innerHTML += " NoMatchReason: " + SpeechSDK.NoMatchReason[noMatchDetail.reason];
break;
case SpeechSDK.ResultReason.Canceled:
var cancelDetails = SpeechSDK.CancellationDetails.fromResult(result);
statusDiv.innerHTML += " CancellationReason: " + SpeechSDK.CancellationReason[cancelDetails.reason];
if (cancelDetails.reason === SpeechSDK.CancellationReason.Error) {
statusDiv.innerHTML += ": " + cancelDetails.errorDetails;
}
break;
}
statusDiv.innerHTML += "\r\n";
startIntentRecognizeAsyncButton.disabled = false;
},
function (err) {
window.console.log(err);
phraseDiv.innerHTML += "ERROR: " + err;
startIntentRecognizeAsyncButton.disabled = false;
});
Проверка кода
<!DOCTYPE html>
<html>
<head>
<title>Microsoft Cognitive Services Speech SDK JavaScript Quickstart</title>
<meta charset="utf-8" />
</head>
<body style="font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; font-size:13px;">
<div id="warning">
<h1 style="font-weight:500;">Speech Recognition Speech SDK not found (microsoft.cognitiveservices.speech.sdk.bundle.js missing).</h1>
</div>
<div id="content" style="display:none">
<table width="100%">
<tr>
<td></td>
<td><h1 style="font-weight:500;">Microsoft Cognitive Services Speech SDK JavaScript Quickstart</h1></td>
</tr>
<tr>
<td align="right"><a href="https://docs.microsoft.com/azure/cognitive-services/speech-service/quickstarts/intent-recognition?pivots=programming-language-csharp#create-a-luis-app-for-intent-recognition" target="_blank">LUIS Primary Key</a>:</td>
<td><input id="subscriptionKey" type="text" size="40" value="subscription"></td>
</tr>
<tr>
<td align="right">LUIS Location</td>
<td><input id="serviceRegion" type="text" size="40" value="YourServiceRegion"></td>
</tr>
<tr>
<td align="right">LUIS App ID:</td>
<td><input id="appId" type="text" size="60" value="YOUR_LANGUAGE_UNDERSTANDING_APP_ID"></td>
</tr>
<tr>
<td></td>
<td><button id="startIntentRecognizeAsyncButton">Start Intent Recognition</button></td>
</tr>
<tr>
<td align="right" valign="top">Input Text</td>
<td><textarea id="phraseDiv" style="display: inline-block;width:500px;height:200px"></textarea></td>
</tr>
<tr>
<td align="right" valign="top">Result</td>
<td><textarea id="statusDiv" style="display: inline-block;width:500px;height:100px"></textarea></td>
</tr>
</table>
</div>
<!-- Speech SDK reference sdk. -->
<script src="https://aka.ms/csspeech/jsbrowserpackageraw"></script>
<!-- Speech SDK USAGE -->
<script>
// status fields and start button in UI
var phraseDiv;
var statusDiv;
var startIntentRecognizeAsyncButton;
// subscription key and region for speech services.
var subscriptionKey, serviceRegion, appId;
var SpeechSDK;
var recognizer;
document.addEventListener("DOMContentLoaded", function () {
startIntentRecognizeAsyncButton = document.getElementById("startIntentRecognizeAsyncButton");
subscriptionKey = document.getElementById("subscriptionKey");
serviceRegion = document.getElementById("serviceRegion");
appId = document.getElementById("appId");
phraseDiv = document.getElementById("phraseDiv");
statusDiv = document.getElementById("statusDiv");
startIntentRecognizeAsyncButton.addEventListener("click", function () {
startIntentRecognizeAsyncButton.disabled = true;
phraseDiv.innerHTML = "";
statusDiv.innerHTML = "";
let audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput();
if (subscriptionKey.value === "" || subscriptionKey.value === "subscription") {
alert("Please enter your Microsoft Cognitive Services Speech subscription key!");
startIntentRecognizeAsyncButton.disabled = false;
return;
}
var speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey.value, serviceRegion.value);
speechConfig.speechRecognitionLanguage = "en-US";
recognizer = new SpeechSDK.IntentRecognizer(speechConfig, audioConfig);
// Set up a Language Understanding Model from Language Understanding Intelligent Service (LUIS).
// See https://www.luis.ai/home for more information on LUIS.
if (appId.value !== "" && appId.value !== "YOUR_LANGUAGE_UNDERSTANDING_APP_ID") {
var lm = SpeechSDK.LanguageUnderstandingModel.fromAppId(appId.value);
recognizer.addAllIntents(lm);
}
recognizer.recognizeOnceAsync(
function (result) {
window.console.log(result);
phraseDiv.innerHTML = result.text + "\r\n";
statusDiv.innerHTML += "(continuation) Reason: " + SpeechSDK.ResultReason[result.reason];
switch (result.reason) {
case SpeechSDK.ResultReason.RecognizedSpeech:
statusDiv.innerHTML += " Text: " + result.text;
break;
case SpeechSDK.ResultReason.RecognizedIntent:
statusDiv.innerHTML += " Text: " + result.text + " IntentId: " + result.intentId;
// The actual JSON returned from Language Understanding is a bit more complex to get to, but it is available for things like
// the entity name and type if part of the intent.
statusDiv.innerHTML += " Intent JSON: " + result.properties.getProperty(SpeechSDK.PropertyId.LanguageUnderstandingServiceResponse_JsonResult);
phraseDiv.innerHTML += result.properties.getProperty(SpeechSDK.PropertyId.LanguageUnderstandingServiceResponse_JsonResult) + "\r\n";
break;
case SpeechSDK.ResultReason.NoMatch:
var noMatchDetail = SpeechSDK.NoMatchDetails.fromResult(result);
statusDiv.innerHTML += " NoMatchReason: " + SpeechSDK.NoMatchReason[noMatchDetail.reason];
break;
case SpeechSDK.ResultReason.Canceled:
var cancelDetails = SpeechSDK.CancellationDetails.fromResult(result);
statusDiv.innerHTML += " CancellationReason: " + SpeechSDK.CancellationReason[cancelDetails.reason];
if (cancelDetails.reason === SpeechSDK.CancellationReason.Error) {
statusDiv.innerHTML += ": " + cancelDetails.errorDetails;
}
break;
}
statusDiv.innerHTML += "\r\n";
startIntentRecognizeAsyncButton.disabled = false;
},
function (err) {
window.console.log(err);
phraseDiv.innerHTML += "ERROR: " + err;
startIntentRecognizeAsyncButton.disabled = false;
});
});
if (!!window.SpeechSDK) {
SpeechSDK = window.SpeechSDK;
startIntentRecognizeAsyncButton.disabled = false;
document.getElementById('content').style.display = 'block';
document.getElementById('warning').style.display = 'none';
}
});
</script>
</body>
</html>
Создание источника маркера (необязательно)
В случае, если вы хотите разместить веб-страницу на веб-сервере, можно указать источник маркера для вашего демоверсии приложения. Таким образом ключ подписки никогда не покинет пределы сервера, позволяя при этом пользователям использовать возможности распознавания речи, не вводя код авторизации.
Создайте файл с именем token.php
. В этом примере предполагается, что веб-сервер поддерживает язык сценариев PHP с включенной служебной программой cURL. Введите следующий код:
<?php
header('Access-Control-Allow-Origin: ' . $_SERVER['SERVER_NAME']);
// Replace with your own subscription key and service region (e.g., "westus").
$subscriptionKey = 'YourSubscriptionKey';
$region = 'YourServiceRegion';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://' . $region . '.api.cognitive.microsoft.com/sts/v1.0/issueToken');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{}');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Ocp-Apim-Subscription-Key: ' . $subscriptionKey));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
echo curl_exec($ch);
?>
Примечание.
Маркеры авторизации имеют ограниченное время существования. Этом упрощенном примере не показано, как автоматически обновлять маркеры проверки подлинности. Пользователь может вручную перезагрузить страницу или нажать клавишу F5, чтобы обновить ее.
Сборка и запуск примера в локальной среде
Чтобы запустить приложение, дважды щелкните файл index.html или откройте файл index.html с помощью веб-браузера на свой выбор. Он представляет простой графический пользовательский интерфейс, который позволяет ввести ключ LUIS, регион LUISи идентификатор приложения LUIS. Когда вы заполните эти поля, нажмите соответствующую кнопку, чтобы активировать распознавание с использованием микрофона.
Примечание.
Этот метод не работает в браузере Safari. Пример веб-страницы в Safari должен быть размещен на веб-сервере. В Safari загруженные из локального файла веб-сайты не могут использовать микрофон.
Сборка и запуск примера на веб-сервере
Чтобы запустить приложение, откройте используемый вами веб-браузер и введите общедоступный URL-адрес, по которому размещена ваша папка. Затем введите регион LUIS и идентификатор приложения LUIS и активируйте распознавание с использованием микрофона. Будет получен токен из источника токена (если он настроен) и начнется распознавание голосовых команд.
Справочные примеры пакета документации | (PyPi) | Дополнительные примеры на GitHub
В этом кратком руководстве показано, как распознать намерения из звуковых данных, полученных с микрофона, с помощью пакета SDK для службы "Речь" и службы "Распознавание речи". В частности, вы будете использовать пакет SDK для службы "Речь" и предварительно созданную предметную область в службе "Распознавание речи", чтобы определить намерения для системы домашней автоматики, например включение или выключение света.
Необходимые компоненты
- Подписка Azure — создайте бесплатную учетную запись.
- Создайте ресурс языка в портал Azure. Используйте бесплатную ценовую категорию (
F0
), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды. Ресурс службы "Речь" в этот раз не требуется. - Получите ключ ресурса языка и регион. После развертывания ресурса службы "Язык" выберите Перейти к ресурсу для просмотра ключей и управления ими.
Вам также потребуется установить пакет SDK службы "Речь" для среды разработки и создать пустой пример проекта.
Создание приложения LUIS для распознавания намерений
Чтобы выполнить инструкции в кратком руководстве по распознаванию намерений, необходимо создать учетную запись LUIS и проект с помощью портала LUIS предварительной версии. Для работы с этим кратким руководством требуется подписка LUIS в регионе, где доступна возможность распознавания намерений. Подписка на службу "Речь" не является обязательной.
В первую очередь необходимо создать учетную запись и приложение LUIS с помощью портала LUIS предварительной версии. Это приложение LUIS будет использовать предварительно созданную предметную область для домашней автоматики, которая предоставляет намерения, сущности и примеры речевых фрагментов. Когда все будет готово, вы получите работающую в облаке конечную точку LUIS, вызываемую с использованием пакета SDK для службы "Речь".
Чтобы создать приложение LUIS, выполните эти инструкции:
Когда все будет готово, вам потребуется следующее:
- повторная публикация с включенным параметром подготовки речи;
- первичный ключ LUIS;
- расположение LUIS;
- идентификатор приложения LUIS.
Вот как найти эти данные на портале LUIS предварительной версии:
На портале предварительной версии LUIS выберите свое приложение и нажмите кнопку Опубликовать.
Выберите рабочий слот, если используете
en-US
. Выберите Изменить параметры и установите переключатель параметра Подготовка речи в положение Вкл.. Затем нажмите кнопку Опубликовать.Внимание
Настоятельно рекомендуем включить подготовку речи. Это повысит точность распознавания речи.
На портале выберите вкладку Управление, а затем раздел Ресурсы Azure. На этой странице вы найдете ключ и расположение LUIS (иногда оно называется регионом) для ресурса прогнозирования LUIS.
Когда вы получите ключ и расположение, потребуется идентификатор приложения. Выберите Параметры. ИД вашего приложения доступно на этой странице.
Открытие вашего проекта
- Откройте предпочтительную интегрированную среду разработки.
- Создайте проект и файл с именем
quickstart.py
, а затем откройте его.
Добавление стандартного кода
Добавим код, который выступает в качестве основы для нашего проекта.
import azure.cognitiveservices.speech as speechsdk
print("Say something...")
Создание конфигурации службы "Речь"
Прежде чем инициализировать объект IntentRecognizer
, необходимо создать конфигурацию, использующую ключ и расположение ресурса прогнозирования LUIS.
Вставьте этот код в quickstart.py
. Обязательно обновите следующие значения:
- Замените
"YourLanguageUnderstandingSubscriptionKey"
ключом прогнозирования LUIS. - Замените
"YourLanguageUnderstandingServiceRegion"
расположением LUIS. Используйте идентификатор региона из региона
Совет
Если вам нужна помощь с поиском этих значений, перейдите к разделу Создание приложения LUIS для распознавания намерений.
Внимание
Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.
# Set up the config for the intent recognizer (remember that this uses the Language Understanding key, not the Speech Services key)!
intent_config = speechsdk.SpeechConfig(
subscription="YourLanguageUnderstandingSubscriptionKey",
region="YourLanguageUnderstandingServiceRegion")
В этом примере создается объект SpeechConfig
с использованием ключа и региона LUIS. Полный список доступных методов см. в статье SpeechConfig Class (Класс SpeechConfig).
Пакет SDK для службы "Речь" по умолчанию распознает использование языкового стандарта en-us. Сведения о выборе исходного языка см. в разделе об изменении исходного языка.
Инициализация объекта IntentRecognizer
Теперь создадим объект IntentRecognizer
. Вставьте этот код непосредственно под конфигурацией службы "Речь".
# Set up the intent recognizer
intent_recognizer = speechsdk.intent.IntentRecognizer(speech_config=intent_config)
Добавление модели LanguageUnderstandingModel и намерений
Необходимо сопоставить объект LanguageUnderstandingModel
с распознавателем намерений и добавить намерения, которые необходимо распознать. Мы будем использовать намерения из предварительно созданной предметной области для системы домашней автоматики.
Вставьте приведенный ниже код под строкой вашего IntentRecognizer
. Обязательно замените "YourLanguageUnderstandingAppId"
идентификатором приложения LUIS.
Совет
Если вам нужна помощь с поиском этих значений, перейдите к разделу Создание приложения LUIS для распознавания намерений.
# set up the intents that are to be recognized. These can be a mix of simple phrases and
# intents specified through a LanguageUnderstanding Model.
model = speechsdk.intent.LanguageUnderstandingModel(app_id="YourLanguageUnderstandingAppId")
intents = [
(model, "HomeAutomation.TurnOn"),
(model, "HomeAutomation.TurnOff"),
("This is a test.", "test"),
("Switch to channel 34.", "34"),
("what's the weather like", "weather"),
]
intent_recognizer.add_intents(intents)
В этом примере функция add_intents()
используется для добавления списка явно определенных намерений. Если требуется добавить все намерения из модели, используйте add_all_intents(model)
и передайте модель.
Распознавание намерения
В объекте IntentRecognizer
необходимо вызвать метод recognize_once()
. С помощью этого метода служба "Речь" узнает, что для распознавания отправляется одна фраза и что после идентификации фразы необходимо остановить распознавание речи.
Вставьте приведенный ниже код под строкой модели.
intent_result = intent_recognizer.recognize_once()
Отображение результатов распознавания (или ошибок)
Когда служба "Речь" возвращает результат распознавания, необходимо с ним что-то сделать. Мы оставим его как есть и выведем результат в консоли.
Под вызовом recognize_once()
добавьте указанный ниже код.
# Check the results
if intent_result.reason == speechsdk.ResultReason.RecognizedIntent:
print("Recognized: \"{}\" with intent id `{}`".format(intent_result.text, intent_result.intent_id))
elif intent_result.reason == speechsdk.ResultReason.RecognizedSpeech:
print("Recognized: {}".format(intent_result.text))
elif intent_result.reason == speechsdk.ResultReason.NoMatch:
print("No speech could be recognized: {}".format(intent_result.no_match_details))
elif intent_result.reason == speechsdk.ResultReason.Canceled:
print("Intent recognition canceled: {}".format(intent_result.cancellation_details.reason))
if intent_result.cancellation_details.reason == speechsdk.CancellationReason.Error:
print("Error details: {}".format(intent_result.cancellation_details.error_details))
Проверка кода
На этом этапе код должен выглядеть, как показано ниже.
Примечание.
Мы добавили несколько комментариев к этой версии.
# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
# <skeleton>
import azure.cognitiveservices.speech as speechsdk
print("Say something...")
# </skeleton>
"""performs one-shot intent recognition from input from the default microphone"""
# <create_speech_configuration>
# Set up the config for the intent recognizer (remember that this uses the Language Understanding key, not the Speech Services key)!
intent_config = speechsdk.SpeechConfig(
subscription="YourLanguageUnderstandingSubscriptionKey",
region="YourLanguageUnderstandingServiceRegion")
# </create_speech_configuration>
# <create_intent_recognizer>
# Set up the intent recognizer
intent_recognizer = speechsdk.intent.IntentRecognizer(speech_config=intent_config)
# </create_intent_recognizer>
# <add_intents>
# set up the intents that are to be recognized. These can be a mix of simple phrases and
# intents specified through a LanguageUnderstanding Model.
model = speechsdk.intent.LanguageUnderstandingModel(app_id="YourLanguageUnderstandingAppId")
intents = [
(model, "HomeAutomation.TurnOn"),
(model, "HomeAutomation.TurnOff"),
("This is a test.", "test"),
("Switch to channel 34.", "34"),
("what's the weather like", "weather"),
]
intent_recognizer.add_intents(intents)
# </add_intents>
# To add all of the possible intents from a LUIS model to the recognizer, uncomment the line below:
# intent_recognizer.add_all_intents(model)
# Starts intent recognition, and returns after a single utterance is recognized. The end of a
# single utterance is determined by listening for silence at the end or until a maximum of about 30
# seconds of audio is processed. It returns the recognition text as result.
# Note: Since recognize_once() returns only a single utterance, it is suitable only for single
# shot recognition like command or query.
# For long-running multi-utterance recognition, use start_continuous_recognition() instead.
# <recognize_intent>
intent_result = intent_recognizer.recognize_once()
# </recognize_intent>
# <print_results>
# Check the results
if intent_result.reason == speechsdk.ResultReason.RecognizedIntent:
print("Recognized: \"{}\" with intent id `{}`".format(intent_result.text, intent_result.intent_id))
elif intent_result.reason == speechsdk.ResultReason.RecognizedSpeech:
print("Recognized: {}".format(intent_result.text))
elif intent_result.reason == speechsdk.ResultReason.NoMatch:
print("No speech could be recognized: {}".format(intent_result.no_match_details))
elif intent_result.reason == speechsdk.ResultReason.Canceled:
print("Intent recognition canceled: {}".format(intent_result.cancellation_details.reason))
if intent_result.cancellation_details.reason == speechsdk.CancellationReason.Error:
print("Error details: {}".format(intent_result.cancellation_details.error_details))
# </print_results>
Создание и запуск приложения
Запустите пример из консоли или в интегрированной среде разработки:
python quickstart.py
Слова, произносимые в микрофон, в течение следующих 15 секунд будут распознаны и записаны в окне консоли.
Справочные примеры пакета документации | (Go) | Дополнительные примеры на GitHub
Пакет SDK службы "Речь" для Go не поддерживает распознавание намерений. Выберите другой язык программирования или обратитесь к справочнику и примерам для языка Go, ссылки на которые приведены в начале этой статьи.
Справочный пакет документации | (скачивание) | Дополнительные примеры на GitHub
Пакет SDK службы "Речь" для Objective-C поддерживает распознавание намерений, но мы еще не включили в эту статью руководство по использованию этого пакета SDK. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями, или обратитесь к справочнику и примерам для языка Objective-C, ссылки на которые приведены в начале этой статьи.
Справочный пакет документации | (скачивание) | Дополнительные примеры на GitHub
Пакет SDK службы "Речь" для Swift поддерживает распознавание намерений, но мы еще не включили в эту статью руководство по использованию этого пакета SDK. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями, или обратитесь к справочнику и примерам для языка Swift, ссылки на которые приведены в начале этой статьи.
Преобразование речи в текст REST API ссылки на | речь на текстовый REST API для краткой справки по звуковой ссылке | на Дополнительные примеры на GitHub
REST API поддерживает распознавание намерений, но мы еще не включили в эту статью руководство по использованию REST API. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями.
Интерфейс командной строки (CLI) службы "Речь" поддерживает распознавание намерений, но мы еще не включили в эту статью руководство по использованию CLI. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями, или обратитесь к статье Обзор CLI службы "Речь".