Szándékok felismerése egyszerű nyelvi mintaegyezéssel

Az Azure AI services Speech SDK beépített funkcióval rendelkezik, amely egyszerű nyelvi mintaegyeztetéssel biztosítja a szándékfelismerést. A szándék a felhasználó feladata: ablak bezárása, jelölőnégyzet megjelölése, szöveg beszúrása stb.

Ebben az útmutatóban a Speech SDK használatával fejleszthet egy C++ konzolalkalmazást, amely a felhasználói kimondott szövegekből származó szándékokat az eszköz mikrofonján keresztül nyeri. Az alábbiak végrehajtásának módját ismerheti meg:

  • A Speech SDK NuGet-csomagra vonatkozó Visual Studio-projekt létrehozása
  • Beszédkonfiguráció létrehozása és szándékfelismerő lekérése
  • Szándékok és minták hozzáadása a Speech SDK API-val
  • Beszéd felismerése mikrofonból
  • Aszinkron, eseményvezérelt folyamatos felismerés használata

Mikor érdemes mintaegyezést használni?

Mintaegyeztetés használata, ha:

  • Csak azt szeretné, hogy szigorúan megegyezz azzal, amit a felhasználó mondott. Ezek a minták agresszívabban egyeznek, mint a társalgási nyelvértés (CLU).
  • Nem rendelkezik hozzáféréssel a CLU-modellhez, de továbbra is szándékokat szeretne.

További információkért tekintse meg a mintaegyeztetés áttekintését.

Előfeltételek

Az útmutató megkezdése előtt győződjön meg arról, hogy a következő elemekkel rendelkezik:

Beszéd és egyszerű minták

Az egyszerű minták a Speech SDK egyik funkciója, és Azure AI-szolgáltatási erőforrásra vagy unified Speech-erőforrásra van szükségük.

A minta egy olyan kifejezés, amely magában foglal egy entitást valahol benne. Az entitások úgy definiálhatóak, hogy egy szót szögletes zárójelekbe tördelnek. Ez a példa egy "floorName" azonosítójú entitást határoz meg, amely megkülönbözteti a kis- és nagybetűket:

    Take me to the {floorName}

A rendszer figyelmen kívül hagyja az összes többi speciális karaktert és írásjelet.

A szándékok az IntentRecognizer-AddIntent>() API hívásával lesznek hozzáadva.

Projekt létrehozása

Hozzon létre egy új C#-konzolalkalmazás-projektet a Visual Studio 2019-ben, és telepítse a Speech SDK-t.

Kezdje néhány sablonkóddal

Nyissunk meg Program.cs és adjunk hozzá néhány olyan kódot, amely csontvázként működik a projektünkhöz.

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

Beszédkonfiguráció létrehozása

Mielőtt inicializálhat egy IntentRecognizer objektumot, létre kell hoznia egy konfigurációt, amely az Azure AI-szolgáltatások előrejelzési erőforrásának kulcsát és helyét használja.

  • Cserélje le "YOUR_SUBSCRIPTION_KEY" az Azure AI-szolgáltatások előrejelzési kulcsára.
  • Cserélje le "YOUR_SUBSCRIPTION_REGION" az Azure AI-szolgáltatások erőforrásrégióját.

Ez a minta a metódust használja a FromSubscription()SpeechConfig. Az elérhető módszerek teljes listáját a SpeechConfig osztályban találja.

IntentRecognizer inicializálása

Most hozzon létre egy IntentRecognizer. Szúrja be ezt a kódot közvetlenül a Speech-konfiguráció alá.

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

Szándékok hozzáadása

Néhány mintát társítania kell a IntentRecognizer hívással AddIntent(). 2 szándékot adunk hozzá ugyanazzal az azonosítóval a padlócseréhez, egy másik szándékot pedig külön azonosítóval az ajtók megnyitásához és bezárásához. Szúrja be ezt a kódot a blokkba using :

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

Feljegyzés

A deklarálható entitások száma nincs korlátozva, de azok lazán megegyeznek. Ha olyan kifejezést ad hozzá, mint a "{action} ajtó", akkor az minden alkalommal megegyezik, amikor az "ajtó" szó előtt szöveg jelenik meg. A szándékok kiértékelése az entitások száma alapján történik. Ha két minta egyezne, a rendszer a definiáltabb entitásokkal rendelkezőt adja vissza.

Szándék felismerése

IntentRecognizer Az objektumból fogja meghívni a metódustRecognizeOnceAsync(). Ez a módszer arra kéri a Speech szolgáltatást, hogy egyetlen kifejezésben felismerje a beszédet, és a kifejezés azonosítása után hagyja abba a beszéd felismerését. Az egyszerűség kedvéért megvárjuk a jövőt, amíg befejeződik.

Szúrja be ezt a kódot a szándékok alá:

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

var result = await intentRecognizer.RecognizeOnceAsync();

A felismerési eredmények (vagy hibák) megjelenítése

Amikor a Speech szolgáltatás visszaadja a felismerési eredményt, kinyomtatjuk az eredményt.

Szúrja be a következő var result = await recognizer.RecognizeOnceAsync();kódot:

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

A kód ellenőrzése

Ezen a ponton a kódnak a következőképpen kell kinéznie:

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

Az alkalmazás létrehozása és futtatása

Most már készen áll az alkalmazás összeállítására és a beszédfelismerés tesztelésére a Speech szolgáltatással.

  1. A kód fordítása – A Visual Studio menüsávjában válassza a Build Megoldás létrehozása>lehetőséget.
  2. Az alkalmazás indítása – A menüsávon válassza a Hibakeresés indítása hibakeresése> lehetőséget, vagy nyomja le az F5 billentyűt.
  3. Felismerés indítása – Ez arra fogja kérni, hogy mondjon valamit. Az alapértelmezett nyelv az angol. A rendszer elküldi a beszédet a Speech szolgáltatásnak, átíratja szövegként, és a konzolon jeleníti meg.

Ha például azt mondja, hogy "Vigyen a 7. emeletre", akkor a kimenetnek a következőnek kell lennie:

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

Projekt létrehozása

Hozzon létre egy új C++ konzolalkalmazás-projektet a Visual Studio 2019-ben, és telepítse a Speech SDK-t.

Kezdje néhány sablonkóddal

Nyissunk meg helloworld.cpp és adjunk hozzá néhány olyan kódot, amely csontvázként működik a projektünkhöz.

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

Beszédkonfiguráció létrehozása

Mielőtt inicializálhat egy IntentRecognizer objektumot, létre kell hoznia egy konfigurációt, amely az Azure AI-szolgáltatások előrejelzési erőforrásának kulcsát és helyét használja.

  • Cserélje le "YOUR_SUBSCRIPTION_KEY" az Azure AI-szolgáltatások előrejelzési kulcsára.
  • Cserélje le "YOUR_SUBSCRIPTION_REGION" az Azure AI-szolgáltatások erőforrásrégióját.

Ez a minta a metódust használja a FromSubscription()SpeechConfig. Az elérhető módszerek teljes listáját a SpeechConfig osztályban találja.

IntentRecognizer inicializálása

Most hozzon létre egy IntentRecognizer. Szúrja be ezt a kódot közvetlenül a Speech-konfiguráció alá.

    auto intentRecognizer = IntentRecognizer::FromConfig(config);

Szándékok hozzáadása

Néhány mintát társítania kell a IntentRecognizer hívással AddIntent(). 2 szándékot adunk hozzá ugyanazzal az azonosítóval a padlócseréhez, egy másik szándékot pedig külön azonosítóval az ajtók megnyitásához és bezárásához.

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

Feljegyzés

A deklarálható entitások száma nincs korlátozva, de azok lazán megegyeznek. Ha olyan kifejezést ad hozzá, mint a "{action} ajtó", akkor az minden alkalommal megegyezik, amikor az "ajtó" szó előtt szöveg jelenik meg. A szándékok kiértékelése az entitások száma alapján történik. Ha két minta egyezne, a rendszer a definiáltabb entitásokkal rendelkezőt adja vissza.

Szándék felismerése

IntentRecognizer Az objektumból fogja meghívni a metódustRecognizeOnceAsync(). Ez a módszer arra kéri a Speech szolgáltatást, hogy egyetlen kifejezésben felismerje a beszédet, és a kifejezés azonosítása után hagyja abba a beszéd felismerését. Az egyszerűség kedvéért megvárjuk a jövőt, amíg befejeződik.

Szúrja be ezt a kódot a szándékok alá:

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

A felismerési eredmények (vagy hibák) megjelenítése

Amikor a Speech szolgáltatás visszaadja a felismerési eredményt, kinyomtatjuk az eredményt.

Szúrja be a következő auto result = intentRecognizer->RecognizeOnceAsync().get();kódot:

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

A kód ellenőrzése

Ezen a ponton a kódnak a következőképpen kell kinéznie:

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

Az alkalmazás létrehozása és futtatása

Most már készen áll az alkalmazás összeállítására és a beszédfelismerés tesztelésére a Speech szolgáltatással.

  1. A kód fordítása – A Visual Studio menüsávjában válassza a Build Megoldás létrehozása>lehetőséget.
  2. Az alkalmazás indítása – A menüsávon válassza a Hibakeresés indítása hibakeresése> lehetőséget, vagy nyomja le az F5 billentyűt.
  3. Felismerés indítása – Ez arra fogja kérni, hogy mondjon valamit. Az alapértelmezett nyelv az angol. A rendszer elküldi a beszédet a Speech szolgáltatásnak, átíratja szövegként, és a konzolon jeleníti meg.

Ha például azt mondja, hogy "Vigyen a 7. emeletre", akkor a kimenetnek a következőnek kell lennie:

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

Referenciadokumentáció | – További minták a GitHubon

Ebben a rövid útmutatóban telepíti a Java Speech SDK-t .

Platformkövetelmények

Válassza ki a célkörnyezetet:

A Java Speech SDK kompatibilis a Windows, a Linux és a macOS rendszerrel.

Windows rendszeren a 64 bites célarchitektúrát kell használnia. Windows 10 vagy újabb rendszerre van szükség.

Telepítse a Visual Studio 2015, 2017, 2019 és 2022 Microsoft Visual C++ terjeszthető verzióját a platformhoz. A csomag első telepítése újraindítást igényelhet.

A Java Speech SDK nem támogatja az ARM64-alapú Windowst.

Telepítsen egy Java-fejlesztőkészletet, például az Azul Zulu OpenJDK-t. Az OpenJDK Microsoft buildjének vagy az előnyben részesített JDK-nak is működnie kell.

A Java Speech SDK telepítése

Egyes utasítások egy adott SDK-verziót használnak, például 1.24.2. A legújabb verzió ellenőrzéséhez keresse meg a GitHub-adattárat.

Válassza ki a célkörnyezetet:

Ez az útmutató bemutatja, hogyan telepítheti a Java Speech SDK-t a Java-futtatókörnyezetre.

Támogatott operációs rendszerek

A Java-hoz készült Speech SDK csomag az alábbi operációs rendszerekhez érhető el:

A Java Speech SDK Apache Maven használatával történő telepítéséhez kövesse az alábbi lépéseket:

  1. Telepítse az Apache Maven-t.

  2. Nyisson meg egy parancssort, ahol az új projektet szeretné, és hozzon létre egy új pom.xml fájlt.

  3. Másolja a következő XML-tartalmat a 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. Futtassa a következő Maven-parancsot a Speech SDK és a függőségek telepítéséhez.

    mvn clean dependency:copy-dependencies
    

Kezdje néhány sablonkóddal

  1. Nyissa meg Main.java a src dir.

  2. Cserélje le a fájl tartalmát a következőre:

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

Beszédkonfiguráció létrehozása

Mielőtt inicializálhat egy IntentRecognizer objektumot, létre kell hoznia egy konfigurációt, amely az Azure AI-szolgáltatások előrejelzési erőforrásának kulcsát és helyét használja.

  • Cserélje le "YOUR_SUBSCRIPTION_KEY" az Azure AI-szolgáltatások előrejelzési kulcsára.
  • Cserélje le "YOUR_SUBSCRIPTION_REGION" az Azure AI-szolgáltatások erőforrásrégióját.

Ez a minta a metódust használja a FromSubscription()SpeechConfig. Az elérhető módszerek teljes listáját a SpeechConfig osztályban találja.

IntentRecognizer inicializálása

Most hozzon létre egy IntentRecognizer. Szúrja be ezt a kódot közvetlenül a Speech-konfiguráció alá.

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

Szándékok hozzáadása

Néhány mintát társítania kell a IntentRecognizer hívással addIntent(). 2 szándékot adunk hozzá ugyanazzal az azonosítóval a padlócseréhez, egy másik szándékot pedig külön azonosítóval az ajtók megnyitásához és bezárásához. Szúrja be ezt a kódot a blokkba try :

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

Feljegyzés

A deklarálható entitások száma nincs korlátozva, de azok lazán megegyeznek. Ha olyan kifejezést ad hozzá, mint a "{action} ajtó", akkor az minden alkalommal megegyezik, amikor az "ajtó" szó előtt szöveg jelenik meg. A szándékok kiértékelése az entitások száma alapján történik. Ha két minta egyezne, a rendszer a definiáltabb entitásokkal rendelkezőt adja vissza.

Szándék felismerése

IntentRecognizer Az objektumból fogja meghívni a metódustrecognizeOnceAsync(). Ez a módszer arra kéri a Speech szolgáltatást, hogy egyetlen kifejezésben felismerje a beszédet, és a kifejezés azonosítása után hagyja abba a beszéd felismerését. Az egyszerűség kedvéért megvárjuk a jövőt, amíg befejeződik.

Szúrja be ezt a kódot a szándékok alá:

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

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

A felismerési eredmények (vagy hibák) megjelenítése

Amikor a Speech szolgáltatás visszaadja a felismerési eredményt, kinyomtatjuk az eredményt.

Szúrja be a következő IntentRecognitionResult result = recognizer.recognizeOnceAsync().get();kódot:

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

A kód ellenőrzése

Ezen a ponton a kódnak a következőképpen kell kinéznie:

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

Az alkalmazás létrehozása és futtatása

Most már készen áll az alkalmazás létrehozására, és tesztelheti a szándékfelismerést a beszédszolgáltatás és a beágyazott mintaegyező használatával.

Válassza ki a Futtatás gombot az Eclipse-ben, vagy nyomja le a ctrl+F11 billentyűkombinációt, majd figyelje a "Mondj valamit..." Gyors. Amint megjelenik, mondja el a kimondott szöveget, és figyelje a kimenetet.

Ha például azt mondja, hogy "Vigyen a 7. emeletre", akkor a kimenetnek a következőnek kell lennie:

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

Következő lépések

Egyéni entitások használatával javíthatja a mintaegyezést.