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:
- Azure AI-szolgáltatási erőforrás vagy Unified Speech-erőforrás
- Visual Studio 2019 (bármely kiadás).
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.
- 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 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.
- 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 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:
- 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:
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.