Aracılığıyla paylaş


Konuşma tanıma

Giriş sağlamak, bir eylem veya komut belirtmek ve görevleri gerçekleştirmek için konuşma tanımayı kullanın.

Önemli API'ler: Windows.Media.SpeechRecognition

Konuşma tanıma bir konuşma çalışma zamanından, çalışma zamanını programlamaya yönelik tanıma API'lerinden, dikte ve web araması için kullanıma hazır dil bilgilerinden ve kullanıcıların konuşma tanıma özelliklerini bulmasına ve kullanmasına yardımcı olan varsayılan sistem kullanıcı arabiriminden oluşur.

Konuşma tanımayı yapılandırma

Uygulamanızla konuşma tanımayı desteklemek için kullanıcının cihazında bir mikrofona bağlanması ve bu mikrofonu etkinleştirmesi ve uygulamanızın kullanma iznini veren Microsoft Gizlilik İlkesi'ni kabul etmesi gerekir.

Kullanıcıdan otomatik olarak mikrofon ses akışına erişim izni isteyen bir sistem iletişim kutusu istemek ve mikrofonu kullanmak için (aşağıda gösterilen Konuşma tanıma ve konuşma sentezi örneğinden örnek), Uygulama paketi bildirimindeMikrofoncihazı özelliğini ayarlamanız yeterlidir. Daha fazla ayrıntı için bkz. Uygulama özelliği bildirimleri.

Mikrofon erişimi için gizlilik ilkesi

Kullanıcı mikrofona erişim vermek için Evet'e tıklarsa, uygulamanız Ayarlar - Gizlilik ->> Mikrofon sayfasındaki onaylanan uygulamalar listesine eklenir. Ancak, kullanıcı bu ayarı istediği zaman kapatmayı seçeebileceği için, uygulamayı kullanmayı denemeden önce uygulamanızın mikrofona erişimi olduğunu onaylamanız gerekir.

Dikteyi, Cortana'yı veya diğer konuşma tanıma hizmetlerini (konu kısıtlamasında tanımlanan önceden tanımlanmış dil bilgisi gibi) desteklemek istiyorsanız, Çevrimiçi konuşma tanımanın (Ayarlar - Gizlilik ->> Konuşma) etkinleştirildiğini de onaylamanız gerekir.

Bu kod parçacığı, uygulamanızın bir mikrofonun mevcut olup olmadığını ve bunu kullanma izni olup olmadığını nasıl denetleyebileceğini gösterir.

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

Konuşma girişini tanıma

Kısıtlama, bir uygulamanın konuşma girişinde tanıdığı sözcükleri ve tümcecikleri (sözcük dağarcığı) tanımlar. Kısıtlamalar konuşma tanımanın merkezinde yer alır ve uygulamanıza konuşma tanımanın doğruluğu üzerinde daha fazla denetim sağlar.

Konuşma girişini tanımak için aşağıdaki kısıtlama türlerini kullanabilirsiniz.

Önceden tanımlanmış dil bilgisi

Uygulamanız için önceden tanımlanmış dikte ve web araması gramerleri, gramer yazmanıza gerek kalmadan konuşma tanıma sağlar. Bu dil bilgisi kuralları kullanılırken, konuşma tanıma işlemi uzak bir web hizmeti tarafından gerçekleştirilir ve sonuçlar cihaza geri döndürülür.

Varsayılan serbest metin dikte dil bilgisi, kullanıcının belirli bir dilde söyleyebileceği sözcüklerin ve tümceciklerin çoğunu tanıyabilir ve kısa tümcecikleri tanıyacak şekilde iyileştirilir. SpeechRecognizer nesneniz için herhangi bir kısıtlama belirtmezseniz önceden tanımlanmış dikte dil bilgisi kullanılır. Serbest metin diktesi, bir kullanıcının söyleyebileceği şeylerin türlerini sınırlamak istemediğinizde yararlıdır. Tipik kullanımlar arasında notlar oluşturma veya iletinin içeriğini dikte etme sayılabilir.

Dikte dil bilgisi gibi web araması dil bilgisi, kullanıcının söyleyebileceği çok sayıda sözcük ve tümcecik içerir. Ancak, kullanıcıların genellikle web'de arama yaparken kullandıkları terimleri tanıyacak şekilde iyileştirilmiştir.

Uyarı

 Önceden tanımlanmış dikte ve web araması dil bilgisi büyük olabileceğinden ve çevrimiçi olduklarından (cihazda değil) performans, cihazda yüklü özel dil bilgisi kadar hızlı olmayabilir.  

Bu önceden tanımlanmış dil bilgisi, 10 saniyeye kadar konuşma girişini tanımak için kullanılabilir ve sizin için yazma çabası gerektirmez. Ancak, bir ağa bağlantı gerektirir.

Web hizmeti kısıtlamalarını kullanmak için Ayarlar - > oluşturma ve yazma bölümünde "Beni tanıyın" seçeneği açılarak Ayarlar'da konuşma girişi ve dikte desteği etkinleştirilmelidir.

Burada konuşma girişinin etkinleştirilip etkinleştirilmediğini test etmeyi ve etkinleştirilmediyse Ayarlar - Gizlilik -> Konuşma, mürekkep oluşturma ve yazma sayfasını açmayı gösteriyoruz.

İlk olarak, 0x80045509 HResult değerine bir genel değişken (HResultPrivacyStatementDeclined) başlatırız. Bkz. C# veya Visual Basic'te için özel durum işleme.

private static uint HResultPrivacyStatementDeclined = 0x80045509;

Ardından tanıma sırasında herhangi bir standart istisnayı yakalar ve HResult değerinin HResultPrivacyStatementDeclined değişkeninin değerine eşit olup olmadığını test ederiz. Bu durumda, bir uyarı görüntüler ve Ayarlar sayfasını açmak amacıyla await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); çağırırız.

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

Bkz . SpeechRecognitionTopicConstraint.

Programlı liste kısıtlamaları

Programlı liste kısıtlamaları, sözcük veya tümcecik listesi kullanarak basit dil bilgisi oluşturmaya yönelik basit bir yaklaşım sağlar. Liste kısıtlaması, kısa ve ayrı tümcecikleri tanımak için iyi sonuç sağlar. Konuşma tanıma altyapısının eşleşmeyi onaylamak için yalnızca konuşmayı işlemesi gerektiğinden, dil bilgisi içindeki tüm sözcükleri açıkça belirtmek de tanıma doğruluğunu artırır. Liste program aracılığıyla da güncelleştirilebilir.

Liste kısıtlaması, uygulamanızın bir tanıma işlemi için kabul edeceği konuşma girişini temsil eden bir dizi dizeden oluşur. Uygulamanızda bir konuşma tanıma liste kısıtlaması nesnesi oluşturup bir dizi dize geçirerek liste kısıtlaması oluşturabilirsiniz. Ardından, bu nesneyi tanıyıcının constraints koleksiyonuna ekleyin. Konuşma tanıma sistemi, dizideki metinlerden herhangi birini tanıdığında tanıma başarılı kabul edilir.

Bkz . SpeechRecognitionListConstraint.

SRGS dil bilgisi

Konuşma Tanıma Dil Bilgisi Belirtimi (SRGS) dil bilgisi, programlı liste kısıtlamasının aksine SRGS Sürüm 1.0 tarafından tanımlanan XML biçimini kullanan statik bir belgedir. SRGS dil bilgisi, birden çok anlamsal anlamı tek bir tanımada yakalamanıza olanak sağlayarak konuşma tanıma deneyimi üzerinde en büyük denetimi sağlar.

Bkz . SpeechRecognitionGrammarFileConstraint.

Sesli komut kısıtlamaları

Kullanıcının uygulamanızı etkinleştirirken eylemleri başlatmak için söyleyebileceği komutları tanımlamak için bir Sesli Komut Tanımı (VCD) XML dosyası kullanın. Daha fazla ayrıntı için bkz . Cortana aracılığıyla sesli komutlarla ön plan uygulamasını etkinleştirme.

Bkz SpeechRecognitionVoiceCommandDefinitionConstraint/

Not Kullandığınız kısıtlama türü, oluşturmak istediğiniz tanıma deneyiminin karmaşıklık düzeyine bağlıdır. Herhangi biri belirli bir tanıma görevi için en iyi seçenek olabilir ve uygulamanızdaki tüm kısıtlama türlerinin kullanımlarını bulabilirsiniz. Kısıtlamaları kullanmaya başlamak için bkz. Özel tanıma kısıtlamaları tanımlama.

Önceden tanımlanmış Evrensel Windows uygulama dikte dil bilgisi, bir dildeki sözcüklerin ve kısa tümceciklerin çoğunu tanır. Konuşma tanıma nesnesi özel kısıtlamalar olmadan örneklendiğinde varsayılan olarak etkinleştirilir.

Bu örnekte şunların nasıl yapılacağını göstereceğiz:

  • Konuşma tanıyıcısı oluştur.
  • Varsayılan Evrensel Windows uygulama kısıtlamalarını derleyin (konuşma tanımanın dil bilgisi kümesine dil bilgisi eklenmemiştir).
  • RecognizeWithUIAsync yöntemi tarafından sağlanan temel tanıma kullanıcı arabirimini ve TTS geri bildirimini kullanarak konuşma dinlemeye başlayın. Varsayılan kullanıcı arabirimi gerekli değilse RecognizeAsync yöntemini kullanın.
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();
}

Tanıma kullanıcı arabirimini özelleştirme

Uygulamanız SpeechRecognizer.RecognizeWithUIAsync çağrısı yaparak konuşma tanımayı denediğinde, birkaç ekran aşağıdaki sırada gösterilir.

Önceden tanımlanmış dil bilgisi (dikte veya web araması) temelinde bir kısıtlama kullanıyorsanız:

  • Dinleme ekranı.
  • Düşünme ekranı.
  • Sesinizi duydunuz ekranı veya hata ekranı.

Sözcük veya tümcecik listesini temel alan bir kısıtlama veya SRGS dil bilgisi dosyasını temel alan bir kısıtlama kullanıyorsanız:

  • Dinleme ekranı.
  • Söylediniz mi ekranı, kullanıcının söylediklerinin birden fazla olası sonuç olarak yorumlanabilmesi durumunda gösterilir.
  • Sesinizi duydunuz ekranı veya hata ekranı.

Aşağıdaki görüntüde, SRGS dil bilgisi dosyasını temel alan bir kısıtlama kullanan bir konuşma tanıyıcı için ekranlar arasındaki akışın bir örneği gösterilmektedir. Bu örnekte konuşma tanıma başarılı oldu.

sgrs dil bilgisi dosyasını temel alan bir kısıtlama için ilk tanıma ekranı

sgrs dil bilgisi dosyasını temel alan bir kısıtlama için ara tanıma ekranı

sgrs dil bilgisi dosyasını temel alan bir kısıtlama için son tanıma ekranı

Dinleme ekranı, uygulamanın tanıyabileceği sözcük veya tümcecik örnekleri sağlayabilir. Burada, Dinleme ekranındaki içeriği özelleştirmek için SpeechRecognizerUIOptions sınıfının (SpeechRecognizer.UIOptions özelliği çağrılarak elde edilir) özelliklerinin nasıl kullanılacağını göstereceğiz.

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

Örnekleri