Share via


Szándékok felismerése egyéni entitásminta-egyezteté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-val fejleszthet egy konzolalkalmazást, amely az eszköz mikrofonján keresztül beszélt beszédszövegekből származó szándékokat származtat. 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
  • Egyéni entitások hozzáadása a Speech SDK API-val
  • 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:

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 a kulcsot és az Azure-régiót használja az Azure AI-szolgáltatások előrejelzési erőforrásához.

  • 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 recognizer = new IntentRecognizer(config))
{
    
}

Szándékok hozzáadása

Társítania kell néhány mintát egyhez PatternMatchingModel , és alkalmaznia kell azt a IntentRecognizer. Először hozzunk létre és PatternMatchingModel adjunk hozzá néhány szándékot.

Feljegyzés

Több mintát is hozzáadhatunk egy PatternMatchingIntent.

Szúrja be ezt a kódot a blokkba using :

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

Egyéni entitások hozzáadása

A mintaegyező teljes kihasználásához testre szabhatja az entitásokat. A "floorName" nevet a rendelkezésre álló padlók listájává tesszük. A "parkingLevel" egész szám entitássá is válik.

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

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

Modell alkalmazása a Recognizerre

Most már alkalmazni kell a modellt a IntentRecognizer. Egyszerre több modellt is használhat, így az API modellek gyűjteményét veszi igénybe.

Szúrja be ezt a kódot az entitások alá:

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

recognizer.ApplyLanguageModels(modelCollection);

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.

A nyelvi modellek alkalmazása után szúrja be ezt a kódot:

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

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

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

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

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 2. emeletre", akkor a kimenetnek a következőnek kell lennie:

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

Egy másik példa, ha azt mondja, hogy "Vigyen a 7. emeletre", ennek a kimenetnek kell lennie:

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

A rendszer nem ismerte fel a szándékot, mert a 7 nem szerepel a floorName érvényes értékeinek listájában.

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 a kulcsot és az Azure-régiót használja az Azure AI-szolgáltatások előrejelzési erőforrásához.

  • 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

Társítania kell néhány mintát egyhez PatternMatchingModel , és alkalmaznia kell azt a IntentRecognizer. Először hozzunk létre és PatternMatchingModel adjunk hozzá néhány szándékot. A PatternMatchingIntent egy struktúra, ezért csak a soron belüli szintaxist fogjuk használni.

Feljegyzés

Több mintát is hozzáadhatunk egy PatternMatchingIntent.

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

Egyéni entitások hozzáadása

A mintaegyező teljes kihasználásához testre szabhatja az entitásokat. A "floorName" nevet a rendelkezésre álló padlók listájává tesszük.

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

Modell alkalmazása a Recognizerre

Most már alkalmazni kell a modellt a IntentRecognizer. Egyszerre több modellt is használhat, így az API modellek gyűjteményét veszi igénybe.

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

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

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

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

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 2. emeletre", akkor a kimenetnek a következőnek kell lennie:

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

Egy másik példa, ha azt mondja, hogy "Vigyen a 7. emeletre", ennek a kimenetnek kell lennie:

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

A szándékazonosító üres, mert a 7 nem szerepel a listán.

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:

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

Beszédkonfiguráció létrehozása

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

  • 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á. Ezt megpróbáljuk megtenni, hogy kihasználhassuk az automatikusan eltömhető felületet.

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

}

Szándékok hozzáadása

Társítania kell néhány mintát egyhez PatternMatchingModel , és alkalmaznia kell azt a IntentRecognizer. Először hozzunk létre és PatternMatchingModel adjunk hozzá néhány szándékot.

Feljegyzés

Több mintát is hozzáadhatunk egy PatternMatchingIntent.

Szúrja be ezt a kódot a blokkba try :

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

Egyéni entitások hozzáadása

A mintaegyező teljes kihasználásához testre szabhatja az entitásokat. A "floorName" nevet a rendelkezésre álló padlók listájává tesszük. A "parkingLevel" egész szám entitássá is válik.

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

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

Modell alkalmazása a Recognizerre

Most már alkalmazni kell a modellt a IntentRecognizer. Egyszerre több modellt is használhat, így az API modellek gyűjteményét veszi igénybe.

Szúrja be ezt a kódot az entitások alá:

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

recognizer.applyLanguageModels(modelCollection);

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.

A nyelvi modellek alkalmazása után szúrja be ezt a kódot:

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

IntentRecognitionResult result = recognizer.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();

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

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

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 2. emeletre", akkor a kimenetnek a következőnek kell lennie:

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

Egy másik példa, ha azt mondja, hogy "Vigyen a 7. emeletre", ennek a kimenetnek kell lennie:

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

A rendszer nem ismerte fel a szándékot, mert a 7 nem szerepel a floorName érvényes értékeinek listájában.