Erkennen von Absichten mit einfachem Sprachmusterabgleich

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 verwenden Sie das Speech SDK, um eine C++-Konsolenanwendung zu entwickeln, die Absichten aus Benutzeräußerungen über das Mikrofon Ihres Geräts ableitet. 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
  • Erkennen von Spracheingaben per Mikrofon
  • 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:

Speech und einfache Muster

Die einfachen Muster sind ein Feature des Speech SDK und erfordern eine Azure KI Services- oder Unified Speech-Ressource.

Ein Muster ist ein Ausdruck, der eine Entität enthält. Eine Entität wird definiert, indem ein Wort in geschweifte Klammern eingeschlossen wird. Dadurch wird eine Entität mit der ID „floorName“ definiert, bei der die Groß-/Kleinschreibung beachtet wird:

    Take me to the {floorName}

Alle anderen Sonderzeichen und Satzzeichen werden ignoriert.

Absichten werden mithilfe von Aufrufen der API „IntentRecognizer->AddIntent()“ hinzugefügt.

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 den Standort 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 intentRecognizer = new IntentRecognizer(config))
{
    
}

Hinzufügen von Absichten

Sie müssen einige Muster mit der IntentRecognizer verknüpfen, indem Sie AddIntent() aufrufen. Wir fügen zwei Absichten mit der gleichen ID zum Wechseln der Etagen und eine weitere Absicht mit einer separaten ID zum Öffnen und Schließen von Türen hinzu. Fügen Sie diesen Code in den Block using ein:

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

Hinweis

Sie können eine beliebige Anzahl von Entitäten deklarieren, sie werden jedoch grob abgeglichen. Wenn Sie einen Ausdruck wie „{action} door“ hinzufügen, wird er jedes Mal als Übereinstimmung ermittelt, wenn Text vor dem Wort „door“ vorhanden ist. Absichten werden basierend auf ihrer Anzahl von Entitäten ausgewertet. Wenn zwei Muster übereinstimmen, wird die Absicht zurückgegeben, für die mehr Entitäten definiert sind.

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:

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

var result = await intentRecognizer.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:

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

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

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. „Führe mich zu Etage 7“ sagen, sollte die Ausgabe wie folgt aussehen:

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

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 den Standort 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 mit der IntentRecognizer verknüpfen, indem Sie AddIntent() aufrufen. Wir fügen zwei Absichten mit der gleichen ID zum Wechseln der Etagen und eine weitere Absicht mit einer separaten ID zum Öffnen und Schließen von Türen hinzu.

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

Hinweis

Sie können eine beliebige Anzahl von Entitäten deklarieren, sie werden jedoch grob abgeglichen. Wenn Sie einen Ausdruck wie „{action} door“ hinzufügen, wird er jedes Mal als Übereinstimmung ermittelt, wenn Text vor dem Wort „door“ vorhanden ist. Absichten werden basierend auf ihrer Anzahl von Entitäten ausgewertet. Wenn zwei Muster übereinstimmen, wird die Absicht zurückgegeben, für die mehr Entitäten definiert sind.

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

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

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. „Führe mich zu Etage 7“ sagen, sollte die Ausgabe wie folgt aussehen:

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

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:

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

Erstellen einer Speech-Konfiguration

Bevor Sie ein IntentRecognizer-Objekt initialisieren können, müssen Sie eine Konfiguration erstellen, die den Schlüssel und den Standort 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:

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

Hinzufügen von Absichten

Sie müssen einige Muster mit der IntentRecognizer verknüpfen, indem Sie addIntent() aufrufen. Wir fügen zwei Absichten mit der gleichen ID zum Wechseln der Etagen und eine weitere Absicht mit einer separaten ID zum Öffnen und Schließen von Türen hinzu. Fügen Sie diesen Code in den Block try ein:

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

Hinweis

Sie können eine beliebige Anzahl von Entitäten deklarieren, sie werden jedoch grob abgeglichen. Wenn Sie einen Ausdruck wie „{action} door“ hinzufügen, wird er jedes Mal als Übereinstimmung ermittelt, wenn Text vor dem Wort „door“ vorhanden ist. Absichten werden basierend auf ihrer Anzahl von Entitäten ausgewertet. Wenn zwei Muster übereinstimmen, wird die Absicht zurückgegeben, für die mehr Entitäten definiert sind.

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:

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

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

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

Überprüfen des Codes

Ihr Code sollte nun wie folgt aussehen:

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

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 es angezeigt wird, sprechen Sie Ihre Äußerung und beobachten Sie die Ausgabe.

Wenn Sie z. B. „Führe mich zu Etage 7“ sagen, sollte die Ausgabe wie folgt aussehen:

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

Nächste Schritte

Verbessern Sie den Musterabgleich mithilfe von benutzerdefinierten Entitäten.