Cara mengenali niat dari ucapan menggunakan Speech SDK untuk C#

SDK Ucapan layanan Azure AI terintegrasi dengan layanan Pemahaman Bahasa (LUIS) untuk memberikan pengenalan niat. Niat adalah sesuatu yang ingin dilakukan pengguna: memesan penerbangan, memeriksa cuaca, atau melakukan panggilan. Pengguna dapat menggunakan istilah apa pun yang terdengar alami. LUIS memetakan permintaan pengguna ke niat yang Anda tentukan.

Catatan

Aplikasi LUIS akan menentukan niat dan entitas yang ingin Anda kenali. Ini terpisah dari aplikasi C# yang menggunakan layanan Speech. Dalam artikel ini, "apk" berarti aplikasi LUIS, sedangkan "aplikasi" berarti kode C#.

Dalam panduan ini, Anda akan menggunakan Speech SDK untuk mengembangkan aplikasi konsol C# yang berasal dari ungkapan pengguna melalui mikrofon perangkat Anda. Anda akan mempelajari cara untuk:

  • Membuat proyek Visual Studio yang mengacu pada paket Speech SDK NuGet
  • Membuat konfigurasi ucapan dan mendapatkan pengenal niat
  • Mendapatkan model untuk aplikasi LUIS Anda dan menambahkan niat yang dibutuhkan
  • Menentukan bahasa untuk pengenalan ucapan
  • Mengenali ucapan dari file
  • Gunakan pengenalan berkelanjutan yang digerakkan oleh peristiwa dan asinkron

Prasyarat

Pastikan Anda memiliki item berikut sebelum memulai panduan ini:

LUIS dan ucapan

LUIS terintegrasi dengan Layanan ucapan untuk mengenali niat dari ucapan. Anda tidak memerlukan langganan layanan Speech, Anda hanya perlu LUIS.

LUIS menggunakan dua jenis kunci:

Jenis Kunci Tujuan
Penulisan Memungkinkan Anda membuat dan memodifikasi aplikasi LUIS secara terprogram
Prediksi Digunakan untuk mengakses aplikasi LUIS dalam runtime

Untuk panduan ini, Anda memerlukan jenis kunci prediksi. Panduan ini menggunakan contoh aplikasi LUIS Otomatisasi Rumah, yang dapat Anda buat dengan mengikuti mulai cepat Menggunakan aplikasi Otomatisasi rumah bawaan. Jika Anda membuat aplikasi LUIS sendiri, Anda dapat menggunakannya sebagai gantinya.

Saat Anda membuat aplikasi LUIS, LUIS secara otomatis menghasilkan kunci penulisan sehingga Anda dapat menguji aplikasi menggunakan kueri teks. Kunci ini tidak mengaktifkan integrasi layanan Ucapan dan tidak berfungsi dengan panduan ini. Buat sumber daya LUIS di dasbor Azure dan tetapkan sumber daya tersebut ke aplikasi LUIS. Anda dapat menggunakan tingkat langganan gratis untuk panduan ini.

Setelah Anda membuat sumber daya LUIS di dasbor Azure, masuk ke Portal LUIS, pilih aplikasi Anda di halaman Aplikasi Saya, lalu beralih ke halaman Kelola aplikasi. Terakhir, pilih Sumber Daya Azure di bilah sisi.

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

Pada halaman Sumber Daya Azure:

Pilih ikon di samping kunci untuk menyalinnya ke clipboard. (Anda dapat menggunakan salah satu kunci.)

Membuat proyek dan menambahkan beban kerja

Untuk membuat proyek Visual Studio untuk pengembangan Windows, Anda perlu membuat proyek, menyiapkan Visual Studio untuk pengembangan desktop .NET, menginstal Speech SDK, dan memilih arsitektur target.

Untuk memulai, buat proyek di Visual Studio, dan pastikan Visual Studio disiapkan untuk pengembangan desktop .NET:

  1. Buka Visual Studio Code 2019.

  2. Di jendela Mulai, pilih Buat proyek baru.

  3. Di jendela Buat proyek baru, pilih Aplikasi Konsol (.NET Framework), lalu pilih Berikutnya.

  4. Di jendela Konfigurasikan proyek baru, masukkan helloworld di Nama proyek, pilih atau buat jalur direktori di Lokasi, lalu pilih Buat.

  5. Dari bilah menu Visual Studio, pilih Alat>Dapatkan Alat dan Fitur, yang membuka Alat Penginstal Visual Studio, dan menampilkan kotak dialog Mengubah.

  6. Periksa apakah beban kerja pengembangan desktop .NET tersedia. Jika beban kerja tidak diinstal, pilih kotak centang di sampingnya, lalu pilih Ubah untuk memulai penginstalan. Mungkin perlu beberapa menit untuk mengunduh dan memasang.

    Jika kotak centang di samping pengembangan desktop .NET sudah centang, pilih Tutup untuk keluar dari kotak dialog.

    Enable .NET desktop development

  7. Tutup Alat penginstal Visual Studio.

Menginstal SDK Ucapan

Langkah selanjutnya adalah menginstal paket Speech SDK NuGet, sehingga Anda dapat mereferensikannya dalam kode.

  1. Di Penjelajah Solusi, klik kanan proyek helloworld, lalu pilih Kelola Paket NuGet untuk menampilkan Pengelola Paket NuGet.

    NuGet Package Manager

  2. Di pojok kanan atas, temukan kotak drop-down Sumber Paket, dan pastikan nuget.org dipilih.

  3. Di sudut kiri atas, pilih Telusuri.

  4. Dalam kotak pencarian, ketik Microsoft.CognitiveServices.Speech dan pilih Enter.

  5. Dari hasil pencarian, pilih paket Microsoft.CognitiveServices.Speech, lalu pilih Instal untuk menginstal versi stabil terbaru.

    Install Microsoft.CognitiveServices.Speech NuGet package

  6. Terima semua perjanjian dan lisensi untuk memulai penginstalan.

    Setelah paket diinstal, konfirmasi akan muncul di jendela Konsol Pengelola Paket.

Memilih arsitektur target

Sekarang, untuk membuat dan menjalankan aplikasi konsol, buat konfigurasi platform yang sesuai dengan arsitektur komputer Anda.

  1. Dari bilah menu, pilih Build>Configuration Manager. Kotak dialog Configuration Manager akan muncul.

    Configuration Manager dialog box

  2. Di kotak drop-down Platform solusi aktif, pilih Baru. Kotak dialog Platform Solusi Baru akan muncul.

  3. Di kotak drop-down Ketik atau pilih platform baru:

    • Jika Anda menjalankan Windows 64-bit, pilih x64.
    • Jika Anda menjalankan Windows 32-bit, pilih x86.
  4. Pilih OK lalu Tutup.

Menambahkan kode

Selanjutnya, Anda akan menambahkan kode ke proyek.

  1. Dari Penjelajah Solusi, buka file Program.cs.

  2. Ganti blok pernyataan using di awal file dengan deklarasi berikut:

    using System;
    using System.Threading.Tasks;
    using Microsoft.CognitiveServices.Speech;
    using Microsoft.CognitiveServices.Speech.Audio;
    using Microsoft.CognitiveServices.Speech.Intent;
    
  3. Ganti metode Main() yang disediakan, dengan padanan asinkron berikut:

    public static async Task Main()
    {
        await RecognizeIntentAsync();
        Console.WriteLine("Please press Enter to continue.");
        Console.ReadLine();
    }
    
  4. Buat metode asinkron RecognizeIntentAsync() kosong, seperti yang ditunjukkan di sini:

    static async Task RecognizeIntentAsync()
    {
    }
    
  5. Dalam isi metode baru ini, tambahkan kode ini:

    // 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. Ganti tempat penampung dalam metode ini dengan kunci sumber daya LUIS, wilayah, dan ID aplikasi Anda sebagai berikut.

    Placeholder Ganti dengan
    YourLanguageUnderstandingSubscriptionKey Kunci sumber daya LUIS Anda. Sekali lagi, Anda harus mendapatkan item ini dari dasbor Azure. Anda dapat menemukannya di halaman Sumber Daya Azure aplikasi (di bagian Kelola) di portal LUIS.
    YourLanguageUnderstandingServiceRegion Pengidentifikasi singkat untuk wilayah tempat sumber daya LUIS Anda berada, seperti westus untuk US Barat. Lihat Wilayah.
    YourLanguageUnderstandingAppId ID aplikasi LUIS. Anda dapat menemukannya di halaman Pengaturan aplikasi di portal LUIS.

Setelah perubahan ini dibuat, Anda dapat membuat (Control +Shift +B) dan menjalankan (F5) aplikasi. Saat diminta, coba katakan "Matikan lampu" ke mikrofon PC Anda. Aplikasi akan menampilkan hasilnya di jendela konsol.

Bagian berikut ini mencakup pembahasan kode.

Membuat pengenal niat

Pertama, Anda perlu membuat konfigurasi ucapan dari kunci dan wilayah prediksi LUIS Anda. Anda dapat menggunakan konfigurasi ucapan untuk membuat pengenal untuk berbagai kemampuan Speech SDK. Konfigurasi ucapan memiliki beberapa cara untuk menentukan sumber daya yang ingin Anda gunakan; di sini, kami menggunakan FromSubscription, yang mengambil kunci sumber daya dan wilayah.

Catatan

Gunakan kunci dan wilayah sumber daya LUIS Anda, bukan sumber daya Ucapan.

Selanjutnya, buat pengenal niat menggunakan new IntentRecognizer(config). Karena konfigurasi sudah mengetahui sumber daya mana yang akan digunakan, Anda tidak perlu menentukan kunci lagi saat membuat pengenal.

Mengimpor model LUIS dan menambahkan niat

Sekarang impor model dari aplikasi LUIS menggunakan LanguageUnderstandingModel.FromAppId() dan tambahkan niat LUIS yang ingin Anda kenali melalui metode AddIntent() pengenal. Kedua langkah ini meningkatkan akurasi pengenalan ucapan dengan menunjukkan kata-kata yang kemungkinan akan digunakan pengguna dalam permintaan mereka. Anda tidak perlu menambahkan semua niat aplikasi jika Anda tidak perlu mengenali semuanya di aplikasi.

Untuk menambahkan niat, Anda harus memberikan tiga argumen: model LUIS (bernama model), nama niat, dan ID niat. Perbedaan antara ID dan nama adalah sebagai berikut.

Argumen AddIntent() Tujuan
intentName Nama niat seperti yang ditentukan dalam aplikasi LUIS. Nilai ini harus benar-benar sesuai dengan nama niat LUIS.
intentID ID yang ditetapkan untuk niat yang dikenali oleh Speech SDK. Nilai ini bisa berupa apa saja yang Anda suka; tidak harus sesuai dengan nama niat seperti yang ditentukan dalam aplikasi LUIS. Misalnya, jika beberapa niat ditangani oleh kode yang sama, Anda dapat menggunakan ID yang sama untuk niat tersebut.

Aplikasi Otomatisasi Rumah LUIS memiliki dua niat: satu untuk menyalakan perangkat, dan yang lain untuk mematikan perangkat. Baris di bawah ini menambahkan niat tersebut ke pengenal; ganti tiga baris AddIntent dalam metode RecognizeIntentAsync() dengan kode ini.

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

Alih-alih menambahkan niat individu, Anda juga dapat menggunakan metode AddAllIntents untuk menambahkan semua niat dalam model ke pengenal.

Memulai pengenalan

Setelah pengenal dibuat dan niat ditambahkan, pengenalan bisa dimulai. Speech SDK mendukung pengenalan satu kali dan berkelanjutan.

Mode penghargaan Metode untuk memanggil Hasil
Satu kali RecognizeOnceAsync() Menampilkan niat yang dikenali, jika ada, setelah satu ungkapan.
Berkelanjutan StartContinuousRecognitionAsync()
StopContinuousRecognitionAsync()
Mengenali beberapa ungkapan; mengirimkan peristiwa (misalnya, IntermediateResultReceived) begitu hasil tersedia.

Aplikasi ini menggunakan mode satu kali sehingga memanggil RecognizeOnceAsync() untuk memulai pengenalan. Hasilnya adalah objek IntentRecognitionResult yang berisi informasi tentang niat yang dikenali. Anda akan mengekstrak respons JSON LUIS menggunakan ekspresi berikut:

result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)

Aplikasi tidak mengurai hasil JSON. Ini hanya menampilkan teks JSON di jendela konsol.

Single LUIS recognition results

Tentukan bahasa pengenalan

Secara default, LUIS mengenali niat dalam bahasa Inggris AS (en-us). Dengan menetapkan kode lokal ke properti SpeechRecognitionLanguage konfigurasi ucapan, Anda dapat mengenali niat dalam bahasa lain. Misalnya, tambahkan config.SpeechRecognitionLanguage = "de-de"; di aplikasi kami sebelum membuat pengenal untuk mengenali niat dalam bahasa Jerman. Untuk informasi selengkapnya, lihat dukungan bahasa LUIS.

Pengenalan berkelanjutan dari file

Kode berikut mengilustrasikan dua kemampuan pengenalan niat lainnya menggunakan Speech SDK. Yang pertama, yang sudah disebutkan sebelumnya, adalah pengenalan berkelanjutan, saat pengenal memancarkan peristiwa begitu hasil tersedia. Peristiwa ini diproses oleh penanganan aktivitas yang Anda sediakan. Dengan pengenalan berkelanjutan, Anda akan memanggil metode StartContinuousRecognitionAsync() pengenal untuk memulai pengakuan, dan bukan RecognizeOnceAsync().

Kemampuan lainnya adalah membaca audio yang berisi ucapan yang akan diproses dari file WAV. Implementasi melibatkan pembuatan konfigurasi audio yang dapat digunakan saat membuat pengenal niat. File harus satu saluran (mono) dengan laju pengambilan sampel 16 kHz.

Untuk mencoba fitur ini, hapus atau komentari isi metode RecognizeIntentAsync(), lalu tambahkan kode berikut di tempatnya.

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

Revisi kode untuk menyertakan kunci prediksi, wilayah, dan ID aplikasi LUIS Anda dan untuk menambahkan niat Otomatisasi Beranda, seperti sebelumnya. Ubah whatstheweatherlike.wav ke nama file audio yang Anda rekam. Lalu buat, salin file audio ke direktori build, dan jalankan aplikasi.

Misalnya, jika Anda mengatakan "Matikan lampu", jeda, lalu ucapkan "Nyalakan lampu" di file audio yang direkam, output konsol yang mirip dengan yang berikut ini mungkin muncul:

Audio file LUIS recognition results

Tim Speech SDK secara aktif mempertahankan sekumpulan besar contoh dalam repositori sumber terbuka. Untuk repositori kode sumber sampel, lihat Azure AI Speech SDK di GitHub. Ada sampel untuk C#, C++, Java, Python, Objective-C, Swift, JavaScript, UWP, Unity, dan Xamarin. Cari kode dari artikel ini di folder sampel/csharp/sharedcontent/console.

Langkah berikutnya

Mulai cepat: Mengenali ucapan dari mikrofon