Aracılığıyla paylaş


Sürekli dikte etme

Uzun biçimli, sürekli dikte konuşma girişini yakalamayı ve tanımayı öğrenin.

Önemli API'ler: SpeechContinuousRecognitionSession, ContinuousRecognitionSession

Konuşma tanıma bölümünde, bir SpeechRecognizer nesnesinin RecognizeAsync veya RecognizeWithUIAsync yöntemlerini kullanarak, örneğin kısa ileti hizmeti (SMS) iletisi oluştururken veya soru sorarken nispeten kısa konuşma girişini yakalamayı ve tanımayı öğrendiniz.

Dikte veya e-posta gibi daha uzun, sürekli konuşma tanıma oturumları için, bir SpeechRecognizer öğesinin ContinuousRecognitionSession özelliğini kullanarak bir SpeechContinuousRecognitionSession nesnesi elde edin.

Uyarı

Dikte dili desteği, uygulamanızın çalıştığı cihaza bağlıdır. Bilgisayarlar ve dizüstü bilgisayarlar için yalnızca en-US tanınırken Xbox ve telefonlar konuşma tanıma tarafından desteklenen tüm dilleri tanıyabilir. Daha fazla bilgi için bkz. Konuşma tanıma dilini belirtme.

Kurulum

Uygulamanızın sürekli dikte oturumını yönetmek için birkaç nesneye ihtiyacı vardır:

  • SpeechRecognizer nesnesinin bir örneği.
  • Dikte sırasında kullanıcı arabirimini güncellemek için kullanıcı arabirimi dağıtıcısına bir referans.
  • Kullanıcı tarafından söylenen birikmiş sözcükleri izlemenin bir yolu.

Burada, bir SpeechRecognizer örneğini arka plan kod sınıfının özel bir alanı olarak bildireceğiz. Sürekli diktenin tek bir Genişletilebilir Uygulama İşaretleme Dili (XAML) sayfasının ötesinde devam etmesini istiyorsanız, uygulamanızın bir referansını başka bir yerde saklamanız gerekir.

private SpeechRecognizer speechRecognizer;

Dikte sırasında, tanıma sistemi olayları arka plan iş parçacığından oluşturur. Arka plan iş parçacığı XAML'de kullanıcı arabirimini doğrudan güncelleştiremediğinden, uygulamanızın tanıma olaylarına yanıt olarak kullanıcı arabirimini güncelleştirmek için bir dağıtıcı kullanması gerekir.

Burada, daha sonra kullanıcı arabirimi dağıtıcısı ile başlatılacak olan özel bir alan bildiriyoruz.

// Speech events may originate from a thread other than the UI thread.
// Keep track of the UI thread dispatcher so that we can update the
// UI in a thread-safe manner.
private CoreDispatcher dispatcher;

Kullanıcının söylediklerini izlemek için, konuşma tanıyıcı tarafından tetiklenen tanıma olaylarını işlemeniz gerekir. Bu olaylar, kullanıcı konuşmalarının öbekleri için tanıma sonuçları sağlar.

Burada, oturum sırasında elde edilen tüm tanıma sonuçlarını tutmak için bir StringBuilder nesnesi kullanırız. Yeni sonuçlar, işlendikçe StringBuilder'a eklenir.

private StringBuilder dictatedTextBuilder;

Başlatma İşlemi

Sürekli konuşma tanımanın başlatılması sırasında şunları gerçekleştirmeniz gerekir:

  • Uygulamanızın kullanıcı arayüzünü sürekli tanıma olay işleyicilerinde güncelliyorsanız, kullanıcı arayüzü iş parçacığı için dispatcher nesnesini çağırın.
  • Konuşma tanıyıcıyı başlatın.
  • Yerleşik dikte gramerini derleyin. Not Konuşma tanıma, tanınabilir bir sözcük dağarcığı tanımlamak için en az bir kısıtlama gerektirir. Herhangi bir kısıtlama belirtilmezse, önceden tanımlanmış bir dikte dil bilgisi kullanılır. Bkz . Konuşma tanıma.
  • Tanıma olayları için olay dinleyicilerini ayarlayın.

Bu örnekte , OnNavigatedTo sayfa olayında konuşma tanımayı başlatıyoruz.

  1. Konuşma tanıma tarafından tetiklenen olaylar arka plan iş parçacığında gerçekleştiğinden, kullanıcı arabirimi iş parçacığı güncelleştirmeleri için dağıtıcıya bir referans oluşturun. OnNavigatedTo her zaman kullanıcı arabirimi iş parçacığında çağrılır.
this.dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
  1. Ardından SpeechRecognizer örneğini başlatırız.
this.speechRecognizer = new SpeechRecognizer();
  1. Ardından SpeechRecognizer tarafından tanınabilecek tüm sözcükleri ve tümcecikleri tanımlayan dil bilgisini ekleyip derleriz.

    Açıkça dil bilgisi belirtmezseniz, varsayılan olarak önceden tanımlanmış bir dikte dil bilgisi kullanılır. Genellikle, varsayılan dil bilgisi genel dikte için en iyisidir.

    Burada, dil bilgisi eklemeden CompileConstraintsAsync'i hemen çağırırız.

SpeechRecognitionCompilationResult result =
      await speechRecognizer.CompileConstraintsAsync();

Tanıma olaylarını işleme

RecognizeAsync veya RecognizeWithUIAsync çağırarak tek, kısa bir konuşma veya tümcecik yakalayabilirsiniz.

Ancak, daha uzun ve sürekli bir tanıma oturumu yakalamak için, kullanıcı konuştuğunda arka planda çalıştırılacak olay dinleyicilerini belirtiriz ve dikte dizesini oluşturmak için işleyiciler tanımlarız.

Ardından, sürekli bir tanıma oturumunu yönetmek için yöntemler ve olaylar sağlayan bir SpeechContinuousRecognitionSession nesnesi elde etmek için tanıyıcımızın ContinuousRecognitionSession özelliğini kullanırız.

Özellikle iki olay kritik önem taşır:

  • ResultGenerated, tanıyıcı bazı sonuçlar oluşturduğunda gerçekleşir.
  • Tamamlandı, sürekli tanıma oturumu sona erdiğinde gerçekleşir.

ResultGenerated olayı, kullanıcı konuştuğunda oluşturulur. Tanıyıcı, kullanıcıyı sürekli dinler ve belirli aralıklarla konuşma girişi öbeğini ileten bir olay tetikler. Konuşma girişini incelemeniz, olay bağımsız değişkeninin Result özelliğini kullanmanız ve olay işleyicisinde metni bir StringBuilder nesnesine ekleme gibi uygun eylemi gerçekleştirmeniz gerekir.

SpeechRecognitionResult örneği olarak Result özelliği, konuşma girişini kabul etmek isteyip istemediğinizi belirlemek için kullanışlıdır. SpeechRecognitionResult bunun için iki özellik sağlar:

  • Durum , tanımanın başarılı olup olmadığını gösterir. Tanıma çeşitli nedenlerle başarısız olabilir.
  • Güvenilirlik , tanıyıcının doğru sözcükleri anladığını göreli güveni gösterir.

Sürekli tanımayı desteklemeye yönelik temel adımlar şunlardır:

  1. Burada, ResultGenerated sürekli tanınma olayı için işleyiciyi OnNavigatedTo sayfa olayına kaydediyoruz.
speechRecognizer.ContinuousRecognitionSession.ResultGenerated +=
        ContinuousRecognitionSession_ResultGenerated;
  1. Ardından Confidence özelliğini denetleriz. Güvenilirlik değeri Orta veya daha iyiyse, metni StringBuilder'a ekleriz. Giriş topladığımızda kullanıcı arabirimini de güncelleştiririz.

    ResultGenerated olayının kullanıcı arabirimini doğrudan güncelleştiremeyen bir arka plan iş parçacığında tetiklendiğini unutmayın. Bir işleyicinin kullanıcı arabirimini ([Speech ve TTS örneği] gibi) güncelleştirmesi gerekiyorsa, dağıtıcının RunAsync yöntemi aracılığıyla ui iş parçacığına güncelleştirmeleri göndermeniz gerekir.

private async void ContinuousRecognitionSession_ResultGenerated(
      SpeechContinuousRecognitionSession sender,
      SpeechContinuousRecognitionResultGeneratedEventArgs args)
      {

        if (args.Result.Confidence == SpeechRecognitionConfidence.Medium ||
          args.Result.Confidence == SpeechRecognitionConfidence.High)
          {
            dictatedTextBuilder.Append(args.Result.Text + " ");

            await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
              dictationTextBox.Text = dictatedTextBuilder.ToString();
              btnClearText.IsEnabled = true;
            });
          }
        else
        {
          await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
              dictationTextBox.Text = dictatedTextBuilder.ToString();
            });
        }
      }
  1. Ardından, sürekli dikte işleminin sonunu gösteren Completed olayını işleyeceğiz.

    StopAsync veya CancelAsync yöntemlerini çağırdığınızda oturum sona erer (sonraki bölümde açıklanmıştır). Oturum, bir hata oluştuğunda veya kullanıcı konuşmayı durdurduğunda da sona erebilir. Oturumun neden sona erdiğini belirlemek için olay bağımsız değişkeninin Status özelliğini denetleyin (SpeechRecognitionResultStatus).

    Burada, İşleyiciyi OnNavigatedTo sayfa olayına Tamamlandı sürekli tanıma olayı için kaydediyoruz.

speechRecognizer.ContinuousRecognitionSession.Completed +=
      ContinuousRecognitionSession_Completed;
  1. Olay işleyicisi, tanımanın başarılı olup olmadığını belirlemek için Status özelliğini denetler. Ayrıca kullanıcının konuşmayı durdurması olayını da ele alır. TimeoutExceeded genellikle başarılı bir tanıma olarak kabul edilir, bu da kullanıcının konuşmayı bitirdiği anlamına gelir. İyi bir deneyim için bu durumu kodunuzda işlemeniz gerekir.

    ResultGenerated olayının kullanıcı arabirimini doğrudan güncelleştiremeyen bir arka plan iş parçacığında tetiklendiğini unutmayın. Bir işleyicinin kullanıcı arabirimini ([Speech ve TTS örneği] gibi) güncelleştirmesi gerekiyorsa, dağıtıcının RunAsync yöntemi aracılığıyla ui iş parçacığına güncelleştirmeleri göndermeniz gerekir.

private async void ContinuousRecognitionSession_Completed(
      SpeechContinuousRecognitionSession sender,
      SpeechContinuousRecognitionCompletedEventArgs args)
      {
        if (args.Status != SpeechRecognitionResultStatus.Success)
        {
          if (args.Status == SpeechRecognitionResultStatus.TimeoutExceeded)
          {
            await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
              rootPage.NotifyUser(
                "Automatic Time Out of Dictation",
                NotifyType.StatusMessage);

              DictationButtonText.Text = " Continuous Recognition";
              dictationTextBox.Text = dictatedTextBuilder.ToString();
            });
          }
          else
          {
            await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
              rootPage.NotifyUser(
                "Continuous Recognition Completed: " + args.Status.ToString(),
                NotifyType.StatusMessage);

              DictationButtonText.Text = " Continuous Recognition";
            });
          }
        }
      }

Devam eden tanıma geri bildirimi sağlayın

İnsanlar sohbet ederken, söylenenleri tam olarak anlamak için genellikle bağlama güvenirler. Benzer şekilde, konuşma tanıma sistemi genellikle yüksek güvenilirlikli tanıma sonuçları sağlamak için bağlama ihtiyaç duyar. Örneğin, "weight" ve "wait" sözcükleri, çevresindeki kelimelerden daha fazla bağlam elde edilene kadar ayırt edilemez. Tanıyıcı, bir sözcüğün veya sözcüklerin doğru şekilde tanındığına dair belli bir güvene sahip olana kadar ResultGenerated olayını oluşturmayacaktır.

Bu durum, konuşmaya devam eden kullanıcı için ideal olmayan bir deneyim yaşanmasına yol açabilir çünkü tanıyıcı, ResultGenerated olayını tetiklemek için yeterli güvene sahip olmadıkça hiçbir sonuç sağlanmayacaktır.

Bu görünür yanıtsızlığı iyileştirmek için HypothesisGenerated olayını işleyin. Bu olay, tanıyıcı işlenen sözcük için yeni bir olası eşleşme kümesi oluşturduğunda tetiklenir. Olay bağımsız değişkeni, mevcut eşleşmeleri içeren bir Hypothesis özelliği sağlar. Konuşmaya devam ettikçe bunları kullanıcıya gösterin ve işlemenin hala etkin olduğundan emin olun. Güvenilirlik yüksek olduğunda ve bir tanıma sonucu belirlendikten sonra, ara Hipotez sonuçlarını ResultGenerated olayında sağlanan nihai Sonuçla değiştirin.

Burada, çıktı TextBox'ın şu anki değerine varsayımsal metni ve üç nokta işaretini ("…") ekliyoruz. Metin kutusunun içeriği, yeni hipotezler oluşturuldukçe ve nihai sonuçlar ResultGenerated olayından alınana kadar güncelleştirilir.

private async void SpeechRecognizer_HypothesisGenerated(
  SpeechRecognizer sender,
  SpeechRecognitionHypothesisGeneratedEventArgs args)
  {

    string hypothesis = args.Hypothesis.Text;
    string textboxContent = dictatedTextBuilder.ToString() + " " + hypothesis + " ...";

    await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
      dictationTextBox.Text = textboxContent;
      btnClearText.IsEnabled = true;
    });
  }

Tanımayı başlat ve durdur

Tanıma oturumuna başlamadan önce konuşma tanıma State özelliğinin değerini denetleyin. Konuşma tanıyıcı boşta durumunda olmalıdır.

Konuşma tanıyıcının durumunu denetledikten sonra, konuşma tanımanın ContinuousRecognitionSession özelliğininStartAsync yöntemini çağırarak oturumu başlatırız.

if (speechRecognizer.State == SpeechRecognizerState.Idle)
{
  await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}

Tanıma iki şekilde durdurulabilir:

  • StopAsync , bekleyen tüm tanıma olaylarının tamamlanmasını sağlar (ResultGenerated tüm bekleyen tanıma işlemleri tamamlanana kadar tetiklenmeye devam eder).
  • CancelAsync , tanıma oturumunu hemen sonlandırır ve bekleyen sonuçları atar.

Konuşma tanıyıcısının durumunu denetledikten sonra, konuşma tanımanın ContinuousRecognitionSession özelliğininCancelAsync yöntemini çağırarak oturumu durdururuz.

if (speechRecognizer.State != SpeechRecognizerState.Idle)
{
  await speechRecognizer.ContinuousRecognitionSession.CancelAsync();
}

Uyarı

CancelAsync çağrısının ardından ResultGenerated olayı oluşabilir.
Çoklu iş parçacığı kullanımı nedeniyle, CancelAsync çağrıldığında ResultGenerated olayı hala yığında kalabilir. Öyleyse, yine de ResultGenerated olayı tetikler.
Tanıma oturumunu iptal ederken herhangi bir özel alan ayarlarsanız, ResultGenerated işleyicisinde her zaman değerlerini onaylayın. Örneğin, oturumu iptal ederken bir alanı null olarak ayarlarsanız, işleyicinizde bu alanın başlatıldığını varsaymayın.

 

Örnekleri