Identifiera avsikter från tal med hjälp av Speech SDK för C

Den Cognitive Services Speech SDK integreras med Language Understanding (LUIS) för att tillhandahålla avsiktsigenkänning. En avsikt är något som användaren vill göra: boka en flygning, titta på vädret eller ringa ett samtal. Användaren kan använda de termer som känns naturliga. Med hjälp av maskininlärning mappar LUIS användarbegäranden till de avsikter som du har definierat.

Anteckning

Ett LUIS-programmet definierar avsikter och entiteter som du vill identifiera. Det är separat från det C#-program som använder Speech-tjänsten. I den här artikeln betyder ”app” LUIS-appen medan ”program” innebär C#-koden.

I den här guiden använder du Speech SDK för att utveckla ett C#-konsolprogram som härleder avsikter från användaryttranden via enhetens mikrofon. Du lär dig följande:

  • Skapa ett Visual Studio-projekt som refererar till Speech SDK NuGet-paketet
  • Skapa en talkonfiguration och få en avsiktsigenkänning
  • Hämta modellen för LUIS-appen och lägga till de avsikter som du behöver
  • Ange språk för taligenkänning
  • Identifiera tal från en fil
  • Använd asynkron, händelsedriven kontinuerlig igenkänning

Förutsättningar

Se till att du har följande innan du påbörjar den här guiden:

LUIS och tal

LUIS integreras med Speech-tjänsten för att identifiera avsikter från tal. Du behöver inte en Speech-tjänstprenumeration, bara LUIS.

LUIS använder tre typer av nycklar:

Nyckeltyp Syfte
Redigering Gör att du kan skapa och ändra LUIS-appar programmatiskt
Starter Gör att du kan testa LUIS-programmet endast med hjälp av text
Slutpunkt Auktoriserar åtkomst till en viss LUIS-app

För den här guiden behöver du nyckeltypen slutpunkt. I den här guiden används LUIS-exempelappen Home Automation, som du kan skapa genom att följa snabbstarten Använd färdig hemautomatiseringsapp. Om du har skapat en EGEN LUIS-app kan du använda den i stället.

När du skapar en LUIS-app genererar LUIS automatiskt en startnyckel så att du kan testa appen med hjälp av textfrågor. Den här nyckeln aktiverar inte speech-tjänstintegreringen och fungerar inte med den här guiden. Skapa en LUIS-resurs på Azure-instrumentpanelen och tilldela den till LUIS-appen. Du kan använda den kostnadsfria prenumerationsnivån för den här guiden.

När du har skapat LUIS-resursen på Azure-instrumentpanelen loggar du in på LUIS-portalen, väljer ditt program på Mina appar-sidan och växlar sedan till appens hantera-sida. Välj slutligen Nycklar och slutpunkter i sidopanelen.

LUIS-portalens inställningar för nycklar och slutpunkter

På sidan Nycklar och slutpunktsinställningar:

  1. Rulla ned till avsnittet Resurser och nycklar och välj Tilldela resurs.

  2. Gör följande ändringar i dialogrutan Tilldela en nyckel till din app:

    • Under Klientorganisation väljer du Microsoft.
    • Under Prenumerationsnamn väljer du den Azure-prenumeration som innehåller den LUIS-resurs som du vill använda.
    • Under Nyckel väljer du den LUIS-resurs som du vill använda med appen.

    Om en stund visas den nya prenumerationen i tabellen längst ned på sidan.

  3. Välj ikonen bredvid en nyckel för att kopiera den till Urklipp. (Du kan använda valfri nyckel.)

Prenumerationsnycklar för LUIS-app

Skapa ett talprojekt i Visual Studio

Om du vill skapa ett Visual Studio-projekt för Windows-utveckling måste du skapa projektet, konfigurera Visual Studio för .NET Desktop Development, installera Speech SDK och välja mål arkitektur.

Skapa projektet och Lägg till arbets belastningen

Starta genom att skapa projektet i Visual Studio och se till att Visual Studio har kon figurer ATS för .NET Desktop-utveckling:

  1. Öppna Visual Studio 2019.

  2. I fönstret Starta väljer du skapa ett nytt projekt.

  3. Välj konsol program (.NET Framework) i fönstret skapa ett nytt projekt och välj sedan Nästa.

  4. I fönstret Konfigurera ditt nya projekt anger du HelloWorld i projekt namn, väljer eller skapar sökvägen till katalogen på platsen och väljer sedan skapa.

  5. I meny raden i Visual Studio väljer du verktyg > Hämta verktyg och funktioner, som öppnar Visual Studio Installer och visar dialog rutan ändra .

  6. Kontrol lera om arbets belastningen .net Desktop Development är tillgänglig. Om arbets belastningen inte har installerats markerar du kryss rutan bredvid den och väljer sedan ändra för att starta installationen. Det kan ta några minuter att ladda ned och installera.

    Om kryss rutan bredvid .net Desktop Development redan är markerad väljer du Stäng för att stänga dialog rutan.

    Aktivera .NET-skrivbordsutveckling

  7. Stäng Visual Studio Installer.

Installera Speech SDK

Nästa steg är att installera NuGet- paketet för tal-SDKså att du kan referera till det i koden.

  1. I Solution Explorer högerklickar du på projektet HelloWorld och väljer sedan Hantera NuGet-paket för att Visa NuGet Package Manager.

    NuGet-pakethanteraren

  2. Leta upp List rutan paket källa i det övre högra hörnet och kontrol lera att NuGet.org är markerat.

  3. I det övre vänstra hörnet väljer du Bläddra.

  4. Skriv Microsoft. CognitiveServices. Speech i rutan Sök och välj RETUR.

  5. Från Sök resultaten väljer du paketet Microsoft. CognitiveServices. Speech och väljer sedan Installera för att installera den senaste stabila versionen.

    Installera Microsoft. CognitiveServices. Speech NuGet-paketet

  6. Acceptera alla avtal och licenser för att starta installationen.

    När paketet har installerats visas en bekräftelse i fönstret Package Manager-konsol .

Välj mål arkitektur

Skapa och kör konsol programmet nu genom att skapa en plattforms konfiguration som matchar datorns arkitektur.

  1. Välj build > Configuration Manager på Meny raden. Dialog rutan Configuration Manager visas.

    Configuration Manager dialog ruta

  2. I list rutan aktiv lösnings plattform väljer du ny. Dialog rutan ny lösnings plattform visas.

  3. I list rutan Skriv eller Välj ny plattform :

    • Om du kör 64-bitars Windows väljer du x64.
    • Om du kör 32-bitars Windows väljer du x86.
  4. Välj OK och sedan Stäng.

Lägga till koden

Sedan lägger du till kod i projektet.

  1. Från Solution Explorer öppnar du filen Program.cs.

  2. Ersätt -blocket using med -instruktioner i början av filen med följande deklarationer:

    using System;
    using System.Threading.Tasks;
    using Microsoft.CognitiveServices.Speech;
    using Microsoft.CognitiveServices.Speech.Audio;
    using Microsoft.CognitiveServices.Speech.Intent;
    
  3. Ersätt den angivna Main() metoden med följande asynkrona motsvarighet:

    public static async Task Main()
    {
        await RecognizeIntentAsync();
        Console.WriteLine("Please press Enter to continue.");
        Console.ReadLine();
    }
    
  4. Skapa en tom asynkron metod RecognizeIntentAsync() , som du ser här:

    static async Task RecognizeIntentAsync()
    {
    }
    
  5. Lägg till den här koden i brödtexten i den här nya metoden:

    // 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. Ersätt platshållarna i den här metoden med din LUIS-prenumerationsnyckel, region och app-ID på följande sätt.

    Platshållare Ersätt med
    YourLanguageUnderstandingSubscriptionKey Din LUIS-slutpunktsnyckel. Återigen måste du hämta det här objektet från Azure-instrumentpanelen, inte en "startnyckel". Du hittar den på appens sida Nycklar och slutpunkter (under Hantera) i LUIS-portalen.
    YourLanguageUnderstandingServiceRegion Den korta identifieraren för den region som din LUIS-prenumeration är i, till exempel westus för USA, västra. Se regioner.
    YourLanguageUnderstandingAppId LUIS-app-ID. Du hittar den på appens Inställningar i LUIS-portalen.

När de här ändringarna har gjorts kan du skapa (Control+Shift+B) och köra (F5) programmet. När du uppmanas till det kan du försöka säga "Släck lamporna" i datorns mikrofon. Resultatet visas i konsolfönstret i programmet.

Följande avsnitt innehåller en beskrivning av koden.

Skapa en avsiktsigenkännare

Först måste du skapa en talkonfiguration från din LUIS-slutpunktsnyckel och region. Du kan använda talkonfigurationer för att skapa igenkänningsfunktioner för de olika funktionerna i Speech SDK. Talkonfigurationen har flera sätt att ange den prenumeration som du vill använda. Här använder vi FromSubscription , som tar prenumerationsnyckeln och regionen.

Anteckning

Använd nyckeln och regionen för din LUIS-prenumeration, inte en speech-tjänstprenumeration.

Nästa steg är att skapa en avsiktsigenkännare med hjälp av new IntentRecognizer(config). Eftersom konfigurationen redan vet vilken prenumeration som ska användas behöver du inte ange prenumerationsnyckeln och slutpunkten igen när du skapar identifieraren.

Importera en LUIS-modell och lägga till avsikter

Nu importerar du modellen från LUIS-appen med hjälp av LanguageUnderstandingModel.FromAppId() och lägger till de LUIS-avsikter som du vill känna igen igenkännarens AddIntent()-metod. De här två stegen förbättrar taligenkänningens noggrannhet genom att ange ord som det är troligt att användaren använder i sina begäranden. Du behöver inte lägga till alla appens avsikter om du inte behöver känna igen alla i ditt program.

Om du vill lägga till avsikter måste du ange tre argument: LUIS-modellen (som har skapats och heter ), avsiktsnamnet model och ett avsikts-ID. Skillnaden mellan ID och namnet är som följer.

AddIntent() argument Syfte
intentName Namnet på avsikten enligt vad som definierats i LUIS-appen. Det här värdet måste matcha LUIS-avsiktsnamnet exakt.
intentID Ett ID som tilldelas till en igenkänd avsikt av Speech SDK. Det här värdet kan vara vad du vill; Den behöver inte motsvara avsiktsnamnet enligt definitionen i LUIS-appen. Om flera avsikter till exempel hanteras av samma kod kan du använda samma ID för dem.

LUIS-appen Home Automation har två avsikter: en för att aktivera en enhet och en annan för att stänga av en enhet. Raderna nedan lägger till dessa avsikter till igenkännaren. Ersätt de tre AddIntent-raderna i metoden RecognizeIntentAsync() med den här koden.

recognizer.AddIntent(model, "HomeAutomation.TurnOff", "off");
recognizer.AddIntent(model, "HomeAutomation.TurnOn", "on");

I stället för att lägga till enskilda avsikter kan du också använda metoden för att lägga till alla avsikter i AddAllIntents en modell till igen kännaren.

Starta igenkänning

När igenkännaren har skapats och avsikterna lagts till kan igenkänningen börja. Speech SDK stöder både engångsigenkänning och kontinuerlig igenkänning.

Igenkänningsläge Metoder att anropa Resultat
Engångsigenkänning RecognizeOnceAsync() Returnerar den igenkända avsikten, om sådan finns, efter ett yttrande.
Kontinuerlig igenkänning StartContinuousRecognitionAsync()
StopContinuousRecognitionAsync()
Identifierar flera yttranden. ger händelser (till exempel IntermediateResultReceived ) när resultat är tillgängliga.

Programmet använder engångsläge och anropar därför för RecognizeOnceAsync() att påbörja igenkänningen. Resultatet är ett IntentRecognitionResult-objekt som innehåller information om den igenkända avsikten. Du extraherar LUIS JSON-svaret med hjälp av följande uttryck:

result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)

Programmet parsar inte JSON-resultatet. JSON-texten visas bara i konsolfönstret.

Resultat av enkel LUIS-igenkänning

Ange igenkänningsspråk

Som standard känner LUIS igen avsikter på amerikansk engelska (en-us). Genom att tilldela en kod för nationella inställningar till egenskapen SpeechRecognitionLanguage i talkonfigurationen kan du känna igen avsikter på andra språk. Lägg till exempel till config.SpeechRecognitionLanguage = "de-de"; i vårt program innan du skapar igensökningen för att identifiera avsikter på tyska. Mer information finns i Språkstöd för LUIS.

Kontinuerlig igenkänning från en fil

Följande kod illustrerar två ytterligare funktioner för avsiktsigenkänning med hjälp av Speech SDK. Den första, som nämnts tidigare, är kontinuerlig igenkänning, där igenkännaren genererar händelser när resultat finns tillgängliga. Dessa händelser kan sedan bearbetas av händelsehanterare som du anger. Med kontinuerlig igenkänning anropar du igenkännarens StartContinuousRecognitionAsync() metod för att starta igenkänningen i stället för RecognizeOnceAsync() .

Den andra funktionen är att läsa det ljud som innehåller det tal som ska bearbetas från en WAV-fil. Implementering innebär att du skapar en ljudkonfiguration som kan användas när du skapar avsikts identifieraren. Filen måste vara enkanalig (mono) med en samplingsfrekvens på 16 kHz.

Om du vill prova dessa funktioner tar du bort eller kommenterar bort -metodens brödtext RecognizeIntentAsync() och lägger till följande kod i dess ställe.

// 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("whatstheweatherlike.wav"))
{
    using (var recognizer = new IntentRecognizer(config, audioInput))
    {
        // The TaskCompletionSource to stop recognition.
        var stopRecognition = new TaskCompletionSource<int>();

        // 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.
        Console.WriteLine("Say something...");
        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);
    }
}

Ändra koden så att den innehåller din LUIS-slutpunktsnyckel, region och app-ID för att lägga till Home Automation-avsikterna som tidigare. Ändra whatstheweatherlike.wav till namnet på den inspelade ljudfilen. Skapa sedan, kopiera ljudfilen till byggkatalogen och kör programmet.

Om du till exempel säger "Släck lamporna", pausar och sedan säger "Tänd lamporna" i din inspelade ljudfil kan konsolutdata som liknar följande visas:

Ljudfilens LUIS-igenkänningsresultat

Exempel käll kod

Talet SDK-teamet hanterar aktivt en stor uppsättning exempel i en databas med öppen källkod. För exempel käll kods lager finns besök Microsoft Cognitive Services Speech SDK på GitHub . Det finns exempel för C#, C++, Java, python, mål-C, Swift, Java Script, UWP, Unity och Xamarin.


GitHub

Leta efter koden från den här artikeln i mappen samples/csharp/sharedcontent/console.

Nästa steg