Share via


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:

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.

Shows a screenshot of the LUIS portal keys and endpoint settings.

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:

  1. Nyissa meg a Visual Studio 2019-et.

  2. A Start ablakban válassza az Új projekt létrehozása lehetőséget.

  3. Az Új projekt létrehozása ablakban válassza a Konzolalkalmazás (.NET-keretrendszer) lehetőséget, majd válassza a Tovább gombot.

  4. 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.

  5. 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.

  6. 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.

    Enable .NET desktop development

  7. 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.

  1. 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.

    NuGet Package Manager

  2. 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.

  3. A bal felső sarokban válassza a Tallózás lehetőséget.

  4. A keresőmezőbe írja be a Microsoft.CognitiveServices.Speech kifejezést, és válassza az Enter billentyűt.

  5. 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.

    Install Microsoft.CognitiveServices.Speech NuGet package

  6. 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.

  1. A menüsávon válassza a Build Configuration Manager lehetőséget>. Megnyílik a Configuration Manager párbeszédpanel.

    Configuration Manager dialog box

  2. 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.

  3. 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.
  4. Kattintson az OK gombra , majd a Bezárás gombra.

A kód hozzáadása

Ezután kódot ad hozzá a projekthez.

  1. A Megoldáskezelő nyissa meg a fájlt Program.cs.

  2. 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;
    
  3. 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();
    }
    
  4. Hozzon létre egy üres aszinkron metódust RecognizeIntentAsync()az itt látható módon:

    static async Task RecognizeIntentAsync()
    {
    }
    
  5. 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?");
            }
        }
    }
    
  6. 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), modela 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.

Single LUIS recognition results

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:

Audio file LUIS recognition results

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.

Következő lépések

Rövid útmutató: Beszéd felismerése mikrofonból