Rozpoznávání záměrů z řeči pomocí sady Speech SDK pro jazyk C#

Sada Speech SDK služeb Azure AI se integruje se službou LUIS (Language Understanding Service) a poskytuje rozpoznávání záměru. Záměr je něco, co chce uživatel udělat: rezervovat si let, ověřit počasí nebo si zavolat. Uživatel může použít jakákoli slova, která mu připadají přirozená. Služba LUIS mapuje požadavky uživatelů na vámi definované záměry.

Poznámka:

Aplikace LUIS definuje záměry a entity, které chcete rozpoznat. Je oddělená od aplikace C#, která používá službu Speech. V tomto článku budeme aplikaci služby LUIS označovat jako aplikaci LUIS a kód C# jako aplikaci.

V této příručce použijete sadu Speech SDK k vývoji konzolové aplikace jazyka C#, která odvozuje záměry z promluv uživatelů prostřednictvím mikrofonu vašeho zařízení. Získáte informace pro:

  • Vytvořit projekt sady Visual Studio odkazující na balíček NuGet sady Speech SDK
  • Vytvoření konfigurace řeči a získání rozpoznávání záměru
  • Získat model pro vaši aplikaci LUIS a přidat potřebné záměry
  • Specifikovat jazyk pro rozpoznávání řeči
  • Rozpoznávat řeč ze souboru
  • Používat asynchronní událostmi řízené průběžné rozpoznávání

Požadavky

Než začnete s tímto průvodcem, ujistěte se, že máte následující položky:

Služba LUIS a řeč

Služba LUIS se integruje se službou Speech za účelem rozpoznávání záměrů z řeči. Nepotřebujete předplatné služby Speech, stačí vám služba LUIS.

Služba LUIS používá dva typy klíčů:

Typ klíče Účel
Vytváření obsahu Umožňuje programově vytvářet a upravovat aplikace LUIS.
Predikce Používá se pro přístup k aplikaci LUIS za běhu.

Pro tuto příručku potřebujete typ klíče předpovědi. Tato příručka používá ukázku aplikace LUIS pro automatizaci domů, kterou můžete vytvořit pomocí rychlého startu k použití předem připravené aplikace domácí automatizace. Pokud jste vytvořili vlastní aplikaci LUIS, můžete ji použít.

Při vytváření aplikace LUIS služba LUIS automaticky vygeneruje klíč pro vytváření obsahu, abyste mohli aplikaci otestovat pomocí textových dotazů. Tento klíč neumožňuje integraci služby Speech a nefunguje s touto příručkou. Vytvořte prostředek LUIS na řídicím panelu Azure a přiřaďte ho k aplikaci LUIS. Pro tuto příručku můžete použít úroveň bezplatného předplatného.

Po vytvoření prostředku LUIS na řídicím panelu Azure se přihlaste k portálu LUIS, na stránce Moje aplikace zvolte aplikaci a pak přejděte na stránku Správa aplikace. Nakonec na bočním panelu vyberte Prostředky Azure.

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

Na stránce Prostředky Azure:

Výběrem ikony vedle klíče ho zkopírujte do schránky. (Můžete použít některý z klíčů.)

Vytvoření projektu a přidání úlohy

Pokud chcete vytvořit projekt sady Visual Studio pro vývoj pro Windows, musíte vytvořit projekt, nastavit vývoj desktopových aplikací sady Visual Studio pro .NET, nainstalovat sadu Speech SDK a zvolit cílovou architekturu.

Pokud chcete začít, vytvořte projekt v sadě Visual Studio a ujistěte se, že je sada Visual Studio nastavená pro vývoj desktopových aplikací .NET:

  1. Otevřete Visual Studio 2019.

  2. V okně Start vyberte Vytvořit nový projekt.

  3. V okně Vytvořit nový projekt zvolte Konzolová aplikace (.NET Framework) a pak vyberte Další.

  4. V okně Konfigurovat nový projekt zadejte do názvu projektu helloworld, zvolte nebo vytvořte cestu k adresáři v umístění a pak vyberte Vytvořit.

  5. V řádku nabídek sady Visual Studio vyberte Nástroje Získat nástroje>a funkce, které se otevře Instalační program pro Visual Studio a zobrazí dialogové okno Úpravy.

  6. Zkontrolujte, jestli je k dispozici úloha vývoje desktopových aplikací .NET. Pokud úloha není nainstalovaná, zaškrtněte políčko vedle ní a pak výběrem možnosti Upravit spusťte instalaci. Stažení a instalace může trvat několik minut.

    Pokud už je zaškrtnuté políčko vedle vývoje desktopových aplikací .NET, zavřete dialogové okno kliknutím na tlačítko Zavřít .

    Enable .NET desktop development

  7. Zavřete Instalační program pro Visual Studio.

Instalace sady Speech SDK

Dalším krokem je instalace balíčku NuGet sady Speech SDK, abyste na něj mohli odkazovat v kódu.

  1. V Průzkumník řešení klikněte pravým tlačítkem na projekt helloworld a pak vyberte Spravovat balíčky NuGet, aby se zobrazil Správce balíčků NuGet.

    NuGet Package Manager

  2. V pravém horním rohu vyhledejte rozevírací seznam Zdroj balíčku a ujistěte se, že je vybraná nuget.org .

  3. V levém horním rohu vyberte Procházet.

  4. Do vyhledávacího pole zadejte Microsoft.CognitiveServices.Speech a vyberte Enter.

  5. Ve výsledcích hledání vyberte balíček Microsoft.CognitiveServices.Speech a pak vyberte Nainstalovat a nainstalujte nejnovější stabilní verzi.

    Install Microsoft.CognitiveServices.Speech NuGet package

  6. Přijměte všechny smlouvy a licence a spusťte instalaci.

    Po instalaci balíčku se v okně konzoly Správce balíčků zobrazí potvrzení.

Volba cílové architektury

Teď, pokud chcete sestavit a spustit konzolovou aplikaci, vytvořte konfiguraci platformy odpovídající architektuře počítače.

  1. V řádku nabídek vyberte Sestavit>Configuration Manager. Zobrazí se dialogové okno Configuration Manager.

    Configuration Manager dialog box

  2. V rozevíracím seznamu Aktivní platforma řešení vyberte Nový. Zobrazí se dialogové okno Nová platforma řešení.

  3. V rozevíracím seznamu Typ nebo vyberte novou platformu :

    • Pokud používáte 64bitovou verzi Windows, vyberte x64.
    • Pokud používáte 32bitovou verzi Windows, vyberte x86.
  4. Vyberte OK a pak Zavřete.

Přidání kódu

Dále do projektu přidáte kód.

  1. V Průzkumník řešení otevřete soubor Program.cs.

  2. using Blok příkazů na začátku souboru nahraďte následujícími deklaracemi:

    using System;
    using System.Threading.Tasks;
    using Microsoft.CognitiveServices.Speech;
    using Microsoft.CognitiveServices.Speech.Audio;
    using Microsoft.CognitiveServices.Speech.Intent;
    
  3. Zadanou Main() metodu nahraďte následujícím asynchronním ekvivalentem:

    public static async Task Main()
    {
        await RecognizeIntentAsync();
        Console.WriteLine("Please press Enter to continue.");
        Console.ReadLine();
    }
    
  4. Vytvořte prázdnou asynchronní metodu RecognizeIntentAsync(), jak je znázorněno zde:

    static async Task RecognizeIntentAsync()
    {
    }
    
  5. Do textu této nové metody přidejte tento kód:

    // 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. Zástupné symboly v této metodě nahraďte klíčem prostředku, oblastí a ID aplikace LUIS následujícím způsobem.

    Zástupný symbol Replace with
    YourLanguageUnderstandingSubscriptionKey Váš klíč prostředku LUIS. Tuto položku musíte znovu získat z řídicího panelu Azure. Najdete ho na stránce Prostředky Azure vaší aplikace (v části Spravovat) na portálu LUIS.
    YourLanguageUnderstandingServiceRegion Krátký identifikátor oblasti, ve které je váš prostředek LUIS, například westus v oblasti USA – západ. Viz Oblasti.
    YourLanguageUnderstandingAppId ID aplikace LUIS. Najdete ho na stránce Nastavení vaší aplikace na portálu LUIS.

Pomocí těchto změn můžete sestavit (Control+Shift+B) a spustit aplikaci (F5). Po zobrazení výzvy zkuste do mikrofonu počítače říct "Vypnout světla". Aplikace zobrazí výsledek v okně konzoly.

Následující části obsahují informace o kódu.

Vytvoření nástroje pro rozpoznávání záměru

Nejprve je potřeba vytvořit konfiguraci řeči z prediktivního klíče a oblasti služby LUIS. Konfigurace řeči můžete použít k vytváření rozpoznávání pro různé funkce sady Speech SDK. Konfigurace řeči má několik způsobů, jak určit prostředek, který chcete použít; zde použijeme FromSubscriptionklíč prostředku a oblast.

Poznámka:

Použijte klíč a oblast vašeho prostředku LUIS, nikoli prostředek služby Speech.

Potom pomocí new IntentRecognizer(config) vytvořte nástroj pro rozpoznávání záměru. Vzhledem k tomu, že konfigurace už ví, který prostředek se má použít, nemusíte při vytváření nástroje pro rozpoznávání znovu zadávat klíč.

Import modelu LUIS a přidání záměrů

Teď model z aplikace LUIS naimportujte pomocí LanguageUnderstandingModel.FromAppId() a přidejte záměry služby LUIS, které si přejete pomocí metody AddIntent() nástroje pro rozpoznávání rozpoznat. Tyto dva kroky vylepší přesnost rozpoznávání řeči indikováním slov, která uživatel ve svých žádostech pravděpodobně použije. Pokud v aplikaci nepotřebujete rozpoznat všechny záměry aplikace, nemusíte přidávat všechny záměry aplikace.

Pokud chcete přidat záměry, musíte zadat tři argumenty: model LUIS (pojmenovaný model), název záměru a ID záměru. Rozdíl mezi ID a názvem je následující.

Argument AddIntent() Účel
intentName Název záměru, jak je definovaný v aplikaci LUIS. Tato hodnota musí přesně odpovídat názvu záměru LUIS.
intentID ID přiřazené rozpoznanému záměru sadou Speech SDK. Tato hodnota může být cokoli, co chcete; nemusí odpovídat názvu záměru definovanému v aplikaci LUIS. Pokud třeba stejný kód zpracovává více záměrů, můžete pro ně použít stejné ID.

Aplikace LUIS pro domácí automatizaci má dva záměry: jeden pro zapnutí zařízení a druhý pro vypnutí zařízení. Níže uvedené řádky přidají tyto záměry do nástroje pro rozpoznávání. Tyto tři řádky AddIntent v metodě RecognizeIntentAsync() nahraďte tímto kódem.

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

Místo přidávání jednotlivých záměrů můžete také použít metodu AddAllIntents k přidání všech záměrů v modelu do rozpoznávání.

Zahájení rozpoznávání

Když máte vytvořený nástroj pro rozpoznávání a přidali jste záměry, můžete zahájit rozpoznávání. Sada Speech SDK podporuje jednorázové i průběžné rozpoznávání.

Režim rozpoznávání Volané metody Výsledek
Jednorázový RecognizeOnceAsync() Vrací rozpoznaný záměr, pokud existuje, po jedné promluvě.
Průběžné StartContinuousRecognitionAsync()
StopContinuousRecognitionAsync()
Rozpozná více promluv; generuje události (například IntermediateResultReceived) při dostupnosti výsledků.

Aplikace používá režim s jedním snímkem, takže volání RecognizeOnceAsync() zahají rozpoznávání. Výsledkem je objekt IntentRecognitionResult, který obsahuje informace o rozpoznaném záměru. Odpověď JSON služby LUIS extrahujete pomocí následujícího výrazu:

result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)

Aplikace neanalyduje výsledek JSON. Zobrazí se jenom text JSON v okně konzoly.

Single LUIS recognition results

Specifikace jazyka rozpoznávání

Ve výchozím nastavení rozpoznává služba LUIS záměry v americké angličtině (en-us). Když přiřadíte kód národního prostředí vlastnosti SpeechRecognitionLanguage konfigurace řeči, můžete záměry rozpoznávat v jiných jazycích. Před vytvořením rozpoznávání například přidejte config.SpeechRecognitionLanguage = "de-de"; do naší aplikace záměry v němčině. Další informace najdete v tématu Podpora jazyka LUIS.

Průběžné rozpoznávání ze souboru

Následující kód znázorňuje dvě další možnosti rozpoznávání záměru pomocí sady Speech SDK. První z nich už jsme zmínili, je to průběžné rozpoznávání, u kterého nástroj pro rozpoznávání vysílá události, když jsou výsledky k dispozici. Tyto události zpracovávají obslužné rutiny událostí, které zadáte. Při průběžném rozpoznávání voláte metodu rozpoznávání StartContinuousRecognitionAsync() , která místo toho začne rozpoznávat RecognizeOnceAsync().

Druhou možností je čtení zvuku obsahujícího řeč, která se má zpracovat, ze souboru WAV. Implementace zahrnuje vytvoření zvukové konfigurace, kterou lze použít při vytváření rozpoznávání záměru. Soubor musí být jednokanálový (mono) a musí mít vzorkovací frekvenci 16 kHz.

Pokud chcete tyto funkce vyzkoušet, odstraňte nebo okomentujte text RecognizeIntentAsync() metody a přidejte na jeho místo následující kód.

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

Upravte kód tak, aby zahrnoval klíč predikce LUIS, oblast a ID aplikace a aby se přidaly záměry domácí automatizace jako předtím. Změňte whatstheweatherlike.wav název nahraného zvukového souboru. Potom sestavte, zkopírujte zvukový soubor do adresáře sestavení a spusťte aplikaci.

Pokud například řeknete "Vypnout světla", pozastavte a pak v nahraném zvukovém souboru řekněte "Zapnout světla", může se zobrazit výstup konzoly podobný následujícímu:

Audio file LUIS recognition results

Tým sady Speech SDK aktivně udržuje velkou sadu příkladů v opensourcovém úložišti. Ukázkové úložiště zdrojového kódu najdete v sadě Azure AI Speech SDK na GitHubu. K dispozici jsou ukázky pro C#, C++, Java, Python, Objective-C, Swift, JavaScript, UPW, Unity a Xamarin. Vyhledejte kód z tohoto článku ve složce samples/csharp/sharedcontent/console .

Další kroky

Rychlý start: Rozpoznávání řeči z mikrofonu