Распознавание намерений с помощью простого сопоставления шаблонов языка

Пакет SDK для службы "Речь" Cognitive Services имеет встроенную функцию, обеспечивающую распознавание намерений с помощью простого сопоставления шаблонов языка. Намерение — это то, что хочет сделать пользователь: закрыть окно, пометить флажок, вставить какой-то текст и т. д.

В данном руководстве для разработки консольного приложения C++, извлекающего намерения пользователя из речевых фрагментов, полученных через микрофон устройства, будет использован пакет SDK для службы "Речь". Вы узнаете, как:

  • создать проект в Visual Studio, ссылающийся на пакет SDK для службы "Речь" для NuGet;
  • выполнить настройки речи и получить распознаватель намерений;
  • добавить намерения и шаблоны с помощью API пакета SDK для службы "Речь";
  • Распознавание речи с микрофона
  • использовать асинхронное непрерывное распознавание при определенном событии.

Когда следует использовать сопоставление шаблонов

Используйте этот пример кода в следующих случаях:

  • Вам необходимо лишь точное совпадение с тем, что сказал пользователь. Эти шаблоны определяют соответствия интенсивнее, чем LUIS.
  • У вас нет доступа к приложению LUIS, но вам по-прежнему нужны намерения.
  • Вы не можете или не хотите создавать приложение LUIS, но вам все равно требуется возможность работы с голосовыми командами.

Дополнительные сведения см. в обзоре сопоставления шаблонов.

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

Перед началом работы с этим руководством необходимо убедиться в наличии следующих элементов:

Речь и простые шаблоны

Простые шаблоны являются компонентом пакета SDK для службы "Речь", и для них необходим ресурс Cognitive Services или унифицированный ресурс службы "Речь".

Шаблон — это фраза, которая содержит сущность. Сущность определяется путем заключения слова в фигурные скобки. Этот пример определяет сущность с идентификатором floorName, которая учитывает регистр:

    Take me to the {floorName}

Все прочие специальные символы и знаки препинания будут игнорироваться.

Намерения будут добавляться с помощью вызовов API IntentRecognizer->AddIntent().

Создание проекта

Создайте проект консольного приложения C# в Visual Studio 2019 и установите пакет SDK службы "Речь".

Добавление стандартного кода

Откройте файл Program.cs и добавьте код, который выступает в качестве основы для нашего проекта.

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

namespace helloworld
{
    class Program
    {
        static void Main(string[] args)
        {
            IntentPatternMatchingWithMicrophoneAsync().Wait();
        }

        private static async Task IntentPatternMatchingWithMicrophoneAsync()
        {
            var config = SpeechConfig.FromSubscription("YOUR_SUBSCRIPTION_KEY", "YOUR_SUBSCRIPTION_REGION");
        }
    }
}

Создание конфигурации службы "Речь"

Прежде чем инициализировать объект IntentRecognizer, необходимо создать конфигурацию, использующую ключ и расположение ресурса прогнозирования Cognitive Services.

  • Замените значение "YOUR_SUBSCRIPTION_KEY" на ключ прогнозирования Cognitive Service.
  • Замените значение "YOUR_SUBSCRIPTION_REGION" на область ресурсов Cognitive Service.

В этом примере для создания SpeechConfig используется метод FromSubscription(). Полный список доступных методов см. в статье SpeechConfig Class (Класс SpeechConfig).

Инициализация объекта IntentRecognizer

Теперь создайте IntentRecognizer. Вставьте этот код непосредственно под конфигурацией службы "Речь".

using (var intentRecognizer = new IntentRecognizer(config))
{
    
}

Добавление некоторых намерений

Необходимо связать некоторые шаблоны с помощью IntentRecognizer, вызвав AddIntent(). Мы добавим 2 намерения с одним и тем же идентификатором для изменения этажей и другое намерение с отдельным идентификатором для открытия и закрытия дверей. Вставьте этот код в блок using.

intentRecognizer.AddIntent("Take me to floor {floorName}.", "ChangeFloors");
intentRecognizer.AddIntent("Go to floor {floorName}.", "ChangeFloors");
intentRecognizer.AddIntent("{action} the door.", "OpenCloseDoor");

Примечание

Количество сущностей, которые можно объявить, не ограничено, но они будут нестрого соответствовать друг другу. Если добавить фразу, как {action} door, она будет соответствовать любому моменту текста перед словом door. Намерения оцениваются на основе количества их сущностей. Если два шаблона соответствуют, возвращается один шаблон с более определенными сущностями.

Распознавание намерения

В объекте IntentRecognizer необходимо вызвать метод RecognizeOnceAsync(). Этот метод запрашивает у службы "Речь" распознавание речи в одной фразе и прекращает распознавание речи после определения фразы. Для удобства мы дождемся завершения возврата.

Вставьте приведенный ниже код под строкой намерений:

Console.WriteLine("Say something...");

var result = await intentRecognizer.RecognizeOnceAsync();

Отображение результатов распознавания (или ошибок)

Когда служба "Речь" возвратит результат распознавания, мы выведем его на печать.

Вставьте код ниже под строкой var result = await recognizer.RecognizeOnceAsync();.

string floorName;
switch (result.Reason)
{
    case ResultReason.RecognizedSpeech:
        Console.WriteLine($"RECOGNIZED: Text= {result.Text}");
        Console.WriteLine($"    Intent not recognized.");
        break;
    case ResultReason.RecognizedIntent:
        Console.WriteLine($"RECOGNIZED: Text= {result.Text}");
        Console.WriteLine($"       Intent Id= {result.IntentId}.");
        var entities = result.Entities;
        if (entities.TryGetValue("floorName", out floorName))
        {
            Console.WriteLine($"       FloorName= {floorName}");
        }
    
        if (entities.TryGetValue("action", out floorName))
        {
            Console.WriteLine($"       Action= {floorName}");
        }
    
        break;
    case ResultReason.NoMatch:
    {
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        var noMatch = NoMatchDetails.FromResult(result);
        switch (noMatch.Reason)
        {
            case NoMatchReason.NotRecognized:
                Console.WriteLine($"NOMATCH: Speech was detected, but not recognized.");
                break;
            case NoMatchReason.InitialSilenceTimeout:
                Console.WriteLine($"NOMATCH: The start of the audio stream contains only silence, and the service timed out waiting for speech.");
                break;
            case NoMatchReason.InitialBabbleTimeout:
                Console.WriteLine($"NOMATCH: The start of the audio stream contains only noise, and the service timed out waiting for speech.");
                break;
            case NoMatchReason.KeywordNotRecognized:
                Console.WriteLine($"NOMATCH: Keyword not recognized");
                break;
        }
        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 set the speech resource key and region values?");
        }
        break;
    }
    default:
        break;
}

Проверка кода

На этом этапе код должен выглядеть так:

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

namespace helloworld
{
    class Program
    {
        static void Main(string[] args)
        {
            IntentPatternMatchingWithMicrophoneAsync().Wait();
        }

        private static async Task IntentPatternMatchingWithMicrophoneAsync()
        {
            var config = SpeechConfig.FromSubscription("YOUR_SUBSCRIPTION_KEY", "YOUR_SUBSCRIPTION_REGION");
            using (var intentRecognizer = new IntentRecognizer(config))
            {
                intentRecognizer.AddIntent("Take me to floor {floorName}.", "ChangeFloors");
                intentRecognizer.AddIntent("Go to floor {floorName}.", "ChangeFloors");
                intentRecognizer.AddIntent("{action} the door.", "OpenCloseDoor");

                Console.WriteLine("Say something...");

                var result = await intentRecognizer.RecognizeOnceAsync();

                string floorName;
                switch (result.Reason)
                {
                    case ResultReason.RecognizedSpeech:
                        Console.WriteLine($"RECOGNIZED: Text= {result.Text}");
                        Console.WriteLine($"    Intent not recognized.");
                        break;
                    case ResultReason.RecognizedIntent:
                        Console.WriteLine($"RECOGNIZED: Text= {result.Text}");
                        Console.WriteLine($"       Intent Id= {result.IntentId}.");
                        var entities = result.Entities;
                        if (entities.TryGetValue("floorName", out floorName))
                        {
                            Console.WriteLine($"       FloorName= {floorName}");
                        }

                        if (entities.TryGetValue("action", out floorName))
                        {
                            Console.WriteLine($"       Action= {floorName}");
                        }

                        break;
                    case ResultReason.NoMatch:
                    {
                        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
                        var noMatch = NoMatchDetails.FromResult(result);
                        switch (noMatch.Reason)
                        {
                            case NoMatchReason.NotRecognized:
                                Console.WriteLine($"NOMATCH: Speech was detected, but not recognized.");
                                break;
                            case NoMatchReason.InitialSilenceTimeout:
                                Console.WriteLine($"NOMATCH: The start of the audio stream contains only silence, and the service timed out waiting for speech.");
                                break;
                            case NoMatchReason.InitialBabbleTimeout:
                                Console.WriteLine($"NOMATCH: The start of the audio stream contains only noise, and the service timed out waiting for speech.");
                                break;
                            case NoMatchReason.KeywordNotRecognized:
                                Console.WriteLine($"NOMATCH: Keyword not recognized");
                                break;
                        }
                        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 set the speech resource key and region values?");
                        }
                        break;
                    }
                    default:
                        break;
                }
            }
        }
    }
}

Создание и запуск приложения

Теперь можно приступать к созданию приложения и проверке распознавания речи, используя службу "Речь".

  1. Скомпилируйте код. В строке меню Visual Studio последовательно выберите Сборка>Собрать решение.
  2. Запустите приложение. В строке меню выберите Отладка>Начать отладку или нажмите клавишу F5.
  3. Начните распознавание. Вам будет предложено произнести какую-либо фразу. По умолчанию используется английский язык. Речь, записанная в виде текста, отправляется в службу "Речь" и выводится в консоли.

Например, если вы скажете Take me to floor 7 (Перейти на 7 этаж), результат будет выглядеть следующим образом:

Say something ...
RECOGNIZED: Text= Take me to floor 7.
  Intent Id= ChangeFloors
  FloorName= 7

Создание проекта

Создайте проект консольного приложения C++ в Visual Studio 2019 и установите пакет SDK службы "Речь".

Добавление стандартного кода

Откройте файл helloworld.cpp и добавьте код, который выступает в качестве основы для нашего проекта.

    #include <iostream>
    #include <speechapi_cxx.h>

    using namespace Microsoft::CognitiveServices::Speech;
    using namespace Microsoft::CognitiveServices::Speech::Intent;

    int main()
    {
        std::cout << "Hello World!\n";

        auto config = SpeechConfig::FromSubscription("YOUR_SUBSCRIPTION_KEY", "YOUR_SUBSCRIPTION_REGION");
    }

Создание конфигурации службы "Речь"

Прежде чем инициализировать объект IntentRecognizer, необходимо создать конфигурацию, использующую ключ и расположение ресурса прогнозирования Cognitive Services.

  • Замените значение "YOUR_SUBSCRIPTION_KEY" на ключ прогнозирования Cognitive Service.
  • Замените значение "YOUR_SUBSCRIPTION_REGION" на область ресурсов Cognitive Service.

В этом примере для создания SpeechConfig используется метод FromSubscription(). Полный список доступных методов см. в статье SpeechConfig Class (Класс SpeechConfig).

Инициализация объекта IntentRecognizer

Теперь создайте IntentRecognizer. Вставьте этот код непосредственно под конфигурацией службы "Речь".

    auto intentRecognizer = IntentRecognizer::FromConfig(config);

Добавление некоторых намерений

Необходимо связать некоторые шаблоны с помощью IntentRecognizer, вызвав AddIntent(). Мы добавим 2 намерения с одним и тем же идентификатором для изменения этажей и другое намерение с отдельным идентификатором для открытия и закрытия дверей.

    intentRecognizer->AddIntent("Take me to floor {floorName}.", "ChangeFloors");
    intentRecognizer->AddIntent("Go to floor {floorName}.", "ChangeFloors");
    intentRecognizer->AddIntent("{action} the door.", "OpenCloseDoor");

Примечание

Количество сущностей, которые можно объявить, не ограничено, но они будут нестрого соответствовать друг другу. Если добавить фразу, как {action} door, она будет соответствовать любому моменту текста перед словом door. Намерения оцениваются на основе количества их сущностей. Если два шаблона соответствуют, возвращается один шаблон с более определенными сущностями.

Распознавание намерения

В объекте IntentRecognizer необходимо вызвать метод RecognizeOnceAsync(). Этот метод запрашивает у службы "Речь" распознавание речи в одной фразе и прекращает распознавание речи после определения фразы. Для удобства мы дождемся завершения возврата.

Вставьте приведенный ниже код под строкой намерений:

    std::cout << "Say something ..." << std::endl;
    auto result = intentRecognizer->RecognizeOnceAsync().get();

Отображение результатов распознавания (или ошибок)

Когда служба "Речь" возвратит результат распознавания, мы выведем его на печать.

Вставьте код ниже под строкой auto result = intentRecognizer->RecognizeOnceAsync().get();.

switch (result->Reason)
{
case ResultReason::RecognizedSpeech:
        std::cout << "RECOGNIZED: Text = " << result->Text.c_str() << std::endl;
        std::cout << "NO INTENT RECOGNIZED!" << std::endl;
        break;
case ResultReason::RecognizedIntent:
    std::cout << "RECOGNIZED: Text = " << result->Text.c_str() << std::endl;
    std::cout << "  Intent Id = " << result->IntentId.c_str() << std::endl;
    auto entities = result->GetEntities();
    if (entities.find("floorName") != entities.end())
    {
        std::cout << "  Floor name: = " << entities["floorName"].c_str() << std::endl;
    }

    if (entities.find("action") != entities.end())
    {
        std::cout << "  Action: = " << entities["action"].c_str() << std::endl;
    }

    break;
case ResultReason::NoMatch:
{
    auto noMatch = NoMatchDetails::FromResult(result);
    switch (noMatch->Reason)
    {
    case NoMatchReason::NotRecognized:
        std::cout << "NOMATCH: Speech was detected, but not recognized." << std::endl;
        break;
    case NoMatchReason::InitialSilenceTimeout:
        std::cout << "NOMATCH: The start of the audio stream contains only silence, and the service timed out waiting for speech." << std::endl;
        break;
    case NoMatchReason::InitialBabbleTimeout:
        std::cout << "NOMATCH: The start of the audio stream contains only noise, and the service timed out waiting for speech." << std::endl;
        break;
    case NoMatchReason::KeywordNotRecognized:
        std::cout << "NOMATCH: Keyword not recognized" << std::endl;
        break;
    }
    break;
}
case ResultReason::Canceled:
{
    auto cancellation = CancellationDetails::FromResult(result);

    if (!cancellation->ErrorDetails.empty())
    {
        std::cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails.c_str() << std::endl;
        std::cout << "CANCELED: Did you set the speech resource key and region values?" << std::endl;
    }
}
default:
    break;
}

Проверка кода

На этом этапе код должен выглядеть так:

#include <iostream>
#include <speechapi_cxx.h>

using namespace Microsoft::CognitiveServices::Speech;
using namespace Microsoft::CognitiveServices::Speech::Intent;

int main()
{
    auto config = SpeechConfig::FromSubscription("YOUR_SUBSCRIPTION_KEY", "YOUR_SUBSCRIPTION_REGION");
    auto intentRecognizer = IntentRecognizer::FromConfig(config);

    intentRecognizer->AddIntent("Take me to floor {floorName}.", "ChangeFloors");
    intentRecognizer->AddIntent("Go to floor {floorName}.", "ChangeFloors");
    intentRecognizer->AddIntent("{action} the door.", "OpenCloseDoor");

    std::cout << "Say something ..." << std::endl;

    auto result = intentRecognizer->RecognizeOnceAsync().get();

    switch (result->Reason)
    {
    case ResultReason::RecognizedSpeech:
        std::cout << "RECOGNIZED: Text = " << result->Text.c_str() << std::endl;
        std::cout << "NO INTENT RECOGNIZED!" << std::endl;
        break;
    case ResultReason::RecognizedIntent:
        std::cout << "RECOGNIZED: Text = " << result->Text.c_str() << std::endl;
        std::cout << "  Intent Id = " << result->IntentId.c_str() << std::endl;
        auto entities = result->GetEntities();
        if (entities.find("floorName") != entities.end())
        {
            std::cout << "  Floor name: = " << entities["floorName"].c_str() << std::endl;
        }

        if (entities.find("action") != entities.end())
        {
            std::cout << "  Action: = " << entities["action"].c_str() << std::endl;
        }

        break;
    case ResultReason::NoMatch:
    {
        auto noMatch = NoMatchDetails::FromResult(result);
        switch (noMatch->Reason)
        {
        case NoMatchReason::NotRecognized:
            std::cout << "NOMATCH: Speech was detected, but not recognized." << std::endl;
            break;
        case NoMatchReason::InitialSilenceTimeout:
            std::cout << "NOMATCH: The start of the audio stream contains only silence, and the service timed out waiting for speech." << std::endl;
            break;
        case NoMatchReason::InitialBabbleTimeout:
            std::cout << "NOMATCH: The start of the audio stream contains only noise, and the service timed out waiting for speech." << std::endl;
            break;
        case NoMatchReason::KeywordNotRecognized:
            std::cout << "NOMATCH: Keyword not recognized." << std::endl;
            break;
        }
        break;
    }
    case ResultReason::Canceled:
    {
        auto cancellation = CancellationDetails::FromResult(result);

        if (!cancellation->ErrorDetails.empty())
        {
            std::cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails.c_str() << std::endl;
            std::cout << "CANCELED: Did you set the speech resource key and region values?" << std::endl;
        }
    }
    default:
        break;
    }
}

Создание и запуск приложения

Теперь можно приступать к созданию приложения и проверке распознавания речи, используя службу "Речь".

  1. Скомпилируйте код. В строке меню Visual Studio последовательно выберите Сборка>Собрать решение.
  2. Запустите приложение. В строке меню выберите Отладка>Начать отладку или нажмите клавишу F5.
  3. Начните распознавание. Вам будет предложено произнести какую-либо фразу. По умолчанию используется английский язык. Речь, записанная в виде текста, отправляется в службу "Речь" и выводится в консоли.

Например, если вы скажете Take me to floor 7 (Перейти на 7 этаж), результат будет выглядеть следующим образом:

Say something ...
RECOGNIZED: Text = Take me to floor 7.
  Intent Id = ChangeFloors
  Floor name: = 7

Справочная документация | Дополнительные примеры в GitHub

Здесь также описано, как установить пакет SDK для службы "Речь" для Java.

Требования платформы

Выберите целевую среду

Пакет SDK службы "Речь" для Java совместим с Windows, Linux и macOS.

В Windows необходимо использовать целевую архитектуру x64.

Для платформы необходимо установить распространяемый Microsoft Visual C++ для Visual Studio 2015, 2017, 2019 и 2022. При первой установке этого пакета может потребоваться перезагрузка.

Необходимо установить комплект SDK для Java, например Azul Zulu OpenJDK. Кроме того, должна работать сборка Microsoft OpenJDK или предпочтительный JDK.

Установка пакета SDK службы "Речь" для Java

Некоторые инструкции используют определенную версию пакета SDK, например 1.24.2. Просмотреть сведения о последней версии можно в нашем репозитории GitHub.

Выберите целевую среду

В этом руководстве объясняется, как установить пакет SDK службы "Речь" для Java в среде выполнения Java.

Поддерживаемые операционные системы

Пакет SDK службы "Речь" для Java доступен для таких операционных систем:

Выполните следующие действия, чтобы установить пакет SDK службы "Речь" для Java с помощью Apache Maven:

  1. Установите Apache Maven.
  2. Откройте командную строку, в которой должен быть создан новый проект, и создайте файл pom.xml.
  3. Скопируйте следующее XML-содержимое в pom.xml:
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.microsoft.cognitiveservices.speech.samples</groupId>
        <artifactId>quickstart-eclipse</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <build>
            <sourceDirectory>src</sourceDirectory>
            <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                <source>1.8</source>
                <target>1.8</target>
                </configuration>
            </plugin>
            </plugins>
        </build>
        <dependencies>
            <dependency>
            <groupId>com.microsoft.cognitiveservices.speech</groupId>
            <artifactId>client-sdk</artifactId>
            <version>1.24.2</version>
            </dependency>
        </dependencies>
    </project>
    
  4. Выполните следующую команду Maven, чтобы установить пакет SDK службы "Речь" и зависимости.
    mvn clean dependency:copy-dependencies
    

Добавление стандартного кода

  1. Откройте Main.java из каталога src.

  2. Замените содержимое файла следующим кодом.

package quickstart;
import java.util.Dictionary;
import java.util.concurrent.ExecutionException;

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.intent.*;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        IntentPatternMatchingWithMicrophone();
    }

    public static void IntentPatternMatchingWithMicrophone() throws InterruptedException, ExecutionException {
        SpeechConfig config = SpeechConfig.fromSubscription("YOUR_SUBSCRIPTION_KEY", "YOUR_SUBSCRIPTION_REGION");
    }
}

Создание конфигурации службы "Речь"

Прежде чем инициализировать объект IntentRecognizer, необходимо создать конфигурацию, использующую ключ и расположение ресурса прогнозирования Cognitive Services.

  • Замените значение "YOUR_SUBSCRIPTION_KEY" на ключ прогнозирования Cognitive Service.
  • Замените значение "YOUR_SUBSCRIPTION_REGION" на область ресурсов Cognitive Service.

В этом примере для создания SpeechConfig используется метод FromSubscription(). Полный список доступных методов см. в статье SpeechConfig Class (Класс SpeechConfig).

Инициализация объекта IntentRecognizer

Теперь создайте IntentRecognizer. Вставьте этот код непосредственно под конфигурацией службы "Речь".

try (IntentRecognizer intentRecognizer = new IntentRecognizer(config)) {
    
}

Добавление некоторых намерений

Необходимо связать некоторые шаблоны с помощью IntentRecognizer, вызвав addIntent(). Мы добавим 2 намерения с одним и тем же идентификатором для изменения этажей и другое намерение с отдельным идентификатором для открытия и закрытия дверей. Вставьте этот код в блок try.

intentRecognizer.addIntent("Take me to floor {floorName}.", "ChangeFloors");
intentRecognizer.addIntent("Go to floor {floorName}.", "ChangeFloors");
intentRecognizer.addIntent("{action} the door.", "OpenCloseDoor");

Примечание

Количество сущностей, которые можно объявить, не ограничено, но они будут нестрого соответствовать друг другу. Если добавить фразу, как {action} door, она будет соответствовать любому моменту текста перед словом door. Намерения оцениваются на основе количества их сущностей. Если два шаблона соответствуют, возвращается один шаблон с более определенными сущностями.

Распознавание намерения

В объекте IntentRecognizer необходимо вызвать метод recognizeOnceAsync(). Этот метод запрашивает у службы "Речь" распознавание речи в одной фразе и прекращает распознавание речи после определения фразы. Для удобства мы дождемся завершения возврата.

Вставьте приведенный ниже код под строкой намерений:

System.out.println("Say something...");

IntentRecognitionResult result = intentRecognizer.recognizeOnceAsync().get();

Отображение результатов распознавания (или ошибок)

Когда служба "Речь" возвратит результат распознавания, мы выведем его на печать.

Вставьте код ниже под строкой IntentRecognitionResult result = recognizer.recognizeOnceAsync().get();.

if (result.getReason() == ResultReason.RecognizedSpeech) {
    System.out.println("RECOGNIZED: Text= " + result.getText());
    System.out.println(String.format("%17s", "Intent not recognized."));
}
else if (result.getReason() == ResultReason.RecognizedIntent) {
    System.out.println("RECOGNIZED: Text= " + result.getText());
    System.out.println(String.format("%17s %s", "Intent Id=", result.getIntentId() + "."));
    Dictionary<String, String> entities = result.getEntities();

    if (entities.get("floorName") != null) {
        System.out.println(String.format("%17s %s", "FloorName=", entities.get("floorName")));
    }
    if (entities.get("action") != null) {
        System.out.println(String.format("%17s %s", "Action=", entities.get("action")));
    }
}
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?");
    }
}

Проверка кода

На этом этапе код должен выглядеть так:

package quickstart;
import java.util.Dictionary;
import java.util.concurrent.ExecutionException;

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.intent.*;

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        IntentPatternMatchingWithMicrophone();
    }

    public static void IntentPatternMatchingWithMicrophone() throws InterruptedException, ExecutionException {
        SpeechConfig config = SpeechConfig.fromSubscription("YOUR_SUBSCRIPTION_KEY", "YOUR_SUBSCRIPTION_REGION");

        try (IntentRecognizer intentRecognizer = new IntentRecognizer(config)) {
            intentRecognizer.addIntent("Take me to floor {floorName}.", "ChangeFloors");
            intentRecognizer.addIntent("Go to floor {floorName}.", "ChangeFloors");
            intentRecognizer.addIntent("{action} the door.", "OpenCloseDoor");

            System.out.println("Say something...");

            IntentRecognitionResult result = intentRecognizer.recognizeOnceAsync().get();
            if (result.getReason() == ResultReason.RecognizedSpeech) {
            System.out.println("RECOGNIZED: Text= " + result.getText());
            System.out.println(String.format("%17s", "Intent not recognized."));
            }
            else if (result.getReason() == ResultReason.RecognizedIntent) {
                System.out.println("RECOGNIZED: Text= " + result.getText());
                System.out.println(String.format("%17s %s", "Intent Id=", result.getIntentId() + "."));
                Dictionary<String, String> entities = result.getEntities();

                if (entities.get("floorName") != null) {
                    System.out.println(String.format("%17s %s", "FloorName=", entities.get("floorName")));
                }
                if (entities.get("action") != null) {
                    System.out.println(String.format("%17s %s", "Action=", entities.get("action")));
                }
            }
            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?");
                }
            }
        }
    }
}

Создание и запуск приложения

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

Нажмите кнопку "Выполнить" в Eclipse или нажмите клавиши CTRL + F11, а затем дождитесь появления в выходных данных подсказки "Say something..." (Скажите что-нибудь). Когда она появится, произнесите речевой фрагмент и просмотрите выходные данные.

Например, если вы скажете Take me to floor 7 (Перейти на 7 этаж), результат будет выглядеть следующим образом:

Say something ...
RECOGNIZED: Text= Take me to floor 7.
  Intent Id= ChangeFloors
  FloorName= 7

Следующие шаги

Улучшение сопоставления шаблонов с помощью настраиваемых сущностей.