Jak rozpoznawać intencje z mowy przy użyciu zestawu SPEECH SDK dla języka C#

Zestaw SDK rozpoznawania mowy usług Azure AI integruje się z usługą Language Understanding (LUIS), aby zapewnić rozpoznawanie intencji. Intencja to coś, co użytkownik chce zrobić: zarezerwować lot, sprawdzić prognozę pogody lub zadzwonić. Następnie może on użyć terminów, które wydają się naturalne. Usługa LUIS mapuje żądania użytkowników na zdefiniowane intencje.

Uwaga

Aplikacja usługi LUIS definiuje intencje i jednostki, które chcesz rozpoznawać. Jest ona używana oddzielnie od aplikacji języka C#, która korzysta z usługi rozpoznawania mowy. W tym artykule „aplikacja” oznacza aplikację usługi LUIS, a „zastosowanie” oznacza kod języka C#.

W tym przewodniku użyjesz zestawu SPEECH SDK do utworzenia aplikacji konsolowej języka C#, która wyprowadza intencje z wypowiedzi użytkownika za pośrednictwem mikrofonu urządzenia. Dowiedz się, jak odbywa się:

  • Tworzenie projektu programu Visual Studio odwołującego się do pakietu NuGet zestawu Speech SDK
  • Tworzenie konfiguracji mowy i uzyskiwanie rozpoznawania intencji
  • Uzyskiwanie modelu dla aplikacji usługi LUIS i dodawanie potrzebnych intencji
  • Określanie języka funkcji rozpoznawania mowy
  • Rozpoznawanie mowy z pliku
  • Używanie asynchronicznego, opartego na zdarzeniach rozpoznawania ciągłego

Wymagania wstępne

Przed rozpoczęciem tego przewodnika upewnij się, że masz następujące elementy:

Usługa LUIS i mowa

Usługa LUIS integruje się z usługą rozpoznawania mowy, aby rozpoznawać intencje z mowy. Nie potrzebujesz subskrypcji usługi rozpoznawania mowy, tylko usługi LUIS.

Usługa LUIS używa dwóch rodzajów kluczy:

Typ klucza Purpose
Tworzenie Umożliwia programowe tworzenie i modyfikowanie aplikacji usługi LUIS
Przewidywanie Służy do uzyskiwania dostępu do aplikacji usługi LUIS w środowisku uruchomieniowym

W tym przewodniku potrzebny jest typ klucza przewidywania. W tym przewodniku użyto przykładowej aplikacji usługi LUIS usługi Home Automation, którą można utworzyć, wykonując czynności opisane w przewodniku Szybki start Korzystanie ze wstępnie utworzonej aplikacji automatyzacji domu. Jeśli utworzono własną aplikację usługi LUIS, możesz jej użyć.

Podczas tworzenia aplikacji usługi LUIS usługa LUIS automatycznie generuje klucz tworzenia, aby można było przetestować aplikację przy użyciu zapytań tekstowych. Ten klucz nie włącza integracji usługi Mowa i nie działa z tym przewodnikiem. Utwórz zasób usługi LUIS na pulpicie nawigacyjnym platformy Azure i przypisz go do aplikacji usługi LUIS. W tym przewodniku możesz użyć warstwy bezpłatnej subskrypcji.

Po utworzeniu zasobu usługi LUIS na pulpicie nawigacyjnym platformy Azure zaloguj się do portalu usługi LUIS, wybierz aplikację na stronie Moje aplikacje, a następnie przejdź do strony Zarządzanie aplikacją. Na koniec wybierz pozycję Zasoby platformy Azure na pasku bocznym.

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

Na stronie Zasoby platformy Azure:

Wybierz ikonę obok klucza, aby skopiować go do schowka. (Możesz użyć dowolnego klucza).

Tworzenie projektu i dodawanie obciążenia

Aby utworzyć projekt programu Visual Studio dla programowania w systemie Windows, należy utworzyć projekt, skonfigurować program Visual Studio dla programowania aplikacji klasycznych .NET, zainstalować zestaw SPEECH SDK i wybrać architekturę docelową.

Aby rozpocząć, utwórz projekt w programie Visual Studio i upewnij się, że program Visual Studio został skonfigurowany do tworzenia aplikacji klasycznych .NET:

  1. Otwórz program Visual Studio 2019.

  2. W oknie Start wybierz pozycję Utwórz nowy projekt.

  3. W oknie Tworzenie nowego projektu wybierz pozycję Aplikacja konsolowa (.NET Framework), a następnie wybierz pozycję Dalej.

  4. W oknie Konfigurowanie nowego projektu wprowadź helloworldw polu Nazwa projektu, wybierz lub utwórz ścieżkę katalogu w polu Lokalizacja, a następnie wybierz pozycję Utwórz.

  5. Na pasku menu programu Visual Studio wybierz pozycję Narzędzia Pobierz narzędzia>i funkcje, co spowoduje otwarcie Instalator programu Visual Studio i wyświetlenie okna dialogowego Modyfikowanie.

  6. Sprawdź, czy obciążenie programowanie aplikacji klasycznych platformy .NET jest dostępne. Jeśli obciążenie nie jest zainstalowane, zaznacz pole wyboru obok niego, a następnie wybierz pozycję Modyfikuj , aby rozpocząć instalację. Pobranie i zainstalowanie może potrwać kilka minut.

    Jeśli pole wyboru obok pozycji Programowanie aplikacji klasycznych platformy .NET jest już zaznaczone, wybierz pozycję Zamknij , aby zamknąć okno dialogowe.

    Enable .NET desktop development

  7. Zamknij Instalator programu Visual Studio.

Instalowanie zestawu SDK usługi Mowa

Następnym krokiem jest zainstalowanie pakietu NuGet zestawu SDK usługi Mowa, aby można było odwoływać się do niego w kodzie.

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt helloworld, a następnie wybierz polecenie Zarządzaj pakietami NuGet, aby wyświetlić Menedżer pakietów NuGet.

    NuGet Package Manager

  2. W prawym górnym rogu znajdź pole rozwijane Źródło pakietu i upewnij się, że wybrano nuget.org .

  3. W lewym górnym rogu wybierz pozycję Przeglądaj.

  4. W polu wyszukiwania wpisz Microsoft.CognitiveServices.Speech i wybierz klawisz Enter.

  5. W wynikach wyszukiwania wybierz pakiet Microsoft.CognitiveServices.Speech , a następnie wybierz pozycję Zainstaluj , aby zainstalować najnowszą stabilną wersję.

    Install Microsoft.CognitiveServices.Speech NuGet package

  6. Zaakceptuj wszystkie umowy i licencje, aby rozpocząć instalację.

    Po zainstalowaniu pakietu w oknie konsoli Menedżer pakietów zostanie wyświetlone potwierdzenie.

Wybieranie architektury docelowej

Teraz, aby skompilować i uruchomić aplikację konsolową, utwórz konfigurację platformy zgodną z architekturą komputera.

  1. Na pasku menu wybierz pozycję Kompiluj>program Configuration Manager. Zostanie wyświetlone okno dialogowe Configuration Manager.

    Configuration Manager dialog box

  2. W polu listy rozwijanej Aktywna platforma rozwiązania wybierz pozycję Nowy. Zostanie wyświetlone okno dialogowe Nowa platforma rozwiązania.

  3. W polu listy rozwijanej Typ lub wybierz nową platformę :

    • Jeśli korzystasz z 64-bitowego systemu Windows, wybierz pozycję x64.
    • Jeśli korzystasz z 32-bitowego systemu Windows, wybierz pozycję x86.
  4. Wybierz przycisk OK , a następnie zamknij.

Dodawanie kodu

Następnie dodasz kod do projektu.

  1. W Eksplorator rozwiązań otwórz Program.cs pliku.

  2. Zastąp blok instrukcji using na początku pliku następującymi deklaracjami:

    using System;
    using System.Threading.Tasks;
    using Microsoft.CognitiveServices.Speech;
    using Microsoft.CognitiveServices.Speech.Audio;
    using Microsoft.CognitiveServices.Speech.Intent;
    
  3. Zastąp podaną Main() metodę następującym asynchronicznym odpowiednikiem:

    public static async Task Main()
    {
        await RecognizeIntentAsync();
        Console.WriteLine("Please press Enter to continue.");
        Console.ReadLine();
    }
    
  4. Utwórz pustą metodę RecognizeIntentAsync()asynchroniczną , jak pokazano poniżej:

    static async Task RecognizeIntentAsync()
    {
    }
    
  5. W treści tej nowej metody dodaj następujący kod:

    // 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. Zastąp symbole zastępcze w tej metodzie kluczem zasobu usługi LUIS, regionem i identyfikatorem aplikacji w następujący sposób.

    Symbol zastępczy Replace with
    YourLanguageUnderstandingSubscriptionKey Klucz zasobu usługi LUIS. Ponownie musisz pobrać ten element z pulpitu nawigacyjnego platformy Azure. Możesz ją znaleźć na stronie Zasobów platformy Azure aplikacji (w obszarze Zarządzanie) w portalu usługi LUIS.
    YourLanguageUnderstandingServiceRegion Krótki identyfikator regionu, w którym znajduje się zasób usługi LUIS, na przykład westus dla regionu Zachodnie stany USA. Zobacz Regions (Regiony).
    YourLanguageUnderstandingAppId Identyfikator aplikacji usługi LUIS. Można ją znaleźć na stronie Ustawienia aplikacji w portalu usługi LUIS.

Po wprowadzeniu tych zmian możesz skompilować aplikację (Control+Shift+B) i uruchomić aplikację (F5). Po wyświetleniu monitu spróbuj powiedzieć "Wyłącz światła" do mikrofonu komputera. Aplikacja wyświetla wynik w oknie konsoli.

Poniższe sekcje zawierają omówienie kodu.

Tworzenie aparatu rozpoznawania intencji

Najpierw należy utworzyć konfigurację mowy na podstawie klucza przewidywania i regionu usługi LUIS. Konfiguracje mowy umożliwiają tworzenie funkcji rozpoznawania dla różnych możliwości zestawu SPEECH SDK. Konfiguracja mowy ma wiele sposobów określania zasobu, którego chcesz użyć; w tym miejscu użyjemy elementu , który przyjmuje FromSubscriptionklucz zasobu i region.

Uwaga

Użyj klucza i regionu zasobu usługi LUIS, a nie zasobu usługi Mowa.

Następnie utwórz aparat rozpoznawania mowy przy użyciu elementu new IntentRecognizer(config). Ponieważ konfiguracja już wie, który zasób ma być używany, nie musisz ponownie określać klucza podczas tworzenia rozpoznawania.

Importowanie modelu usługi LUIS i dodawanie intencji

Teraz zaimportuj model z aplikacji usługi LUIS przy użyciu elementu LanguageUnderstandingModel.FromAppId() i dodaj intencje usługi LUIS, które chcesz rozpoznawać za pośrednictwem metody AddIntent() aparatu rozpoznawania. Te dwa kroki zwiększają dokładność rozpoznawania mowy, wskazując słowa, których użytkownik prawdopodobnie użyje w swoich żądaniach. Nie musisz dodawać wszystkich intencji aplikacji, jeśli nie musisz rozpoznawać ich wszystkich w aplikacji.

Aby dodać intencje, należy podać trzy argumenty: model usługi LUIS (o nazwie model), nazwę intencji i identyfikator intencji. Różnica między identyfikatorem i nazwą jest następująca.

Argument AddIntent() Purpose
intentName Nazwa intencji zgodnie z definicją w aplikacji usługi LUIS. Ta wartość musi być dokładnie zgodna z nazwą intencji usługi LUIS.
intentID Identyfikator przypisany do rozpoznanej intencji przez zestaw SDK rozpoznawania mowy. Ta wartość może być dowolna; nie musi odpowiadać nazwie intencji zdefiniowanej w aplikacji usługi LUIS. Jeśli na przykład ten sam kod obsługuje wiele intencji, możesz dla nich użyć tego samego identyfikatora.

Aplikacja luis home automation ma dwie intencje: jedną do włączania urządzenia, a drugą do wyłączania urządzenia. Poniższe wiersze powodują dodanie tych intencji do aparatu rozpoznawania; zastąp trzy wiersze AddIntent w metodzie RecognizeIntentAsync() tym kodem.

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

Zamiast dodawać poszczególne intencje, możesz również użyć AddAllIntents metody , aby dodać wszystkie intencje w modelu do rozpoznawania.

Uruchamianie rozpoznawania

Po utworzeniu aparatu rozpoznawania i dodaniu intencji można rozpocząć rozpoznawanie. Zestaw Speech SDK obsługuje rozpoznawanie pojedyncze i ciągłe.

Tryb rozpoznawania Metody do wywołania Result
Pojedyncze RecognizeOnceAsync() Zwraca rozpoznaną intencję, jeśli istnieje, po jednej wypowiedzi.
Ciągłe StartContinuousRecognitionAsync()
StopContinuousRecognitionAsync()
Rozpoznaje wiele wypowiedzi; emituje zdarzenia (na przykład IntermediateResultReceived), gdy wyniki są dostępne.

Aplikacja używa trybu pojedynczego strzału, dlatego wywołuje metodę RecognizeOnceAsync() w celu rozpoczęcia rozpoznawania. Wynik to obiekt IntentRecognitionResult zawierający informacje o rozpoznanej intencji. Odpowiedź JSON usługi LUIS wyodrębnia się przy użyciu następującego wyrażenia:

result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)

Aplikacja nie analizuje wyniku JSON. Wyświetla tylko tekst JSON w oknie konsoli.

Single LUIS recognition results

Określanie języka na potrzeby rozpoznawania

Domyślnie usługa LUIS rozpoznaje intencje w języku angielskim (Stany Zjednoczone) (en-us). Przypisanie kodu ustawień regionalnych do właściwości SpeechRecognitionLanguage konfiguracji mowy umożliwia rozpoznawanie intencji w innych językach. Na przykład dodaj config.SpeechRecognitionLanguage = "de-de"; aplikację przed utworzeniem aparatu rozpoznawania w celu rozpoznawania intencji w języku niemieckim. Aby uzyskać więcej informacji, zobacz Obsługa języka usługi LUIS.

Ciągłe rozpoznawanie z pliku

Poniższy kod ilustruje jeszcze dwie możliwości rozpoznawania intencji przy użyciu zestawu SPEECH SDK. Pierwsza z nich, wspomniana wcześniej, to rozpoznawanie ciągłe, w przypadku którego aparat rozpoznawania emituje zdarzenia, gdy wyniki są dostępne. Te zdarzenia są przetwarzane przez podane programy obsługi zdarzeń. W przypadku ciągłego rozpoznawania metoda rozpoznawania wywołuje metodę rozpoznawania StartContinuousRecognitionAsync() , aby rozpocząć rozpoznawanie zamiast RecognizeOnceAsync().

Inna możliwość to odczytywanie dźwięku zawierającego mowę w celu przetworzenia z pliku WAV. Implementacja obejmuje utworzenie konfiguracji audio, która może być używana podczas tworzenia rozpoznawania intencji. Plik musi być plikiem jednokanałowym (mono) z częstotliwością próbkowania wynoszącą 16 kHz.

Aby wypróbować te funkcje, usuń lub oznacz jako komentarz treść RecognizeIntentAsync() metody i dodaj następujący kod w swoim miejscu.

// 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);
    }
}

Popraw kod, aby uwzględnić klucz przewidywania usługi LUIS, region i identyfikator aplikacji oraz dodać intencje usługi Home Automation, tak jak poprzednio. Zmień whatstheweatherlike.wav na nazwę zarejestrowanego pliku audio. Następnie skompiluj plik audio do katalogu kompilacji i uruchom aplikację.

Jeśli na przykład zostanie wyświetlony komunikat "Wyłącz światła", wstrzymaj, a następnie w nagranym pliku audio powiedz "Włącz światła", dane wyjściowe konsoli podobne do następujących:

Audio file LUIS recognition results

Zespół zestawu SDK usługi Mowa aktywnie utrzymuje duży zestaw przykładów w repozytorium open source. Aby zapoznać się z przykładowym repozytorium kodu źródłowego, zobacz zestaw SDK usługi Mowa usługi Azure AI w witrynie GitHub. Istnieją przykłady dla języków C#, C++, Java, Python, Objective-C, Swift, JavaScript, UWP, Unity i Xamarin. Poszukaj kodu z tego artykułu w folderze samples/csharp/sharedcontent/console .

Następne kroki

Szybki start: rozpoznawanie mowy z mikrofonu