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:
- Azure AI-szolgáltatási erőforrás vagy Unified Speech-erőforrás
- Visual Studio 2019 (bármely kiadás).
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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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:
- Windows: csak 64 bites.
- Mac: macOS X 10.14-es vagy újabb verzió.
- Linux: Tekintse meg a támogatott Linux-disztribúciókat és célarchitektúrákat.
A Java Speech SDK Apache Maven használatával történő telepítéséhez kövesse az alábbi lépéseket:
Telepítse az Apache Maven-t.
Nyisson meg egy parancssort, ahol az új projektet szeretné, és hozzon létre egy új pom.xml fájlt.
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>
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
Nyissa meg
Main.java
a src dir.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.