Windows uygulamalarında konuşma tanıma

Giriş sağlamak, eylemleri veya komutları belirtmek ve Windows Uygulama SDK'sı uygulamanızdaki görevleri gerçekleştirmek için konuşma tanımayı kullanın.

Important

Konuşma tanıma için MSIX paket kimliği gerekir. Windows.Media.SpeechRecognition API’leri, yalnızca uygulamanız paket kimliğiyle (paketlenmiş veya dış konumla paketlenmiş olarak) çalıştığında kullanılabilir. Paketlenmemiş uygulamalar bu API'leri kullanamaz.

Anahtar API'leri

Genel Bakış

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

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 kullanmasına izin veren Microsoft Gizlilik İlkesi'ni kabul etmesi gerekir.

Kullanıcıdan mikrofon erişimi izni istemesi için uygulamanızın paket bildiriminde Mikrofon cihazı özelliğini ayarlayın. Daha fazla bilgi için bkz. Uygulama özelliği bildirimleri.

Kullanıcı erişim izni verirse, uygulamanız Ayarlar > Gizlilik > Mikrofonu'ndaki onaylanan uygulamalar listesinde görünür. Kullanıcı bu ayarı istediği zaman devre dışı bırakabildiğinden, uygulamayı kullanmaya çalışmadan önce uygulamanızın mikrofon erişimi olduğunu onaylayın.

Dikteyi veya diğer konuşma tanıma hizmetlerini de (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şması) etkinleştirildiğini onaylayın.

Aşağıdaki örnekte, bir mikrofon olup olmadığının ve uygulamanızın mikrofonu kullanma izni olup olmadığının nasıl denetlendiği gösterilmektedir.

public class AudioCapturePermissions
{
    private static int NoCaptureDevicesHResult = -1072845856;

    /// <summary>
    /// Checks whether the microphone is available and the app has permission to use it.
    /// Perform this check every time the app gets focus, because the user can change
    /// the setting while the app is suspended or not in focus.
    /// </summary>
    /// <returns>True if the microphone is available.</returns>
    public static async Task<bool> RequestMicrophonePermission()
    {
        try
        {
            var settings = new MediaCaptureInitializationSettings
            {
                StreamingCaptureMode = StreamingCaptureMode.Audio,
                MediaCategory = MediaCategory.Speech
            };
            var capture = new MediaCapture();
            await capture.InitializeAsync(settings);
        }
        catch (TypeLoadException)
        {
            // Media player components are not available.
            return false;
        }
        catch (UnauthorizedAccessException)
        {
            // Permission to use the audio capture device is denied.
            return false;
        }
        catch (Exception exception)
        {
            if (exception.HResult == NoCaptureDevicesHResult)
            {
                // No audio capture devices are present on this system.
                return false;
            }
            throw;
        }
        return true;
    }
}

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 tanıma doğruluğu üzerinde daha fazla denetim sağlar.

Aşağıdaki kısıtlama türlerini kullanabilirsiniz.

Önceden tanımlanmış dil bilgisi

Önceden tanımlanmış dikte ve web arama dil bilgileri, bir dil bilgisi yazmanıza gerek duymadan konuşma tanıma sağlar. Bu dil bilgisini kullandığınızda, uzak bir web hizmeti tanıma gerçekleştirir ve sonuçları cihaza döndürü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ır ve kısa tümcecikler için iyileştirilir. SpeechRecognizer için herhangi bir kısıtlama belirtmezseniz, önceden tanımlanmış dikte dil bilgisi kullanılır.

Web araması dil bilgisi, kullanıcıların genellikle web'de arama yaparken kullandığı terimler için iyileştirilmiş çok sayıda sözcük ve tümcecik içerir.

Uyarı

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

Bu önceden tanımlanmış dil bilgisi, 10 saniyeye kadar konuşma girişini tanır ve yazma çabası gerektirmez. Ancak, bir ağ bağlantısı gerektirir.

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üklerin belirtilmesi tanıma doğruluğunu artırır. Liste program aracılığıyla da güncelleştirilebilir.

Bkz. SpeechRecognitionListConstraint.

SRGS dil bilgisi

Konuşma Tanıma Dil Bilgisi Belirtimi (SRGS) dil bilgisi, 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 izin vererek 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. Bkz. SpeechRecognitionVoiceCommandDefinitionConstraint.

Kısıtlamaları kullanmaya başlamak için bkz. Özel tanıma kısıtlamaları tanımlama.

Temel tanıma örneği

Aşağıdaki örnek bir konuşma tanıma oluşturur, varsayılan dikte kısıtlamalarını derler ve konuşma girişini dinlemeye başlar.

private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

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

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
        await speechRecognizer.RecognizeAsync();

    // Display the recognized text.
    if (result.Status == Windows.Media.SpeechRecognition.SpeechRecognitionResultStatus.Success)
    {
        resultTextBlock.Text = result.Text;
    }
}

Uyarı

Bu örnekte (kullanıcı arabirimi olmadan) kullanılır RecognizeAsync . Yerleşik tanıma kullanıcı arabirimini kullanmak istiyorsanız, bunun yerine RecognizeWithUIAsync çağrısını yapın. Özelleştirme seçenekleri için bkz SpeechRecognizerUIOptions .

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

Uygulamanız SpeechRecognizer.RecognizeWithUIAsync'i çağırdığında sistem sırayla birkaç ekran görüntüler:

  • Önceden tanımlanmış dil bilgisi (dikte veya web araması) için: DinlemeDüşünmeSöylediklerinizi (veya hatanızı) duydunuz .
  • Liste veya SRGS kısıtlamaları için: DinleniyorBunu mu dediniz (belirsizse) → Şunu dediğinizi duydum (veya hata).

SpeechRecognizerUIOptions sınıfını (SpeechRecognizer.UIOptions aracılığıyla elde edilir) Dinleme ekranını özelleştirmek için kullanın:

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

    speechRecognizer.RecognitionQualityDegrading += SpeechRecognizer_RecognitionQualityDegrading;

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

    await speechRecognizer.CompileConstraintsAsync();

    Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
        await speechRecognizer.RecognizeWithUIAsync();

    resultTextBlock.Text = result.Text;
}