Szándékok felismerése beszédből a Speech SDK for C használatával#
Az Azure AI services Speech SDK integrálható a Language Understanding szolgáltatással (LUIS), hogy szándékfelismerést biztosítson. A szándék az, amit a felhasználó tenni szeretne: például repülőutat foglalni, megnézni az időjárást vagy telefonhívást indítani. A felhasználó bármilyen kifejezést használhat, amely számára természetes. A LUIS leképozza a felhasználói kéréseket az Ön által meghatározott szándékokra.
Feljegyzés
A LUIS alkalmazás meghatározza a felismerni kívánt szándékokat és entitásokat. Az alkalmazás elkülönül a Speech Service szolgáltatást használó C#-alkalmazástól. Ebben a cikkben az „app” program kifejezés a LUIS-alkalmazásra, az „alkalmazás” kifejezés pedig a C#-kódra utal.
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
- A LUIS-app modelljének lekérése és a kívánt szándékok hozzáadása
- A beszédfelismerés nyelvének megadása
- Beszédfelismerés végrehajtása fájlból
- Aszinkron, eseményvezérelt folyamatos felismerés használata
Előfeltételek
Az útmutató megkezdése előtt győződjön meg arról, hogy a következő elemekkel rendelkezik:
- Egy LUIS-fiók. Létrehozhat egy ingyenes fiókot a LUIS portal segítségével.
- Visual Studio 2019 (bármely kiadás).
A LUIS és a beszéd
A LUIS integrálható a Speech Service szolgáltatással a beszédből való szándékfelismerés céljából. Ehhez nincs szükség Speech Service-előfizetésre, csak a LUIS-ra.
A LUIS kétféle kulcsot kezel:
Kulcs típusa | Cél |
---|---|
Tartalomkészítés | Lehetővé teszi a LUIS-alkalmazások programozott létrehozását és módosítását |
előrejelzés | A LUIS-alkalmazás futásidejű elérésére szolgál |
Ehhez az útmutatóhoz szüksége van az előrejelzési kulcs típusára. Ez az útmutató a Home Automation LUIS-alkalmazást használja, amelyet az előre összeállított Otthoni automatizálás alkalmazás rövid útmutatójának követésével hozhat létre. Ha saját LUIS-alkalmazást hozott létre, használhatja helyette.
LUIS-alkalmazás létrehozásakor a LUIS automatikusan létrehoz egy szerzői kulcsot, hogy szöveges lekérdezésekkel tesztelhesse az alkalmazást. Ez a kulcs nem teszi lehetővé a Speech szolgáltatás integrációját, és nem működik ezzel az útmutatóval. Hozzon létre egy LUIS-erőforrást az Azure-irányítópulton, és rendelje hozzá a LUIS-alkalmazáshoz. Ehhez az útmutatóhoz használhatja az ingyenes előfizetési szintet.
Miután létrehozta a LUIS-erőforrást az Azure-irányítópulton, jelentkezzen be a LUIS-portálra, válassza ki az alkalmazást a Saját alkalmazások lapon, majd váltson az alkalmazás Kezelés lapjára. Végül válassza ki az Azure-erőforrásokat az oldalsávon.
Az Azure-erőforrások lapon:
A kulcs melletti ikonra kattintva másolja a vágólapra. (Bármelyik kulcsot használhatja.)
A projekt létrehozása és a számítási feladat hozzáadása
Visual Studio-projekt Windows-fejlesztéshez való létrehozásához létre kell hoznia a projektet, be kell állítania a Visual Studio for .NET asztali fejlesztést, telepítenie kell a Speech SDK-t, és ki kell választania a célarchitektúrát.
A kezdéshez hozza létre a projektet a Visual Studióban, és győződjön meg arról, hogy a Visual Studio be van állítva az asztali .NET-fejlesztéshez:
Nyissa meg a Visual Studio 2019-et.
A Start ablakban válassza az Új projekt létrehozása lehetőséget.
Az Új projekt létrehozása ablakban válassza a Konzolalkalmazás (.NET-keretrendszer) lehetőséget, majd válassza a Tovább gombot.
Az új projekt konfigurálása ablakban írja be a Helloworld nevet a Projekt nevére, válassza ki vagy hozza létre a könyvtár elérési útját a Hely mezőben, majd válassza a Létrehozás lehetőséget.
A Visual Studio menüsávon válassza az Eszközök lekérése>eszközök és szolgáltatások lehetőséget, amely megnyitja a Visual Studio Installert, és megjeleníti a Módosítás párbeszédpanelt.
Ellenőrizze, hogy elérhető-e a .NET asztali fejlesztési számítási feladat. Ha a számítási feladat nincs telepítve, jelölje be a mellette lévő jelölőnégyzetet, majd válassza a Módosítás lehetőséget a telepítés elindításához. A letöltés és a telepítés eltarthat néhány percig.
Ha az asztali .NET-fejlesztés melletti jelölőnégyzet már be van jelölve, a Bezárás gombra kattintva lépjen ki a párbeszédpanelről.
Zárja be a Visual Studio Installert.
A Speech SDK telepítése
A következő lépés a Speech SDK NuGet-csomag telepítése, hogy hivatkozni tudja rá a kódban.
A Megoldáskezelő kattintson a jobb gombbal a helloworld projektre, majd válassza a NuGet-csomagok kezelése lehetőséget a NuGet-Csomagkezelő megjelenítéséhez.
A jobb felső sarokban keresse meg a Csomagforrás legördülő menüt, és győződjön meg arról, hogy a nuget.org ki van jelölve.
A bal felső sarokban válassza a Tallózás lehetőséget.
A keresőmezőbe írja be a Microsoft.CognitiveServices.Speech kifejezést, és válassza az Enter billentyűt.
A keresési eredmények között válassza a Microsoft.CognitiveServices.Speech csomagot, majd a Telepítés lehetőséget a legújabb stabil verzió telepítéséhez.
A telepítés megkezdéséhez fogadja el az összes szerződést és licencet.
A csomag telepítése után megjelenik egy megerősítés a Csomagkezelő konzolablakban.
A célarchitektúra kiválasztása
A konzolalkalmazás létrehozásához és futtatásához hozzon létre egy, a számítógép architektúrájának megfelelő platformkonfigurációt.
A menüsávon válassza a Build Configuration Manager lehetőséget>. Megnyílik a Configuration Manager párbeszédpanel.
Az Aktív megoldásplatform legördülő listában válassza az Új lehetőséget. Megjelenik az Új megoldásplatform párbeszédpanel.
A Típus vagy az új platform legördülő listában válassza a következőt:
- Ha 64 bites Windowst futtat, válassza az x64 lehetőséget.
- Ha 32 bites Windowst futtat, válassza az x86 lehetőséget.
Kattintson az OK gombra , majd a Bezárás gombra.
A kód hozzáadása
Ezután kódot ad hozzá a projekthez.
A Megoldáskezelő nyissa meg a fájlt Program.cs.
Cserélje le a fájl elején lévő utasításblokkot
using
a következő deklarációkra:using System; using System.Threading.Tasks; using Microsoft.CognitiveServices.Speech; using Microsoft.CognitiveServices.Speech.Audio; using Microsoft.CognitiveServices.Speech.Intent;
Cserélje le a megadott
Main()
metódust a következő aszinkron megfelelőre:public static async Task Main() { await RecognizeIntentAsync(); Console.WriteLine("Please press Enter to continue."); Console.ReadLine(); }
Hozzon létre egy üres aszinkron metódust
RecognizeIntentAsync()
az itt látható módon:static async Task RecognizeIntentAsync() { }
Az új metódus törzsében adja hozzá a következő kódot:
// Creates an instance of a speech config with specified subscription key // and service region. Note that in contrast to other services supported by // the Cognitive Services Speech SDK, the Language Understanding service // requires a specific subscription key from https://www.luis.ai/. // The Language Understanding service calls the required key 'endpoint key'. // Once you've obtained it, replace with below with your own Language Understanding subscription key // and service region (e.g., "westus"). // The default language is "en-us". var config = SpeechConfig.FromSubscription("YourLanguageUnderstandingSubscriptionKey", "YourLanguageUnderstandingServiceRegion"); // Creates an intent recognizer using microphone as audio input. using (var recognizer = new IntentRecognizer(config)) { // Creates a Language Understanding model using the app id, and adds specific intents from your model var model = LanguageUnderstandingModel.FromAppId("YourLanguageUnderstandingAppId"); recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName1", "id1"); recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName2", "id2"); recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here"); // Starts recognizing. Console.WriteLine("Say something..."); // Starts intent recognition, and returns after a single utterance is recognized. The end of a // single utterance is determined by listening for silence at the end or until a maximum of 15 // seconds of audio is processed. The task returns the recognition text as result. // Note: Since RecognizeOnceAsync() returns only a single utterance, it is suitable only for single // shot recognition like command or query. // For long-running multi-utterance recognition, use StartContinuousRecognitionAsync() instead. var result = await recognizer.RecognizeOnceAsync().ConfigureAwait(false); // Checks result. if (result.Reason == ResultReason.RecognizedIntent) { Console.WriteLine($"RECOGNIZED: Text={result.Text}"); Console.WriteLine($" Intent Id: {result.IntentId}."); Console.WriteLine($" Language Understanding JSON: {result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)}."); } 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 update the subscription info?"); } } }
Cserélje le a metódus helyőrzőit a LUIS-erőforráskulcsra, a régióra és az alkalmazásazonosítóra az alábbiak szerint.
Helyőrző Csere erre YourLanguageUnderstandingSubscriptionKey
A LUIS-erőforráskulcs. Ezt az elemet ismét le kell szereznie az Azure-irányítópultról. Ezt az alkalmazás Azure-erőforrások lapján ( a Kezelés alatt) találja a LUIS-portálon. YourLanguageUnderstandingServiceRegion
Annak a régiónak a rövid azonosítója, amelyben a LUIS-erőforrás található, például westus
az USA nyugati régiója esetében. Lásd: Régiók.YourLanguageUnderstandingAppId
A LUIS-app azonosítója. Ezt az alkalmazás Gépház lapján, a LUIS portálon találja.
Ezekkel a módosításokkal létrehozhatja (Control+Shift+B) és futtathatja az alkalmazást (F5). Amikor a rendszer kéri, próbálkozzon azzal, hogy "Kapcsolja ki a lámpákat" szöveget a számítógép mikrofonjába. Az alkalmazás megjeleníti az eredményt a konzolablakban.
A kód ismertetése a következő szakaszokban szerepel.
Szándékfelismerő létrehozása
Először létre kell hoznia egy beszédkonfigurációt a LUIS előrejelzési kulcsából és régiójából. Beszédkonfigurációkkal felismerőket hozhat létre a Speech SDK különböző képességeihez. A beszédkonfiguráció többféleképpen is megadhatja a használni kívánt erőforrást; itt az erőforráskulcsot és a régiót használjuk FromSubscription
.
Feljegyzés
A LUIS-erőforrás kulcsát és régióját használja, ne speech típusú erőforrást.
A következő lépés egy szándékfelismerő létrehozása a new IntentRecognizer(config)
metódus használatával. Mivel a konfiguráció már tudja, hogy melyik erőforrást használja, a felismerő létrehozásakor nem kell újból megadnia a kulcsot.
LUIS-modell importálása és szándékok hozzáadása
Most importálja a modellt a LUIS-appból a LanguageUnderstandingModel.FromAppId()
használatával, majd adja hozzá azokat a LUIS-szándékokat, amelyeket a felismerő AddIntent()
metódusával fel szeretne ismerni. Ezzel a két lépéssel növelheti a beszédfelismerés pontosságát, ha megadja azokat a szavakat, amelyeket a felhasználó a kérésekben nagy valószínűséggel használni fog. Nem kell hozzáadnia az alkalmazás összes szándékát, ha nem kell mindet felismernie az alkalmazásban.
Szándékok hozzáadásához három argumentumot kell megadnia: a LUIS-modellt (neve), model
a szándék nevét és egy szándékazonosítót. Az azonosító és a név közötti különbség a következő.
AddIntent() argumentum |
Cél |
---|---|
intentName |
A szándék LUIS-appban meghatározott neve. Ennek az értéknek pontosan meg kell egyeznie a LUIS-szándék nevével. |
intentID |
A Speech SDK által felismert szándékhoz rendelt azonosító. Ez az érték bármi lehet, amit csak szeretne; nem kell megegyeznie a LUIS-alkalmazásban definiált szándéknévvel. Ha például ugyanaz a kód több szándékot is kezel, használhatja hozzájuk ugyanazt az azonosítót. |
A Home Automation LUIS alkalmazás két szándékkal rendelkezik: az egyik egy eszköz bekapcsolására, a másik pedig az eszköz kikapcsolására. A felismerő az alábbi sorokkal adható hozzá a felismerőhöz. Cserélje le a RecognizeIntentAsync()
metódus három AddIntent
sorát erre a kódra.
recognizer.AddIntent(model, "HomeAutomation.TurnOff", "off");
recognizer.AddIntent(model, "HomeAutomation.TurnOn", "on");
Egyéni szándékok hozzáadása helyett a AddAllIntents
metódussal a modell összes szándékát hozzáadhatja a felismerőhöz.
Felismerés indítása
A felismerő létrehozása és a szándékok hozzáadása után elkezdődhet a felismerés. A Speech SDK az egyszeri és folyamatos felismerést is támogatja.
Felismerési mód | Meghívandó metódusok | Eredmény |
---|---|---|
Egyszeri | RecognizeOnceAsync() |
Egyszer kimondott szöveg alapján visszaadja a felismert szándékot (ha van). |
Folyamatos | StartContinuousRecognitionAsync() StopContinuousRecognitionAsync() |
Több kimondott szöveg felismerése; Eseményeket bocsát ki (például IntermediateResultReceived ) az eredmények rendelkezésre állása esetén. |
Az alkalmazás egyetlen lövéses módot használ, így a hívások RecognizeOnceAsync()
elkezdik a felismerést. Az eredmény egy IntentRecognitionResult
objektum, amely a felismert szándékra vonatkozó információkat tartalmaz. A LUIS JSON-választ a következő kifejezéssel nyeri ki:
result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)
Az alkalmazás nem elemzi a JSON-eredményt. Csak a JSON-szöveget jeleníti meg a konzolablakban.
Adja meg a felismerés nyelvét
A LUIS alapértelmezés szerint amerikai angol (en-us
) nyelven végzi a szándékfelismerést. A területibeállítás-kódnak a beszédkonfiguráció SpeechRecognitionLanguage
tulajdonságához való hozzárendelésével más nyelveken is végezhet szándékfelismerést. Például a felismerő létrehozása előtt adja hozzá config.SpeechRecognitionLanguage = "de-de";
az alkalmazáshoz a szándékok német nyelvű felismeréséhez. További információ: LUIS nyelvi támogatás.
Folyamatos felismerés fájlból
Az alábbi kód két további szándékfelismerési képességet mutat be a Speech SDK használatával. Az első a korábban említett folyamatos felismerés, amelynek esetén a felismerő eseményeket bocsát ki, ha eredmények érhetők el. Ezeket az eseményeket az Ön által megadott eseménykezelők dolgozzák fel. A folyamatos felismeréssel a felismerő metódusát StartContinuousRecognitionAsync()
hívhatja meg a felismerés elindításához ahelyett RecognizeOnceAsync()
, hogy .
A másik képesség a feldolgozandó beszédet tartalmazó hangfelvétel leolvasása egy WAV-fájlból. A megvalósítás során létre kell hozni egy hangkonfigurációt, amely a szándék felismerőjének létrehozásakor használható. A fájlnak egycsatornásnak (mono) kell lennie, 16 kHz-es mintavételi aránnyal.
A funkciók kipróbálásához törölje vagy megjegyzéssel jelölje ki a RecognizeIntentAsync()
metódus törzsét, és adja hozzá a következő kódot a helyére.
// Creates an instance of a speech config with specified subscription key
// and service region. Note that in contrast to other services supported by
// the Cognitive Services Speech SDK, the Language Understanding service
// requires a specific subscription key from https://www.luis.ai/.
// The Language Understanding service calls the required key 'endpoint key'.
// Once you've obtained it, replace with below with your own Language Understanding subscription key
// and service region (e.g., "westus").
var config = SpeechConfig.FromSubscription("YourLanguageUnderstandingSubscriptionKey", "YourLanguageUnderstandingServiceRegion");
// Creates an intent recognizer using file as audio input.
// Replace with your own audio file name.
using (var audioInput = AudioConfig.FromWavFileInput("YourAudioFile.wav"))
{
using (var recognizer = new IntentRecognizer(config, audioInput))
{
// The TaskCompletionSource to stop recognition.
var stopRecognition = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
// Creates a Language Understanding model using the app id, and adds specific intents from your model
var model = LanguageUnderstandingModel.FromAppId("YourLanguageUnderstandingAppId");
recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName1", "id1");
recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName2", "id2");
recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here");
// Subscribes to events.
recognizer.Recognizing += (s, e) =>
{
Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
};
recognizer.Recognized += (s, e) =>
{
if (e.Result.Reason == ResultReason.RecognizedIntent)
{
Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
Console.WriteLine($" Intent Id: {e.Result.IntentId}.");
Console.WriteLine($" Language Understanding JSON: {e.Result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)}.");
}
else if (e.Result.Reason == ResultReason.RecognizedSpeech)
{
Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
Console.WriteLine($" Intent not recognized.");
}
else if (e.Result.Reason == ResultReason.NoMatch)
{
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
}
};
recognizer.Canceled += (s, e) =>
{
Console.WriteLine($"CANCELED: Reason={e.Reason}");
if (e.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
Console.WriteLine($"CANCELED: Did you update the subscription info?");
}
stopRecognition.TrySetResult(0);
};
recognizer.SessionStarted += (s, e) =>
{
Console.WriteLine("\n Session started event.");
};
recognizer.SessionStopped += (s, e) =>
{
Console.WriteLine("\n Session stopped event.");
Console.WriteLine("\nStop recognition.");
stopRecognition.TrySetResult(0);
};
// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);
// Waits for completion.
// Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopRecognition.Task });
// Stops recognition.
await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
}
}
Módosítsa a kódot úgy, hogy tartalmazza a LUIS-előrejelzési kulcsot, a régiót és az alkalmazásazonosítót, és adja hozzá a Home Automation-szándékokat a korábbiakhoz hasonlóan. Váltson whatstheweatherlike.wav
a rögzített hangfájl nevére. Ezután készítse el, másolja a hangfájlt a buildkönyvtárba, és futtassa az alkalmazást.
Ha például azt mondja, hogy "Kapcsolja ki a fényeket", szüneteltetje, majd mondja ki a "Fények bekapcsolása" szöveget a rögzített hangfájlban, a következőhöz hasonló konzolkimenet jelenhet meg:
A Speech SDK csapata aktívan tart fenn számos példát egy nyílt forráskódú adattárban. A minta forráskódtárhoz tekintse meg az Azure AI Speech SDK-t a GitHubon. C#, C++, Java, Python, Objective-C, Swift, JavaScript, UWP, Unity és Xamarin minták találhatók. Keresse meg a cikk kódját a minták/csharp/sharedcontent/console mappában.