Руководство по Распознавание намерений в речи с помощью пакета SDK службы "Речь" для C#Tutorial: Recognize intents from speech using the Speech SDK for C#

Пакет SDK службы "Речь" в Cognitive Services интегрируется с Интеллектуальной службой распознавания речи (LUIS) для предоставления возможности распознавания намерений.The Cognitive Services Speech SDK integrates with the Language Understanding service (LUIS) to provide intent recognition. Намерение — это действие, которое хочет выполнить пользователь, например забронировать билет на самолет, проверить прогноз погоды или совершить звонок.An intent is something the user wants to do: book a flight, check the weather, or make a call. Пользователь может использовать любые термины, которые кажутся естественными.The user can use whatever terms feel natural. С помощью машинного обучения LUIS сопоставит пользовательские запросы с определенными намерениями.Using machine learning, LUIS maps user requests to the intents you have defined.

Примечание

Приложение LUIS используется для определения намерений и сущностей, которые требуется распознать.A LUIS application defines the intents and entities you want to recognize. Оно работает отдельно от приложения C#, в котором используется служба "Речь".It's separate from the C# application that uses the Speech service. В этой статье под словом "приложение" подразумевается приложение LUIS, а под "программа" — код C#.In this article, "app" means the LUIS app, while "application" means the C# code.

В данном руководстве для разработки консольной программы C#, которая извлекает намерения пользователя из высказываний, полученных через микрофон устройства, будет использован пакет SDK для службы "Речь".In this tutorial, you use the Speech SDK to develop a C# console application that derives intents from user utterances through your device's microphone. Вы узнаете, как:You'll learn how to:

  • создать проект в Visual Studio, ссылающийся на пакет SDK для службы "Речь" для NuGet;Create a Visual Studio project referencing the Speech SDK NuGet package
  • выполнить настройки речи и получить распознаватель намерений;Create a speech config and get an intent recognizer
  • создать модель для приложения LUIS и добавить необходимые намерения;Get the model for your LUIS app and add the intents you need
  • указать язык распознавания речи;Specify the language for speech recognition
  • распознать речь из файла;Recognize speech from a file
  • использовать асинхронное непрерывное распознавание при определенном событии.Use asynchronous, event-driven continuous recognition

Предварительные требованияPrerequisites

Перед началом работы с этим руководством необходимо убедиться в наличии следующих ресурсов.Be sure you have the following before you begin this tutorial.

  • Учетная запись LUIS.A LUIS account. На портале LUIS ее можно получить бесплатно.You can get one for free through the LUIS portal.
  • Visual Studio 2017 (любой выпуск).Visual Studio 2017 (any edition).

LUIS и речьLUIS and speech

Чтобы распознать намерения из речи, LUIS интегрируется в службу "Речь".LUIS integrates with the Speech Services to recognize intents from speech. Подписка на службу "Речь" не требуется.You don't need a Speech Services subscription, just LUIS.

В LUIS используются два типа ключей.LUIS uses two kinds of keys:

Тип ключаKey type НазначениеPurpose
Разработкаauthoring позволяет программно создавать и изменять приложения LUISlets you create and modify LUIS apps programmatically
endpointendpoint разрешает доступ к определенному приложению LUISauthorizes access to a particular LUIS app

Ключ конечной точки — это ключ LUIS, который используется в текущем руководстве.The endpoint key is the LUIS key needed for this tutorial. В этом руководстве используется пример приложения LUIS Home Automation. Создать его можно, выполнив инструкции в статье Краткое руководство. Использование предварительно созданного приложения для системы домашней автоматики.This tutorial uses the example Home Automation LUIS app, which you can create by following Use prebuilt Home automation app. Также вместо него можно использовать собственное приложение.If you have created a LUIS app of your own, you can use it instead.

Начальный ключ автоматически создается при создании приложения LUIS. Это позволяет проверять приложения с помощью текстовых запросов.When you create a LUIS app, a starter key is automatically generated so you can test the app using text queries. С помощью этого ключа невозможно запустить интеграцию со службой "Речь", и поэтому он не используется в данном руководстве.This key does not enable the Speech Services integration and won't work with this tutorial. На панели мониторинга Azure необходимо создать ресурс LUIS и назначить его приложению LUIS.You must create a LUIS resource in the Azure dashboard and assign it to the LUIS app. Для данного руководства можно использовать бесплатную подписку.You can use the free subscription tier for this tutorial.

После создания ресурса LUIS на панели мониторинга Azure необходимо войти на портал LUIS и выбрать свою программу на странице "Мои приложения", а затем перейти на страницу "Управление".After creating the LUIS resource in the Azure dashboard, log into the LUIS portal, choose your application on the My Apps page, then switch to the app's Manage page. И наконец, на боковой панели щелкните Keys and Endpoints (Ключи и конечные точки).Finally, click Keys and Endpoints in the sidebar.

Параметры конечной точки и ключей на портале LUIS

Выполните следующие действия на странице параметров Keys and Endpoints (Ключи и конечные точки).On the Keys and Endpoint settings page:

  1. Прокрутите вниз к разделу Resources and Keys (Ресурсы и ключи) и щелкните Назначить ресурс.Scroll down to the Resources and Keys section and click Assign resource.

  2. Выберите следующие параметры в диалоговом окне Assign a key to your app (Назначение ключа приложению).In the Assign a key to your app dialog, choose the following:

    • В качестве клиента необходимо выбрать Microsoft.Choose Microsoft as the Tenant.
    • В разделе "Имя подписки" выберите подписку Azure, содержащую ресурс LUIS, который будет использован.Under Subscription Name, choose the Azure subscription that contains the LUIS resource you want to use.
    • В разделе Key (Ключ) выберите тот ресурс LUIS, который необходимо использовать в приложении.Under Key, choose the LUIS resource that you want to use with the app.

Через мгновение новая подписка появится в таблице в нижней части страницы.In a moment, the new subscription appears in the table at the bottom of the page. Чтобы скопировать ее в буфер обмена, щелкните значок рядом с ключом.Click the icon next to a key to copy it to the clipboard. (Можно использовать любой ключ.)(You may use either key.)

Ключи подписки приложения LUIS

Создание проекта "Речь" в Visual StudioCreate a speech project in Visual Studio

  1. Откройте Visual Studio 2019.Open Visual Studio 2019.

  2. В окне "Период запуска" выберите Создать новый проект.In the Start window, select Create a new project.

  3. Выберите Console App (.NET Framework) (Консольное приложение (.NET Framework)), а затем нажмите кнопкуДалее.Select Console App (.NET Framework), and then select Next.

  4. В окнеИмя проекта введите helloworld, а затем выберите Создать.In Project name, enter helloworld, and then select Create.

  5. В строке меню в Visual Studio выберите Инструменты > Get Tools and Features (Получить средства и компоненты), и проверьте, доступна ли рабочая нагрузка для Разработка классических приложений .NET.From the menu bar in Visual Studio, select Tools > Get Tools and Features, and check whether the .NET desktop development workload is available. Если рабочая нагрузка не была установлена, установите флажок, а затем выберите Изменить, чтобы начать установку.If the workload hasn't been installed, mark the checkbox, then select Modify to start the installation. Скачивание и установка может занять несколько минут.It may take a few minutes to download and install.

    Если теперь флажок рядом с полем Разработка классических приложений .NET установлен, можно закрыть диалоговое окно.If the checkbox next to .NET desktop development is selected, you can close the dialog box now.

    Включение рабочей нагрузки "Разработка классического приложения .NET"

Следующим шагом является установка Speech SDK NuGet package (Речевой пакет SDK NuGet), чтобы вы могли ссылаться на него в коде.The next step is to install the Speech SDK NuGet package, so you can reference it in the code.

  1. В Обозревателе решений щелкните правой кнопкой мыши на helloworld и выберите NuGet Packages (Управление пакетами NuGet), чтобы отобразить Диспетчер пакетов NuGet.In the Solution Explorer, right-click helloworld, and then select Manage NuGet Packages to show the NuGet Package Manager.

    Диспетчер пакетов NuGet

  2. В правом верхнем углу найдите раскрывающийся список Источник пакета и убедитесь, что выбран параметр NuGet.org.In the upper-right corner, find the Package Source drop-down box, and make sure that nuget.org is selected.

  3. В левом верхнем углу нажмите кнопку Просмотреть.In the upper-left corner, select Browse.

  4. В поле поиска введите Microsoft.CognitiveServices.Speech и нажмите клавишу ВВОД.In the search box, type Microsoft.CognitiveServices.Speech package and press Enter.

  5. Выберите Microsoft.CognitiveServices.Speech и нажмите кнопку Установка, чтобы установить последнюю стабильную версию.Select Microsoft.CognitiveServices.Speech, and then select Install to install the latest stable version.

    Установка пакета Microsoft.CognitiveServices.Speech NuGet

  6. Примите все соглашения и лицензии для запуска установки.Accept all agreements and licenses to start the installation.

    После установки пакета на Консоли диспетчера пакетов появится подтверждение.After the package is installed, a confirmation appears in the Package Manager Console window.

Теперь, чтобы создать и запустить консольное приложение, создайте конфигурацию платформы, соответствующую архитектуре компьютера.Now, to build and run the console application, create a platform configuration matching your computer's architecture.

  1. В строке меню выберите Сборка > Configuration Manager (Диспетчер конфигураций).From the menu bar, select Build > Configuration Manager. Откроется диалоговое окноConfigurationManager (Диспетчер конфигураций).The Configuration Manager dialog box appears.

    Диалоговое окно Configuration Manager (Диспетчер конфигураций)

  2. В раскрывающемся списке Активная платформа решения выберите команду Новый.In the Active solution platform drop-down box, select New. Откроется диалоговое окно Создание платформы решения.The New Solution Platform dialog box appears.

  3. В раскрывающемся списке Введите или выберите новую платформу.In the Type or select the new platform drop-down box:

    • Если вы используете 64-разрядную версию Windows, выберите x64.If you're running 64-bit Windows, select x64.
    • Если вы используете 32-разрядную версию Windows, выберите x86.If you're running 32-bit Windows, select x86.
  4. Нажмите ОК, а затем Закрыть.Select OK and then Close.

Добавление кодаAdd the code

В проекте Visual Studio откройте файл Program.cs и замените блок операторов using, который находится в начале файла, следующими объявлениями.Open the file Program.cs in the Visual Studio project and replace the block of using statements at the beginning of the file with the following declarations.

using System;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
using Microsoft.CognitiveServices.Speech.Intent;

Добавьте следующий код в метод Main().Inside the provided Main() method, add the following code.

RecognizeIntentAsync().Wait();
Console.WriteLine("Please press Enter to continue.");
Console.ReadLine();

Создайте пустой асинхронный метод RecognizeIntentAsync(), как показано ниже.Create an empty asynchronous method RecognizeIntentAsync(), as shown here.

static async Task RecognizeIntentAsync()
{
}

Добавьте следующий код в тело метода.In the body of this new method, add this code.

// 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".
var config = SpeechConfig.FromSubscription("YourLanguageUnderstandingSubscriptionKey", "YourLanguageUnderstandingServiceRegion");

// Creates an intent recognizer using microphone as audio input.
using (var recognizer = new IntentRecognizer(config))
{
    // 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");

    // 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 15
    // 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().ConfigureAwait(false);

    // Checks result.
    if (result.Reason == ResultReason.RecognizedIntent)
    {
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        Console.WriteLine($"    Intent Id: {result.IntentId}.");
        Console.WriteLine($"    Language Understanding JSON: {result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)}.");
    }
    else if (result.Reason == ResultReason.RecognizedSpeech)
    {
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        Console.WriteLine($"    Intent not recognized.");
    }
    else if (result.Reason == ResultReason.NoMatch)
    {
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
    }
    else if (result.Reason == 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?");
        }
    }
}

В методе необходимо заменить заполнители на ключ подписки LUIS, регион и идентификатор приложения следующим образом.Replace the placeholders in this method with your LUIS subscription key, region, and app ID as follows.

PlaceholderPlaceholder Заменить наReplace with
YourLanguageUnderstandingSubscriptionKey Ключ конечной точки LUIS.Your LUIS endpoint key. Как было указано ранее, данный ключ должен быть получен из панели мониторинга Azure, а не в качестве ключа для начала разработки.As previously noted, this must be a key obtained from your Azure dashboard, not a "starter key." Его можно найти на странице приложения "Keys and Endpoints" (Ключи и конечные точки) в разделе Manage (Управление) на портале LUIS.You can find it on your app's Keys and Endpoints page (under Manage) in the LUIS portal.
YourLanguageUnderstandingServiceRegion Короткий идентификатор региона, в котором находится подписка LUIS, например westus для западной части США.The short identifier for the region your LUIS subscription is in, such as westus for West US. См. статью Регионы и конечные точки службы "Речь".See Regions.
YourLanguageUnderstandingAppId Идентификатор приложения LUIS.The LUIS app ID. Его можно найти на странице параметров приложения на портале LUIS.You can find it on your app's Settings page of the LUIS portal.

После выполнения этих изменений можно создать (CTRL+SHIFT+B) и запустить (F5) программу, приведенную в руководстве.With these changes made, you can build (Control-Shift-B) and run (F5) the tutorial application. При появлении запроса в микрофон компьютера следует произнести фразу "выключить свет".When prompted, try saying "Turn off the lights" into your PC's microphone. Результат появится в окне консоли.The result is displayed in the console window.

В следующих разделах приводится описание кода.The following sections include a discussion of the code.

Создание распознавателя намеренийCreate an intent recognizer

Первым шагом распознавания намерений в речи является создание конфигурации речи с помощью ключа конечной точки LUIS и региона.The first step in recognizing intents in speech is to create a speech config from your LUIS endpoint key and region. Конфигурации речи могут использоваться для создания распознавателей, обладающих различными возможностями, используемыми в пакете SDK службы "Речь".Speech configs can be used to create recognizers for the various capabilities of the Speech SDK. При использовании конфигурации речи вы можете указать подписку несколькими способами. В данном руководстве будет использован способ FromSubscription, для которого требуется ключ подписки и регион.The speech config has multiple ways to specify the subscription you want to use; here, we use FromSubscription, which takes the subscription key and region.

Примечание

Используйте ключ и регион своей подписки LUIS вместо ключа и региона подписки службы "Речь".Use the key and region of your LUIS subscription, not of a Speech Services subscription.

Затем с помощью new IntentRecognizer(config) создайте распознаватель намерений.Next, create an intent recognizer using new IntentRecognizer(config). Поскольку в конфигурации уже было указано, какую из подписок использовать, повторное указание ключа подписки и конечной точки при создании распознавателя не требуется.Since the configuration already knows which subscription to use, there's no need to specify the subscription key and endpoint again when creating the recognizer.

Добавление намерений и импорт моделиImport a LUIS model and add intents

Теперь импортируйте модель из приложения LUIS с помощью идентификатора LanguageUnderstandingModel.FromAppId() и добавьте те намерения LUIS, которые требуется распознать, с помощью метода AddIntent().Now import the model from the LUIS app using LanguageUnderstandingModel.FromAppId() and add the LUIS intents that you wish to recognize via the recognizer's AddIntent() method. С помощью двух приведенных шагов улучшается точность распознавания речи путем указания слов, которые пользователь может использовать в запросах.These two steps improve the accuracy of speech recognition by indicating words that the user is likely to use in their requests. Если в программе не планируется распознавать все намерения приложений, их добавление не требуется.It is not necessary to add all the app's intents if you do not need to recognize them all in your application.

Для добавления намерений требуется три аргумента. Модель LUIS (которая была создана с именем model), имя намерения и его идентификатор.Adding intents requires three arguments: the LUIS model (which has been created and is named model), the intent name, and an intent ID. Разница между идентификатором и именем приведена в следующей таблице.The difference between the ID and the name is as follows.

Аргумент AddIntent()AddIntent() argument НазначениеPurpose
intentNameintentName Имя намерения, определенного в приложении LUIS.The name of the intent as defined in the LUIS app. Оно должно совпадать с именем намерения LUIS.Must match the LUIS intent name exactly.
intentIDintentID Идентификатор, присвоенный намерению, распознанному пакетом SDK для службы "Речь".An ID assigned to a recognized intent by the Speech SDK. Он может быть любым. Он не обязательно должен соответствовать имени намерения, определенному в приложении LUIS.Can be whatever you like; does not need to correspond to the intent name as defined in the LUIS app. Для обработки нескольких намерений может использоваться один код, как и один идентификатор используется для всех намерений.If multiple intents are handled by the same code, for instance, you could use the same ID for them.

Приложение LUIS Home Automation содержит два намерения. Первое — включение устройства и второе — выключения устройства.The Home Automation LUIS app has two intents: one for turning on a device, and another for turning a device off. С помощью приведенных ниже строк намерения будут добавлены в распознаватель. Замените приведенным ниже кодом три строки AddIntent в методе RecognizeIntentAsync().The lines below add these intents to the recognizer; replace the three AddIntent lines in the RecognizeIntentAsync() method with this code.

recognizer.AddIntent(model, "HomeAutomation.TurnOff", "off");
recognizer.AddIntent(model, "HomeAutomation.TurnOn", "on");

Вместо добавления отдельных намерения можно также использовать метод AddAllIntents, чтобы добавить в распознаватель все намерения из модели.Instead of adding individual intents, you can also use the AddAllIntents method to add all the intents in a model to the recognizer.

Начало распознаванияStart recognition

После создания распознавателя и добавления намерений можно начать процесс распознавания.With the recognizer created and the intents added, recognition can begin. В пакете SDK для службы "Речь" поддерживается краткое и непрерывное распознавание.The Speech SDK supports both single-shot and continuous recognition.

Режим распознаванияRecognition mode Вызываемые методыMethods to call РезультатResult
ОдиночныйSingle-shot RecognizeOnceAsync() Возвращает распознанное намерение, извлеченное из одного высказывания.Returns the recognized intent, if any, after one utterance.
НепрерывныеContinuous StartContinuousRecognitionAsync()
StopContinuousRecognitionAsync()
Распознает несколько высказываний.Recognizes multiple utterances. Когда результаты становятся доступными, выдает события (например, IntermediateResultReceived).Emits events (e.g. IntermediateResultReceived) when results are available.

В программе, приведенной в руководстве, используется "одиночный" режим и поэтому для начала распознавание используется RecognizeOnceAsync().The tutorial application uses single-shot mode and so calls RecognizeOnceAsync() to begin recognition. Результат — объект IntentRecognitionResult, который содержит информацию о распознанном намерении.The result is an IntentRecognitionResult object containing information about the intent recognized. Ответ LUIS в формате JSON извлекается с помощью следующего выражения.The LUIS JSON response is extracted by the following expression:

result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)

Программа, приведенная в руководстве, не анализирует результат JSON. Она используется для его отображения в окне консоли.The tutorial application doesn't parse the JSON result, only displaying it in the console window.

Результаты распознавания LUIS

Указание языка распознаванияSpecify recognition language

По умолчанию язык распознавания намерений — английский (США) (en-us).By default, LUIS recognizes intents in US English (en-us). Чтобы распознавать намерения на других языках, свойству SpeechRecognitionLanguage необходимо присвоить код языкового стандарта.By assigning a locale code to the SpeechRecognitionLanguage property of the speech configuration, you can recognize intents in other languages. Например, перед созданием распознавателя добавьте параметр config.SpeechRecognitionLanguage = "de-de"; в программу, приведенную в руководстве. Это позволит распознавать намерения на немецком языке.For example, add config.SpeechRecognitionLanguage = "de-de"; in our tutorial application before creating the recognizer to recognize intents in German. См. сведения о поддерживаемых языках.See Supported Languages.

Непрерывное распознавание из файлаContinuous recognition from a file

В следующем коде иллюстрируются две дополнительные возможности распознавания намерений с использованием пакета SDK для службы "Речь".The following code illustrates two additional capabilities of intent recognition using the Speech SDK. Первая из возможностей, которая была упомянута ранее, — непрерывное распознавание, используя которое распознаватель извлекает события при получении результата.The first, previously mentioned, is continuous recognition, where the recognizer emits events when results are available. Затем эти события могут обрабатываться предоставленными обработчиками событий.These events can then be processed by event handlers that you provide. При непрерывном распознавании вызывается распознаватель StartContinuousRecognitionAsync(), который начнет работать вместо распознавателя RecognizeOnceAsync().With continuous recognition, you call the recognizer's StartContinuousRecognitionAsync() to start recognition instead of RecognizeOnceAsync().

К другим возможностям можно отнести считывание звукового файла в формате WAV, содержащего речь, подлежащую обработке.The other capability is reading the audio containing the speech to be processed from a WAV file. Сюда можно отнести создание конфигурации звука, которую можно использовать при создании распознавателя намерений.This involves creating an audio configuration that can be used when creating the intent recognizer. Файл должен состоять из одного канала (моно) с уровнем дискретизации 16 000 Гц.The file must be single-channel (mono) with a sampling rate of 16 kHz.

Воспользуйтесь новыми функциями, заменив тело метода RecognizeIntentAsync() следующим кодом.To try out these features, replace the body of the RecognizeIntentAsync() method with the following code.

// 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").
var config = SpeechConfig.FromSubscription("YourLanguageUnderstandingSubscriptionKey", "YourLanguageUnderstandingServiceRegion");

// Creates an intent recognizer using file as audio input.
// Replace with your own audio file name.
using (var audioInput = AudioConfig.FromWavFileInput("whatstheweatherlike.wav"))
{
    using (var recognizer = new IntentRecognizer(config, audioInput))
    {
        // The TaskCompletionSource to stop recognition.
        var stopRecognition = new TaskCompletionSource<int>();

        // 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");

        // Subscribes to events.
        recognizer.Recognizing += (s, e) => {
            Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
        };

        recognizer.Recognized += (s, e) => {
            if (e.Result.Reason == ResultReason.RecognizedIntent)
            {
                Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
                Console.WriteLine($"    Intent Id: {e.Result.IntentId}.");
                Console.WriteLine($"    Language Understanding JSON: {e.Result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)}.");
            }
            else if (e.Result.Reason == ResultReason.RecognizedSpeech)
            {
                Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
                Console.WriteLine($"    Intent not recognized.");
            }
            else if (e.Result.Reason == ResultReason.NoMatch)
            {
                Console.WriteLine($"NOMATCH: Speech could not be recognized.");
            }
        };

        recognizer.Canceled += (s, e) => {
            Console.WriteLine($"CANCELED: Reason={e.Reason}");

            if (e.Reason == CancellationReason.Error)
            {
                Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
                Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
                Console.WriteLine($"CANCELED: Did you update the subscription info?");
            }

            stopRecognition.TrySetResult(0);
        };

        recognizer.SessionStarted += (s, e) => {
            Console.WriteLine("\n    Session started event.");
        };

        recognizer.SessionStopped += (s, e) => {
            Console.WriteLine("\n    Session stopped event.");
            Console.WriteLine("\nStop recognition.");
            stopRecognition.TrySetResult(0);
        };


        // Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
        Console.WriteLine("Say something...");
        await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);

        // Waits for completion.
        // Use Task.WaitAny to keep the task rooted.
        Task.WaitAny(new[] { stopRecognition.Task });

        // Stops recognition.
        await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
    }
}

Пересмотрите код на наличие ключа конечной точки LUIS, региона и идентификатора приложения и, как и в предыдущем примере, добавьте намерения Home Automation.Revise the code to include your LUIS endpoint key, region, and app ID and to add the Home Automation intents, as before. Измените имя whatstheweatherlike.wav на имя вашего звукового файла.Change whatstheweatherlike.wav to the name of your audio file. Затем выполните сборку и запуск.Then build and run.

Получение примеровGet the samples

Актуальные примеры доступны в репозитории с примерами кода для пакета SDK службы "Речь" в Cognitive Services на GitHub.For the latest samples, see the Cognitive Services Speech SDK sample code repository on GitHub.

Код, используемый в данной статье, можно найти в папке samples/csharp/sharedcontent/console.Look for the code from this article in the samples/csharp/sharedcontent/console folder.

Дополнительная информацияNext steps