Erkennen von Absichten mit Musterabgleich für benutzerdefinierte Entitäten

Das Azure KI Services Speech SDK verfügt über ein integriertes Feature, das eine Absichtserkennung mit einem einfachen Sprachmusterabgleich ermöglicht. Eine Absicht ist etwas, das der Benutzer tun möchte: ein Fenster schließen, ein Kontrollkästchen aktivieren, Text einfügen usw.

In diesem Leitfaden wird das Speech SDK verwendet, um eine Konsolenanwendung zu entwickeln, die Absichten aus Äußerungen ableitet, die in das Mikrofon Ihres Geräts gesprochen werden. Folgendes wird vermittelt:

  • Erstellen eines Visual Studio-Projekts, das auf das Speech SDK NuGet-Paket verweist
  • Erstellen einer Sprachkonfiguration und Abrufen einer Absichtserkennung
  • Hinzufügen von Absichten und Mustern über die Speech SDK-API
  • Hinzufügen von benutzerdefinierten Entitäten über die Speech SDK-API
  • Verwenden von asynchroner, ereignisgesteuerter kontinuierlicher Erkennung

Wann der Musterabgleich verwendet werden soll

Musterabgleich verwenden, wenn:

  • Sie sind nur daran interessiert, die Äußerungen des Benutzers sehr genau zu treffen. Bei diesen Mustern erfolgt ein strengerer Abgleich als bei Conversational Language Understanding (CLU).
  • Sie haben keinen Zugriff auf ein CLU-Modell, möchten aber Absichten verwenden.

Weitere Informationen finden Sie in der Musterabgleich-Übersicht.

Voraussetzungen

Vergewissern Sie sich, dass folgende Elemente vorhanden sind, bevor Sie mit diesem Leitfaden beginnen:

Erstellen eines Projekts

Erstellen Sie ein neues C#-Konsolenanwendungsprojekt in Visual Studio 2019, und installieren Sie das Speech SDK.

Beginnen mit Codebausteinen

Öffnen Sie Program.cs, und fügen Sie Code hinzu, der als Gerüst für das Projekt fungiert.

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

Erstellen einer Speech-Konfiguration

Bevor Sie ein IntentRecognizer-Objekt initialisieren können, müssen Sie eine Konfiguration erstellen, die den Schlüssel und die Azure-Region Ihrer Azure KI Services-Vorhersageressource verwendet.

  • Ersetzen Sie "YOUR_SUBSCRIPTION_KEY" durch Ihren Azure KI Services-Vorhersageschlüssel.
  • Ersetzen Sie "YOUR_SUBSCRIPTION_REGION" durch die Region Ihrer Azure KI Services-Ressource.

In diesem Beispiel wird die Methode FromSubscription() zum Erstellen von SpeechConfig verwendet. Eine vollständige Liste der verfügbaren Methoden finden Sie unter SpeechConfig-Klasse.

Initialisieren eines IntentRecognizer-Objekts

Erstellen Sie nun eine Spracherkennung (IntentRecognizer). Fügen Sie den folgenden Code direkt unterhalb Ihrer Speech-Konfiguration ein:

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

Hinzufügen von Absichten

Sie müssen einige Muster einem PatternMatchingModel zuordnen und auf den IntentRecognizer anwenden. Erstellen Sie zunächst ein PatternMatchingModel, und fügen Sie einige Absichten hinzu.

Hinweis

Einem PatternMatchingIntent können mehrere Muster hinzugefügt werden.

Fügen Sie diesen Code in den Block using ein:

// Creates a Pattern Matching model and adds specific intents from your model. The
// Id is used to identify this model from others in the collection.
var model = new PatternMatchingModel("YourPatternMatchingModelId");

// Creates a pattern that uses groups of optional words. "[Go | Take me]" will match either "Go", "Take me", or "".
var patternWithOptionalWords = "[Go | Take me] to [floor|level] {floorName}";

// Creates a pattern that uses an optional entity and group that could be used to tie commands together.
var patternWithOptionalEntity = "Go to parking [{parkingLevel}]";

// You can also have multiple entities of the same name in a single pattern by adding appending a unique identifier
// to distinguish between the instances. For example:
var patternWithTwoOfTheSameEntity = "Go to floor {floorName:1} [and then go to floor {floorName:2}]";
// NOTE: Both floorName:1 and floorName:2 are tied to the same list of entries. The identifier can be a string
//       and is separated from the entity name by a ':'

// Creates the pattern matching intents and adds them to the model
model.Intents.Add(new PatternMatchingIntent("ChangeFloors", patternWithOptionalWords, patternWithOptionalEntity, patternWithTwoOfTheSameEntity));
model.Intents.Add(new PatternMatchingIntent("DoorControl", "{action} the doors", "{action} doors", "{action} the door", "{action} door"));

Hinzufügen einiger benutzerdefinierter Entitäten

Wenn Sie den Musterabgleich (Matcher) optimal nutzen möchten, können Sie Ihre Entitäten anpassen. Erstellen Sie aus „floorName“ eine Liste mit verfügbaren Etagen. Außerdem wird „parkingLevel“ als ganzzahlige Entität festgelegt.

Fügen Sie diesen Code unterhalb Ihrer Absichten ein:

// Creates the "floorName" entity and set it to type list.
// Adds acceptable values. NOTE the default entity type is Any and so we do not need
// to declare the "action" entity.
model.Entities.Add(PatternMatchingEntity.CreateListEntity("floorName", EntityMatchMode.Strict, "ground floor", "lobby", "1st", "first", "one", "1", "2nd", "second", "two", "2"));

// Creates the "parkingLevel" entity as a pre-built integer
model.Entities.Add(PatternMatchingEntity.CreateIntegerEntity("parkingLevel"));

Anwenden des Modells auf den Recognizer

Nun muss das Modell auf den IntentRecognizer angewendet werden. Es können mehrere Modelle gleichzeitig verwendet werden, sodass die API eine Sammlung von Modellen verwendet.

Fügen Sie diesen Code unterhalb Ihrer Entitäten ein:

var modelCollection = new LanguageUnderstandingModelCollection();
modelCollection.Add(model);

recognizer.ApplyLanguageModels(modelCollection);

Erkennen einer Absicht

Rufen Sie die Methode RecognizeOnceAsync() über das Objekt IntentRecognizer auf. Diese Methode fordert den Speech-Dienst auf, die Sprache in einem einzelnen Ausdruck zu erkennen und die Spracherkennung zu beenden, sobald der Ausdruck identifiziert wurde.

Fügen Sie diesen Code nach dem Anwenden der Sprachmodelle ein:

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

var result = await recognizer.RecognizeOnceAsync();

Anzeigen der Erkennungsergebnisse (oder Fehler)

Das vom Speech-Dienst zurückgegebene Erkennungsergebnis soll ausgegeben werden.

Fügen Sie diesen Code unterhalb von var result = await recognizer.RecognizeOnceAsync(); ein:

if (result.Reason == ResultReason.RecognizedIntent)
{
    Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    Console.WriteLine($"       Intent Id={result.IntentId}.");

    var entities = result.Entities;
    switch (result.IntentId)
    {
        case "ChangeFloors":
            if (entities.TryGetValue("floorName", out string floorName))
            {
                Console.WriteLine($"       FloorName={floorName}");
            }

            if (entities.TryGetValue("floorName:1", out floorName))
            {
                Console.WriteLine($"     FloorName:1={floorName}");
            }

            if (entities.TryGetValue("floorName:2", out floorName))
            {
                Console.WriteLine($"     FloorName:2={floorName}");
            }

            if (entities.TryGetValue("parkingLevel", out string parkingLevel))
            {
                Console.WriteLine($"    ParkingLevel={parkingLevel}");
            }

            break;

        case "DoorControl":
            if (entities.TryGetValue("action", out string action))
            {
                Console.WriteLine($"          Action={action}");
            }
            break;
    }
}
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 set the speech resource key and region values?");
    }
}

Überprüfen des Codes

Ihr Code sollte nun wie folgt aussehen:

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 recognizer = new IntentRecognizer(config))
            {
                // Creates a Pattern Matching model and adds specific intents from your model. The
                // Id is used to identify this model from others in the collection.
                var model = new PatternMatchingModel("YourPatternMatchingModelId");

                // Creates a pattern that uses groups of optional words. "[Go | Take me]" will match either "Go", "Take me", or "".
                var patternWithOptionalWords = "[Go | Take me] to [floor|level] {floorName}";

                // Creates a pattern that uses an optional entity and group that could be used to tie commands together.
                var patternWithOptionalEntity = "Go to parking [{parkingLevel}]";

                // You can also have multiple entities of the same name in a single pattern by adding appending a unique identifier
                // to distinguish between the instances. For example:
                var patternWithTwoOfTheSameEntity = "Go to floor {floorName:1} [and then go to floor {floorName:2}]";
                // NOTE: Both floorName:1 and floorName:2 are tied to the same list of entries. The identifier can be a string
                //       and is separated from the entity name by a ':'

                // Adds some intents to look for specific patterns.
                model.Intents.Add(new PatternMatchingIntent("ChangeFloors", patternWithOptionalWords, patternWithOptionalEntity, patternWithTwoOfTheSameEntity));
                model.Intents.Add(new PatternMatchingIntent("DoorControl", "{action} the doors", "{action} doors", "{action} the door", "{action} door"));

                // Creates the "floorName" entity and set it to type list.
                // Adds acceptable values. NOTE the default entity type is Any and so we do not need
                // to declare the "action" entity.
                model.Entities.Add(PatternMatchingEntity.CreateListEntity("floorName", EntityMatchMode.Strict, "ground floor", "lobby", "1st", "first", "one", "1", "2nd", "second", "two", "2"));

                // Creates the "parkingLevel" entity as a pre-built integer
                model.Entities.Add(PatternMatchingEntity.CreateIntegerEntity("parkingLevel"));

                var modelCollection = new LanguageUnderstandingModelCollection();
                modelCollection.Add(model);

                recognizer.ApplyLanguageModels(modelCollection);

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

                var result = await recognizer.RecognizeOnceAsync();

                if (result.Reason == ResultReason.RecognizedIntent)
                {
                    Console.WriteLine($"RECOGNIZED: Text={result.Text}");
                    Console.WriteLine($"       Intent Id={result.IntentId}.");

                    var entities = result.Entities;
                    switch (result.IntentId)
                    {
                        case "ChangeFloors":
                            if (entities.TryGetValue("floorName", out string floorName))
                            {
                                Console.WriteLine($"       FloorName={floorName}");
                            }

                            if (entities.TryGetValue("floorName:1", out floorName))
                            {
                                Console.WriteLine($"     FloorName:1={floorName}");
                            }

                            if (entities.TryGetValue("floorName:2", out floorName))
                            {
                                Console.WriteLine($"     FloorName:2={floorName}");
                            }

                            if (entities.TryGetValue("parkingLevel", out string parkingLevel))
                            {
                                Console.WriteLine($"    ParkingLevel={parkingLevel}");
                            }

                            break;

                        case "DoorControl":
                            if (entities.TryGetValue("action", out string action))
                            {
                                Console.WriteLine($"          Action={action}");
                            }
                            break;
                    }
                }
                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 set the speech resource key and region values?");
                    }
                }
            }
        }
    }
}

Erstellen und Ausführen der App

Sie können nun Ihre App erstellen und die Spracherkennung mit dem Speech-Dienst testen.

  1. Kompilieren des Codes: Wählen Sie auf der Menüleiste von Visual Studio Build>Projektmappe erstellen aus.
  2. Starten der App: Wählen Sie auf der Menüleiste Debuggen>Debuggen starten aus, oder drücken Sie F5.
  3. Starten der Erkennung: Sie werden aufgefordert, etwas zu sagen. Die Standardsprache ist Deutsch. Ihre Spracheingabe wird an den Speech-Dienst gesendet, in Text transkribiert und in der Konsole ausgegeben.

Wenn Sie z. B. „Take me to floor 2“ sagen, sollte die Ausgabe wie folgt aussehen:

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

Wenn Sie „Take me to floor 7“ sagen, sollte die Ausgabe wie folgt aussehen:

Say something...
RECOGNIZED: Text=Take me to floor 7.
    Intent not recognized.

Es wurde keine Absicht erkannt, da „7“ nicht in der Liste gültiger Werte für „floorName“ enthalten war.

Erstellen eines Projekts

Erstellen Sie ein neues C++-Konsolenanwendungsprojekt in Visual Studio 2019, und installieren Sie das Speech SDK.

Beginnen mit Codebausteinen

Öffnen Sie helloworld.cpp, und fügen Sie Code hinzu, der als Gerüst für das Projekt fungiert.

#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");
}

Erstellen einer Speech-Konfiguration

Bevor Sie ein IntentRecognizer-Objekt initialisieren können, müssen Sie eine Konfiguration erstellen, die den Schlüssel und die Azure-Region Ihrer Azure KI Services-Vorhersageressource verwendet.

  • Ersetzen Sie "YOUR_SUBSCRIPTION_KEY" durch Ihren Azure KI Services-Vorhersageschlüssel.
  • Ersetzen Sie "YOUR_SUBSCRIPTION_REGION" durch die Region Ihrer Azure KI Services-Ressource.

In diesem Beispiel wird die Methode FromSubscription() zum Erstellen von SpeechConfig verwendet. Eine vollständige Liste der verfügbaren Methoden finden Sie unter SpeechConfig-Klasse.

Initialisieren eines IntentRecognizer-Objekts

Erstellen Sie nun eine Spracherkennung (IntentRecognizer). Fügen Sie den folgenden Code direkt unterhalb Ihrer Speech-Konfiguration ein:

    auto intentRecognizer = IntentRecognizer::FromConfig(config);

Hinzufügen von Absichten

Sie müssen einige Muster einem PatternMatchingModel zuordnen und auf den IntentRecognizer anwenden. Erstellen Sie zunächst ein PatternMatchingModel, und fügen Sie einige Absichten hinzu. Bei einem PatternMatchingIntent handelt es sich um eine Struktur. Daher wird lediglich die Inlinesyntax verwendet.

Hinweis

Einem PatternMatchingIntent können mehrere Muster hinzugefügt werden.

auto model = PatternMatchingModel::FromId("myNewModel");

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

Hinzufügen einiger benutzerdefinierter Entitäten

Wenn Sie den Musterabgleich (Matcher) optimal nutzen möchten, können Sie Ihre Entitäten anpassen. Erstellen Sie aus „floorName“ eine Liste mit verfügbaren Etagen.

model->Entities.push_back({ "floorName" , Intent::EntityType::List, Intent::EntityMatchMode::Strict, {"one", "1", "two", "2", "lobby", "ground floor"} });

Anwenden des Modells auf den Recognizer

Nun muss das Modell auf den IntentRecognizer angewendet werden. Es können mehrere Modelle gleichzeitig verwendet werden, sodass die API eine Sammlung von Modellen verwendet.

std::vector<std::shared_ptr<LanguageUnderstandingModel>> collection;

collection.push_back(model);
intentRecognizer->ApplyLanguageModels(collection);

Erkennen einer Absicht

Rufen Sie die Methode RecognizeOnceAsync() über das Objekt IntentRecognizer auf. Diese Methode fordert den Speech-Dienst auf, die Sprache in einem einzelnen Ausdruck zu erkennen und die Spracherkennung zu beenden, sobald der Ausdruck identifiziert wurde. Der Einfachheit halber warten wir auf die kommende Rückgabe, um fortzufahren.

Fügen Sie diesen Code unterhalb Ihrer Absichten ein:

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

Anzeigen der Erkennungsergebnisse (oder Fehler)

Das vom Speech-Dienst zurückgegebene Erkennungsergebnis soll ausgegeben werden.

Fügen Sie diesen Code unterhalb von auto result = intentRecognizer->RecognizeOnceAsync().get(); ein:

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;
}

Überprüfen des Codes

Ihr Code sollte nun wie folgt aussehen:

#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);

    auto model = PatternMatchingModel::FromId("myNewModel");

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

    model->Entities.push_back({ "floorName" , Intent::EntityType::List, Intent::EntityMatchMode::Strict, {"one", "1", "two", "2", "lobby", "ground floor"} });

    std::vector<std::shared_ptr<LanguageUnderstandingModel>> collection;

    collection.push_back(model);
    intentRecognizer->ApplyLanguageModels(collection);

    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;
    }
}

Erstellen und Ausführen der App

Sie können nun Ihre App erstellen und die Spracherkennung mit dem Speech-Dienst testen.

  1. Kompilieren des Codes: Wählen Sie auf der Menüleiste von Visual Studio Build>Projektmappe erstellen aus.
  2. Starten der App: Wählen Sie auf der Menüleiste Debuggen>Debuggen starten aus, oder drücken Sie F5.
  3. Starten der Erkennung: Sie werden aufgefordert, etwas zu sagen. Die Standardsprache ist Deutsch. Ihre Spracheingabe wird an den Speech-Dienst gesendet, in Text transkribiert und in der Konsole ausgegeben.

Wenn Sie z. B. „Take me to floor 2“ sagen, sollte die Ausgabe wie folgt aussehen:

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

Wenn Sie z. B. „Take me to floor 7“ sagen, sollte die Ausgabe wie folgt aussehen:

Say something ...
RECOGNIZED: Text = Take me to floor 7.
NO INTENT RECOGNIZED!

Die ID der Absicht ist leer, da 7 nicht in der Liste enthalten ist.

Referenzdokumentation | Zusätzliche Beispiele auf GitHub

In diesem Schnellstart installieren Sie das Speech SDK für Java.

Plattformanforderungen

Auswählen Ihrer Zielumgebung:

Das Speech SDK für Java ist mit Windows, Linux und macOS kompatibel.

Unter Windows müssen Sie die 64-Bit-Zielarchitektur verwenden. Windows 10 oder höher ist erforderlich.

Installieren Sie Microsoft Visual C++ Redistributable für Visual Studio 2015, 2017, 2019 und 2022 für Ihre Plattform. Bei der Erstinstallation dieses Pakets ist möglicherweise ein Neustart erforderlich.

Das Speech SDK für Java unterstützt kein Windows auf ARM64.

Installieren Sie ein Java Development Kit wie z. B. Azul Zulu OpenJDK. Der Microsoft-Build von OpenJDK oder Ihr bevorzugtes JDK sollte ebenfalls funktionieren.

Installieren des Speech SDK für Java

In einigen Anweisungen wird eine bestimmte SDK-Version verwendet, z. B. 1.24.2. Um die neueste Version zu ermitteln, durchsuchen Sie unser GitHub-Repository.

Auswählen Ihrer Zielumgebung:

In diesem Leitfaden erfahren Sie, wie Sie das Speech SDK für Java in der Java Runtime installieren.

Unterstützte Betriebssysteme

Das Paket mit dem Speech SDK für Java ist für die folgenden Betriebssysteme verfügbar:

Führen Sie die folgenden Schritte aus, um das Speech SDK für Java mithilfe von Apache Maven zu installieren:

  1. Installieren Sie Apache Maven.

  2. Öffnen Sie am gewünschten Speicherort für das neue Projekt eine Eingabeaufforderung, und erstellen Sie eine neue pom.xml-Datei.

  3. Kopieren Sie den folgenden XML-Inhalt in 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.37.0</version>
            </dependency>
        </dependencies>
    </project>
    
  4. Führen Sie den folgenden Maven-Befehl aus, um das Speech SDK und Abhängigkeiten zu installieren.

    mvn clean dependency:copy-dependencies
    

Beginnen mit Codebausteinen

  1. Öffnen Sie Main.java aus dem src-Verzeichnis.

  2. Ersetzen Sie den Inhalt der Datei durch Folgendes:

import java.util.ArrayList;
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");
    }
}

Erstellen einer Speech-Konfiguration

Bevor Sie ein IntentRecognizer-Objekt initialisieren können, müssen Sie eine Konfiguration erstellen, die den Schlüssel und die Azure-Region Ihrer Azure KI Services-Vorhersageressource verwendet.

  • Ersetzen Sie "YOUR_SUBSCRIPTION_KEY" durch Ihren Azure KI Services-Vorhersageschlüssel.
  • Ersetzen Sie "YOUR_SUBSCRIPTION_REGION" durch die Region Ihrer Azure KI Services-Ressource.

In diesem Beispiel wird die Methode fromSubscription() zum Erstellen von SpeechConfig verwendet. Eine vollständige Liste der verfügbaren Methoden finden Sie unter SpeechConfig-Klasse.

Initialisieren eines IntentRecognizer-Objekts

Erstellen Sie nun eine Spracherkennung (IntentRecognizer). Fügen Sie den folgenden Code direkt unterhalb Ihrer Speech-Konfiguration ein: Dies tun wir in einem Versuch,die autoclosable Schnittstelle zu nutzen.

try (IntentRecognizer recognizer = new IntentRecognizer(config)) {

}

Hinzufügen von Absichten

Sie müssen einige Muster einem PatternMatchingModel zuordnen und auf den IntentRecognizer anwenden. Erstellen Sie zunächst ein PatternMatchingModel, und fügen Sie einige Absichten hinzu.

Hinweis

Einem PatternMatchingIntent können mehrere Muster hinzugefügt werden.

Fügen Sie diesen Code in den Block try ein:

// Creates a Pattern Matching model and adds specific intents from your model. The
// Id is used to identify this model from others in the collection.
PatternMatchingModel model = new PatternMatchingModel("YourPatternMatchingModelId");

// Creates a pattern that uses groups of optional words. "[Go | Take me]" will match either "Go", "Take me", or "".
String patternWithOptionalWords = "[Go | Take me] to [floor|level] {floorName}";

// Creates a pattern that uses an optional entity and group that could be used to tie commands together.
String patternWithOptionalEntity = "Go to parking [{parkingLevel}]";

// You can also have multiple entities of the same name in a single pattern by adding appending a unique identifier
// to distinguish between the instances. For example:
String patternWithTwoOfTheSameEntity = "Go to floor {floorName:1} [and then go to floor {floorName:2}]";
// NOTE: Both floorName:1 and floorName:2 are tied to the same list of entries. The identifier can be a string
//       and is separated from the entity name by a ':'

// Creates the pattern matching intents and adds them to the model
model.getIntents().put(new PatternMatchingIntent("ChangeFloors", patternWithOptionalWords, patternWithOptionalEntity, patternWithTwoOfTheSameEntity));
model.getIntents().put(new PatternMatchingIntent("DoorControl", "{action} the doors", "{action} doors", "{action} the door", "{action} door"));

Hinzufügen einiger benutzerdefinierter Entitäten

Wenn Sie den Musterabgleich (Matcher) optimal nutzen möchten, können Sie Ihre Entitäten anpassen. Erstellen Sie aus „floorName“ eine Liste mit verfügbaren Etagen. Außerdem wird „parkingLevel“ als ganzzahlige Entität festgelegt.

Fügen Sie diesen Code unterhalb Ihrer Absichten ein:

// Creates the "floorName" entity and set it to type list.
// Adds acceptable values. NOTE the default entity type is Any and so we do not need
// to declare the "action" entity.
model.getEntities().put(PatternMatchingEntity.CreateListEntity("floorName", PatternMatchingEntity.EntityMatchMode.Strict, "ground floor", "lobby", "1st", "first", "one", "1", "2nd", "second", "two", "2"));

// Creates the "parkingLevel" entity as a pre-built integer
model.getEntities().put(PatternMatchingEntity.CreateIntegerEntity("parkingLevel"));

Anwenden des Modells auf den Recognizer

Nun muss das Modell auf den IntentRecognizer angewendet werden. Es können mehrere Modelle gleichzeitig verwendet werden, sodass die API eine Sammlung von Modellen verwendet.

Fügen Sie diesen Code unterhalb Ihrer Entitäten ein:

ArrayList<LanguageUnderstandingModel> modelCollection = new ArrayList<LanguageUnderstandingModel>();
modelCollection.add(model);

recognizer.applyLanguageModels(modelCollection);

Erkennen einer Absicht

Rufen Sie die Methode RecognizeOnceAsync() über das Objekt IntentRecognizer auf. Diese Methode fordert den Speech-Dienst auf, die Sprache in einem einzelnen Ausdruck zu erkennen und die Spracherkennung zu beenden, sobald der Ausdruck identifiziert wurde.

Fügen Sie diesen Code nach dem Anwenden der Sprachmodelle ein:

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

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

Anzeigen der Erkennungsergebnisse (oder Fehler)

Das vom Speech-Dienst zurückgegebene Erkennungsergebnis soll ausgegeben werden.

Fügen Sie diesen Code unterhalb von IntentRecognitionResult result = recognizer.recognizeOnceAsync.get(); ein:

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();

    switch (result.getIntentId())
    {
        case "ChangeFloors":
            if (entities.get("floorName") != null) {
                System.out.println(String.format("%17s %s", "FloorName=", entities.get("floorName")));
            }
            if (entities.get("floorName:1") != null) {
                System.out.println(String.format("%17s %s", "FloorName:1=", entities.get("floorName:1")));
            }
            if (entities.get("floorName:2") != null) {
                System.out.println(String.format("%17s %s", "FloorName:2=", entities.get("floorName:2")));
            }
            if (entities.get("parkingLevel") != null) {
                System.out.println(String.format("%17s %s", "ParkingLevel=", entities.get("parkingLevel")));
            }
            break;
        case "DoorControl":
            if (entities.get("action") != null) {
                System.out.println(String.format("%17s %s", "Action=", entities.get("action")));
            }
            break;
    }
}
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?");
    }
}

Überprüfen des Codes

Ihr Code sollte nun wie folgt aussehen:

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

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 recognizer = new IntentRecognizer(config)) {
            // Creates a Pattern Matching model and adds specific intents from your model. The
            // Id is used to identify this model from others in the collection.
            PatternMatchingModel model = new PatternMatchingModel("YourPatternMatchingModelId");

            // Creates a pattern that uses groups of optional words. "[Go | Take me]" will match either "Go", "Take me", or "".
            String patternWithOptionalWords = "[Go | Take me] to [floor|level] {floorName}";

            // Creates a pattern that uses an optional entity and group that could be used to tie commands together.
            String patternWithOptionalEntity = "Go to parking [{parkingLevel}]";

            // You can also have multiple entities of the same name in a single pattern by adding appending a unique identifier
            // to distinguish between the instances. For example:
            String patternWithTwoOfTheSameEntity = "Go to floor {floorName:1} [and then go to floor {floorName:2}]";
            // NOTE: Both floorName:1 and floorName:2 are tied to the same list of entries. The identifier can be a string
            // and is separated from the entity name by a ':'

            // Creates the pattern matching intents and adds them to the model
            model.getIntents().put(new PatternMatchingIntent("ChangeFloors", patternWithOptionalWords, patternWithOptionalEntity, patternWithTwoOfTheSameEntity));
            model.getIntents().put(new PatternMatchingIntent("DoorControl", "{action} the doors", "{action} doors", "{action} the door", "{action} door"));

            // Creates the "floorName" entity and set it to type list.
            // Adds acceptable values. NOTE the default entity type is Any and so we do not need
            // to declare the "action" entity.
            model.getEntities().put(PatternMatchingEntity.CreateListEntity("floorName", PatternMatchingEntity.EntityMatchMode.Strict, "ground floor", "lobby", "1st", "first", "one", "1", "2nd", "second", "two", "2"));

            // Creates the "parkingLevel" entity as a pre-built integer
            model.getEntities().put(PatternMatchingEntity.CreateIntegerEntity("parkingLevel"));

            ArrayList<LanguageUnderstandingModel> modelCollection = new ArrayList<LanguageUnderstandingModel>();
            modelCollection.add(model);

            recognizer.applyLanguageModels(modelCollection);

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

            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();

                switch (result.getIntentId())
                {
                    case "ChangeFloors":
                        if (entities.get("floorName") != null) {
                            System.out.println(String.format("%17s %s", "FloorName=", entities.get("floorName")));
                        }
                        if (entities.get("floorName:1") != null) {
                            System.out.println(String.format("%17s %s", "FloorName:1=", entities.get("floorName:1")));
                        }
                        if (entities.get("floorName:2") != null) {
                            System.out.println(String.format("%17s %s", "FloorName:2=", entities.get("floorName:2")));
                        }
                        if (entities.get("parkingLevel") != null) {
                            System.out.println(String.format("%17s %s", "ParkingLevel=", entities.get("parkingLevel")));
                        }
                        break;

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

Erstellen und Ausführen der App

Jetzt können Sie Ihre App erstellen und unsere Absichtserkennung testen. Verwenden Sie den Sprachdienst und den eingebetteten Pattern Matcher.

Wählen Sie in Eclipse die Schaltfläche „Ausführen“ aus, oder drücken Sie die Tastenkombination STRG+F11, und achten Sie in der Ausgabe auf die Aufforderung „Sagen Sie etwas...“. Sobald sie angezeigt wird, sprechen Sie Ihre Äußerung, und beobachten Sie die Ausgabe.

Wenn Sie z. B. „Take me to floor 2“ sagen, sollte die Ausgabe wie folgt aussehen:

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

Wenn Sie „Take me to floor 7“ sagen, sollte die Ausgabe wie folgt aussehen:

Say something...
RECOGNIZED: Text=Take me to floor 7.
    Intent not recognized.

Es wurde keine Absicht erkannt, da „7“ nicht in der Liste gültiger Werte für „floorName“ enthalten war.