Pengenalan ucapan

Gunakan pengenalan ucapan untuk memberikan input, menentukan tindakan atau perintah, dan menyelesaikan tugas.

API Penting: Windows.Media.SpeechRecognition

Pengenalan ucapan terdiri dari runtime ucapan, API pengenalan untuk memprogram runtime, tata bahasa yang siap digunakan untuk dikte dan pencarian web, dan UI sistem default yang membantu pengguna menemukan dan menggunakan fitur pengenalan ucapan.

Mengonfigurasi pengenalan ucapan

Untuk mendukung pengenalan ucapan dengan aplikasi Anda, pengguna harus terhubung dan mengaktifkan mikrofon di perangkat mereka, dan menerima Kebijakan Privasi Microsoft yang memberikan izin bagi aplikasi Anda untuk menggunakannya.

Untuk secara otomatis meminta pengguna dengan dialog sistem yang meminta izin untuk mengakses dan menggunakan umpan audio mikrofon (misalnya dari sampel pengenalan Ucapan dan sintesis ucapan yang ditunjukkan di bawah), cukup atur kemampuan perangkatMikrofon dalam manifes paket Aplikasi. Untuk detail selengkapnya, lihat Deklarasi kemampuan aplikasi.

Kebijakan privasi untuk akses mikrofon

Jika pengguna mengklik Ya untuk memberikan akses ke mikrofon, aplikasi Anda ditambahkan ke daftar aplikasi yang disetujui di halaman Pengaturan -> Privasi -> Mikrofon. Namun, karena pengguna dapat memilih untuk menonaktifkan pengaturan ini kapan saja, Anda harus mengonfirmasi bahwa aplikasi Anda memiliki akses ke mikrofon sebelum mencoba menggunakannya.

Jika Anda juga ingin mendukung dikte, Cortana, atau layanan pengenalan ucapan lainnya (seperti tata bahasa yang telah ditentukan sebelumnya yang ditentukan dalam batasan topik), Anda juga harus mengonfirmasi bahwa Pengenalan ucapan Online (Pengaturan -> Privasi -> Ucapan) diaktifkan.

Cuplikan ini menunjukkan bagaimana aplikasi Anda dapat memeriksa apakah ada mikrofon dan apakah memiliki izin untuk menggunakannya.

public class AudioCapturePermissions
{
    // If no microphone is present, an exception is thrown with the following HResult value.
    private static int NoCaptureDevicesHResult = -1072845856;

    /// <summary>
    /// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
    /// the Cortana/Dictation privacy check.
    ///
    /// You should perform this check every time the app gets focus, in case the user has changed
    /// the setting while the app was suspended or not in focus.
    /// </summary>
    /// <returns>True, if the microphone is available.</returns>
    public async static Task<bool> RequestMicrophonePermission()
    {
        try
        {
            // Request access to the audio capture device.
            MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();
            settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
            settings.MediaCategory = MediaCategory.Speech;
            MediaCapture capture = new MediaCapture();

            await capture.InitializeAsync(settings);
        }
        catch (TypeLoadException)
        {
            // Thrown when a media player is not available.
            var messageDialog = new Windows.UI.Popups.MessageDialog("Media player components are unavailable.");
            await messageDialog.ShowAsync();
            return false;
        }
        catch (UnauthorizedAccessException)
        {
            // Thrown when permission to use the audio capture device is denied.
            // If this occurs, show an error or disable recognition functionality.
            return false;
        }
        catch (Exception exception)
        {
            // Thrown when an audio capture device is not present.
            if (exception.HResult == NoCaptureDevicesHResult)
            {
                var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
                await messageDialog.ShowAsync();
                return false;
            }
            else
            {
                throw;
            }
        }
        return true;
    }
}
/// <summary>
/// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
/// the Cortana/Dictation privacy check.
///
/// You should perform this check every time the app gets focus, in case the user has changed
/// the setting while the app was suspended or not in focus.
/// </summary>
/// <returns>True, if the microphone is available.</returns>
IAsyncOperation<bool>^  AudioCapturePermissions::RequestMicrophonePermissionAsync()
{
    return create_async([]() 
    {
        try
        {
            // Request access to the audio capture device.
            MediaCaptureInitializationSettings^ settings = ref new MediaCaptureInitializationSettings();
            settings->StreamingCaptureMode = StreamingCaptureMode::Audio;
            settings->MediaCategory = MediaCategory::Speech;
            MediaCapture^ capture = ref new MediaCapture();

            return create_task(capture->InitializeAsync(settings))
                .then([](task<void> previousTask) -> bool
            {
                try
                {
                    previousTask.get();
                }
                catch (AccessDeniedException^)
                {
                    // Thrown when permission to use the audio capture device is denied.
                    // If this occurs, show an error or disable recognition functionality.
                    return false;
                }
                catch (Exception^ exception)
                {
                    // Thrown when an audio capture device is not present.
                    if (exception->HResult == AudioCapturePermissions::NoCaptureDevicesHResult)
                    {
                        auto messageDialog = ref new Windows::UI::Popups::MessageDialog("No Audio Capture devices are present on this system.");
                        create_task(messageDialog->ShowAsync());
                        return false;
                    }

                    throw;
                }
                return true;
            });
        }
        catch (Platform::ClassNotRegisteredException^ ex)
        {
            // Thrown when a media player is not available. 
            auto messageDialog = ref new Windows::UI::Popups::MessageDialog("Media Player Components unavailable.");
            create_task(messageDialog->ShowAsync());
            return create_task([] {return false; });
        }
    });
}
var AudioCapturePermissions = WinJS.Class.define(
    function () { }, {},
    {
        requestMicrophonePermission: function () {
            /// <summary>
            /// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
            /// the Cortana/Dictation privacy check.
            ///
            /// You should perform this check every time the app gets focus, in case the user has changed
            /// the setting while the app was suspended or not in focus.
            /// </summary>
            /// <returns>True, if the microphone is available.</returns>
            return new WinJS.Promise(function (completed, error) {

                try {
                    // Request access to the audio capture device.
                    var captureSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
                    captureSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio;
                    captureSettings.mediaCategory = Windows.Media.Capture.MediaCategory.speech;

                    var capture = new Windows.Media.Capture.MediaCapture();
                    capture.initializeAsync(captureSettings).then(function () {
                        completed(true);
                    },
                    function (error) {
                        // Audio Capture can fail to initialize if there's no audio devices on the system, or if
                        // the user has disabled permission to access the microphone in the Privacy settings.
                        if (error.number == -2147024891) { // Access denied (microphone disabled in settings)
                            completed(false);
                        } else if (error.number == -1072845856) { // No recording device present.
                            var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
                            messageDialog.showAsync();
                            completed(false);
                        } else {
                            error(error);
                        }
                    });
                } catch (exception) {
                    if (exception.number == -2147221164) { // REGDB_E_CLASSNOTREG
                        var messageDialog = new Windows.UI.Popups.MessageDialog("Media Player components not available on this system.");
                        messageDialog.showAsync();
                        return false;
                    }
                }
            });
        }
    })

Mengenali input ucapan

Batasan menentukan kata dan frasa (kosakata) yang dikenali aplikasi dalam input ucapan. Batasan adalah inti dari pengenalan ucapan dan memberi aplikasi Anda kontrol yang lebih besar atas akurasi pengenalan ucapan.

Anda dapat menggunakan jenis batasan berikut untuk mengenali input ucapan.

Tata bahasa yang telah ditentukan sebelumnya

Dikte dan tata bahasa pencarian web yang telah ditentukan sebelumnya memberikan pengenalan ucapan untuk aplikasi Anda tanpa mengharuskan Anda menulis tata bahasa. Saat menggunakan tata bahasa ini, pengenalan ucapan dilakukan oleh layanan web jarak jauh dan hasilnya dikembalikan ke perangkat.

Tata bahasa dikte teks bebas default dapat mengenali sebagian besar kata dan frasa yang dapat dikatakan pengguna dalam bahasa tertentu, dan dioptimalkan untuk mengenali frasa pendek. Tata bahasa dikte yang telah ditentukan sebelumnya digunakan jika Anda tidak menentukan batasan apa pun untuk objek SpeechRecognizer Anda. Dikte teks bebas berguna ketika Anda tidak ingin membatasi jenis hal yang dapat dikatakan pengguna. Penggunaan umum termasuk membuat catatan atau mendikte konten untuk pesan.

Tata bahasa pencarian web, seperti tata bahasa dikte, berisi sejumlah besar kata dan frasa yang mungkin dikatakan pengguna. Namun, dioptimalkan untuk mengenali istilah yang biasanya digunakan orang saat mencari di web.

Catatan

 Karena dikte dan tata bahasa pencarian web yang telah ditentukan sebelumnya bisa besar, dan karena online (bukan pada perangkat), performa mungkin tidak secepat tata bahasa kustom yang diinstal pada perangkat.  

Tata bahasa yang telah ditentukan sebelumnya ini dapat digunakan untuk mengenali hingga 10 detik input ucapan dan tidak memerlukan upaya penulisan di pihak Anda. Namun, mereka memerlukan koneksi ke jaringan.

Untuk menggunakan batasan layanan web, input ucapan dan dukungan dikte harus diaktifkan di Pengaturan dengan mengaktifkan opsi "Kenali saya" di Pengaturan - Privasi ->> Ucapan, penintaan, dan pengetikan.

Di sini, kami menunjukkan cara menguji apakah input ucapan diaktifkan dan membuka halaman Pengaturan - Privasi ->> Ucapan, penintaan, dan pengetikan, jika tidak.

Pertama, kami menginisialisasi variabel global (HResultPrivacyStatementDeclined) ke nilai HResult 0x80045509. Lihat Penanganan pengecualian untuk di C# atau Visual Basic.

private static uint HResultPrivacyStatementDeclined = 0x80045509;

Kami kemudian menangkap pengecualian standar selama pengenalan dan menguji apakah nilai HResult sama dengan nilai variabel HResultPrivacyStatementDeclined. Jika demikian, kami menampilkan peringatan dan panggilan await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); untuk membuka halaman Pengaturan.

catch (Exception exception)
{
  // Handle the speech privacy policy error.
  if ((uint)exception.HResult == HResultPrivacyStatementDeclined)
  {
    resultTextBlock.Visibility = Visibility.Visible;
    resultTextBlock.Text = "The privacy statement was declined." + 
      "Go to Settings -> Privacy -> Speech, inking and typing, and ensure you" +
      "have viewed the privacy policy, and 'Get To Know You' is enabled.";
    // Open the privacy/speech, inking, and typing settings page.
    await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); 
  }
  else
  {
    var messageDialog = new Windows.UI.Popups.MessageDialog(exception.Message, "Exception");
    await messageDialog.ShowAsync();
  }
}

Lihat SpeechRecognitionTopicConstraint.

Batasan daftar terprogram

Batasan daftar terprogram memberikan pendekatan ringan untuk membuat tata bahasa sederhana menggunakan daftar kata atau frasa. Batasan daftar berfungsi dengan baik untuk mengenali frasa pendek dan berbeda. Secara eksplisit menentukan semua kata dalam tata bahasa juga meningkatkan akurasi pengenalan, karena mesin pengenalan ucapan hanya boleh memproses ucapan untuk mengonfirmasi kecocokan. Daftar ini juga dapat diperbarui secara terprogram.

Batasan daftar terdiri dari array string yang mewakili input ucapan yang akan diterima aplikasi Anda untuk operasi pengenalan. Anda dapat membuat batasan daftar di aplikasi Dengan membuat objek batasan daftar pengenalan ucapan dan meneruskan array string. Kemudian, tambahkan objek tersebut ke koleksi batasan recognizer. Pengenalan berhasil ketika pengenal ucapan mengenali salah satu string dalam array.

Lihat SpeechRecognitionListConstraint.

Tata bahasa SRGS

Tata bahasa Spesifikasi Tata Bahasa Pengenalan Ucapan (SRGS) adalah dokumen statis yang, tidak seperti batasan daftar terprogram, menggunakan format XML yang ditentukan oleh SRGS Versi 1.0. Tata bahasa SRGS memberikan kontrol terbesar atas pengalaman pengenalan ucapan dengan memungkinkan Anda menangkap beberapa arti semantik dalam satu pengenalan.

Lihat SpeechRecognitionGrammarFileConstraint.

Batasan perintah suara

Gunakan file XML Definisi Perintah Suara (VCD) untuk menentukan perintah yang dapat dikatakan pengguna untuk memulai tindakan saat mengaktifkan aplikasi Anda. Untuk detail selengkapnya, lihat Mengaktifkan aplikasi latar depan dengan perintah suara melalui Cortana.

Lihat SpeechRecognitionVoiceCommandDefinitionConstraint/

Catatan Jenis jenis batasan yang Anda gunakan tergantung pada kompleksitas pengalaman pengenalan yang ingin Anda buat. Apa pun bisa menjadi pilihan terbaik untuk tugas pengenalan tertentu, dan Anda mungkin menemukan penggunaan untuk semua jenis batasan di aplikasi Anda. Untuk mulai menggunakan batasan, lihat Menentukan batasan pengenalan kustom.

Tata bahasa dikte aplikasi Universal Windows yang telah ditentukan sebelumnya mengenali sebagian besar kata dan frasa pendek dalam bahasa. Ini diaktifkan secara default ketika objek pengenal ucapan dibuat tanpa batasan kustom.

Dalam contoh ini, kami menunjukkan cara:

  • Buat pengenal ucapan.
  • Kompilasi batasan aplikasi Universal Windows default (tidak ada tata bahasa yang telah ditambahkan ke set tata bahasa pengenal ucapan).
  • Mulai dengarkan ucapan dengan menggunakan UI pengenalan dasar dan umpan balik TTS yang disediakan oleh metode RecognizeWithUIAsync . Gunakan metode RecognizeAsync jika UI default tidak diperlukan.
private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Compile the dictation grammar by default.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Menyesuaikan UI pengenalan

Saat aplikasi Anda mencoba pengenalan ucapan dengan memanggil SpeechRecognizer.RecognizeWithUIAsync, beberapa layar ditampilkan dalam urutan berikut.

Jika Anda menggunakan batasan berdasarkan tata bahasa yang telah ditentukan sebelumnya (dikte atau pencarian web):

  • Layar Mendengarkan .
  • Layar Berpikir .
  • Layar Heard yang Anda ucapkan atau layar kesalahan.

Jika Anda menggunakan batasan berdasarkan daftar kata atau frasa, atau batasan berdasarkan file tata bahasa SRGS:

  • Layar Mendengarkan .
  • Layar Apakah Anda mengatakan , jika apa yang dikatakan pengguna dapat ditafsirkan sebagai lebih dari satu hasil potensial.
  • Layar Heard yang Anda ucapkan atau layar kesalahan.

Gambar berikut menunjukkan contoh alur antar layar untuk pengenal ucapan yang menggunakan batasan berdasarkan file tata bahasa SRGS. Dalam contoh ini, pengenalan ucapan berhasil.

layar pengenalan awal untuk batasan berdasarkan file tata bahasa sgrs

layar pengenalan menengah untuk batasan berdasarkan file tata bahasa sgrs

layar pengenalan akhir untuk batasan berdasarkan file tata bahasa sgrs

Layar Mendengarkan dapat memberikan contoh kata atau frasa yang dapat dikenali aplikasi. Di sini, kami menunjukkan cara menggunakan properti kelas SpeechRecognizerUIOptions (diperoleh dengan memanggil properti SpeechRecognizer.UIOptions ) untuk menyesuaikan konten di layar Mendengarkan .

private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Listen for audio input issues.
    speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;

    // Add a web search grammar to the recognizer.
    var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");


    speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
    speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
    speechRecognizer.Constraints.Add(webSearchGrammar);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
    //await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Sampel