Bagikan melalui


Dikte berkelanjutan

Pelajari cara menangkap dan mengenali input ucapan dikte bentuk panjang yang berkelanjutan.

API penting: SpeechContinuousRecognitionSession, ContinuousRecognitionSession

Dalam pengenalan Speech, Anda mempelajari cara mengambil dan mengenali input ucapan yang relatif singkat menggunakan RecognizeAsync atau RecognizeWithUIAsync metode SpeechRecognizer objek, misalnya, saat membuat pesan layanan pesan singkat (SMS) atau saat mengajukan pertanyaan.

Untuk sesi pengenalan ucapan berkelanjutan yang lebih lama, seperti dikte atau email, gunakan properti ContinuousRecognitionSession properti SpeechRecognizer untuk mendapatkan objek SpeechContinuousRecognitionSession.

Nota

Dukungan bahasa dikte bergantung pada perangkat tempat aplikasi Anda berjalan. Untuk PC dan laptop, hanya en-US yang dikenali, sementara Xbox dapat mengenali semua bahasa yang didukung oleh pengenalan ucapan. Untuk informasi selengkapnya, lihat Menentukan bahasa pengenal ucapan.

Pengaturan

Aplikasi Anda memerlukan beberapa objek untuk mengelola sesi dikte berkelanjutan:

  • Sebuah instans dari objek SpeechRecognizer.
  • Referensi ke dispatcher UI untuk memperbarui UI selama dikte.
  • Cara untuk melacak akumulasi kata yang diucapkan oleh pengguna.

Di sini, kami mendeklarasikan instans SpeechRecognizer sebagai bidang privat dari kelas code-behind. Aplikasi Anda perlu menyimpan referensi di tempat lain jika Anda ingin dikte kontinu berlangsung di luar satu halaman Extensible Application Markup Language (XAML).

private SpeechRecognizer speechRecognizer;

Selama dikte, pengenal menaikkan peristiwa dari utas latar belakang. Karena utas latar belakang tidak dapat langsung memperbarui UI di XAML, aplikasi Anda harus menggunakan dispatcher untuk memperbarui UI sebagai respons terhadap peristiwa pengenalan.

Di sini, kami mendeklarasikan bidang privat yang akan diinisialisasi nanti dengan dispatcher UI.

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

Untuk melacak apa yang dikatakan pengguna, Anda perlu menangani peristiwa pengenalan yang ditimbulkan oleh pengenal ucapan. Peristiwa ini memberikan hasil pengenalan dari potongan ucapan pengguna.

Di sini, kami menggunakan objek StringBuilder untuk menyimpan semua hasil pengenalan yang diperoleh selama sesi. Hasil baru ditambahkan ke StringBuilder saat diproses.

private StringBuilder dictatedTextBuilder;

Inisialisasi

Selama inisialisasi pengenalan ucapan berkelanjutan, Anda harus:

  • Ambil dispatcher untuk utas UI jika Anda memperbarui UI aplikasi Anda di penanganan aktivitas pengenalan berkelanjutan.
  • Menginisialisasi pengenal ucapan.
  • Kompil tata bahasa dikte bawaan. Nota Pengenalan ucapan memerlukan setidaknya satu batasan untuk menentukan kosakata yang dapat dikenali. Jika tidak ada batasan yang ditentukan, tata bahasa dikte yang telah ditentukan digunakan. Lihat Pengenalan ucapan.
  • Siapkan pendengar acara untuk acara pengenalan.

Dalam contoh ini, kami menginisialisasi pengenalan ucapan di peristiwa halaman OnNavigatedTo .

  1. Karena peristiwa yang dihasilkan oleh pengenal ucapan terjadi pada utas latar belakang, buat referensi ke dispatcher untuk pembaruan pada thread UI. OnNavigatedTo selalu dipanggil pada utas UI.
this.dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
  1. Kami kemudian menginisialisasi instans SpeechRecognizer.
this.speechRecognizer = new SpeechRecognizer();
  1. Kami kemudian menambahkan dan mengkompilasi tata bahasa yang mendefinisikan semua kata dan frasa yang dapat dikenali oleh SpeechRecognizer.

    Jika Anda tidak menentukan tata bahasa secara eksplisit, tata bahasa dikte yang telah ditentukan sebelumnya digunakan secara default. Biasanya, tata bahasa default adalah yang terbaik untuk dikte umum.

    Di sini, kami segera memanggil CompileConstraintsAsync tanpa menambahkan tata bahasa.

SpeechRecognitionCompilationResult result =
      await speechRecognizer.CompileConstraintsAsync();

Menangani peristiwa pengenalan

Anda dapat mengambil satu ucapan atau frasa singkat dengan memanggil RecognizeAsync atau RecognizeWithUIAsync.

Namun, untuk mengambil sesi pengenalan berkelanjutan yang lebih lama, kami menentukan pendengar peristiwa untuk dijalankan di latar belakang saat pengguna berbicara dan menentukan penangan untuk membangun string dikte.

Kami kemudian menggunakan properti ContinuousRecognitionSession dari recognizer kami untuk mendapatkan SpeechContinuousRecognitionSession yang menyediakan metode dan peristiwa untuk mengelola sesi pengenalan berkelanjutan.

Dua peristiwa khususnya sangat penting:

  • ResultGenerated, yang terjadi ketika recognizer telah menghasilkan beberapa hasil.
  • Selesai, yang terjadi ketika sesi pengenalan berkelanjutan telah berakhir.

Peristiwa ResultGenerated dimunculkan saat pengguna berbicara. Pengenal terus mendengarkan pengguna dan secara berkala memunculkan peristiwa yang melewati potongan input ucapan. Anda harus memeriksa input ucapan, menggunakan properti Hasil argumen peristiwa, dan mengambil tindakan yang sesuai di penanganan aktivitas, seperti menambahkan teks ke objek StringBuilder.

Sebagai instans SpeechRecognitionResult, properti Result berguna untuk menentukan apakah Anda ingin menerima masukan suara. SpeechRecognitionResult menyediakan dua properti untuk ini:

  • Status menunjukkan apakah pengenalan berhasil. Pengenalan dapat gagal karena berbagai alasan.
  • Keyakinan menunjukkan keyakinan relatif bahwa pengenal memahami kata-kata yang benar.

Berikut adalah langkah-langkah dasar untuk mendukung pengenalan berkelanjutan:

  1. Di sini, kami mendaftarkan handler untuk peristiwa pengenalan berkelanjutan ResultGenerated di peristiwa halaman OnNavigatedTo .
speechRecognizer.ContinuousRecognitionSession.ResultGenerated +=
        ContinuousRecognitionSession_ResultGenerated;
  1. Kami kemudian memeriksa properti Confidence . Jika nilai Keyakinan Sedang atau lebih baik, kami menambahkan teks ke StringBuilder. Kami juga memperbarui UI saat mengumpulkan input.

    Perhatikan bahwa peristiwa ResultGenerated dipicu pada thread latar belakang yang tidak dapat memperbarui UI langsung. Jika handler perlu memperbarui UI (seperti yang dilakukan [sampel Ucapan dan TTS] ), Anda harus mengirimkan pembaruan ke utas UI melalui metode RunAsync dari dispatcher.

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. Kami kemudian menangani peristiwa Selesai, yang menunjukkan akhir dari dikte berkelanjutan.

    Sesi berakhir saat Anda memanggil metode StopAsync atau CancelAsync (dijelaskan bagian berikutnya). Sesi juga dapat berakhir ketika kesalahan terjadi, atau ketika pengguna telah berhenti berbicara. Periksa properti Status argumen peristiwa untuk menentukan mengapa sesi berakhir (SpeechRecognitionResultStatus).

    Di sini, kami mendaftarkan handler untuk peristiwa pengenalan kontinu Completed di peristiwa halaman OnNavigatedTo.

speechRecognizer.ContinuousRecognitionSession.Completed +=
      ContinuousRecognitionSession_Completed;
  1. Pengendali peristiwa memeriksa properti Status untuk menentukan apakah pengenalan berhasil. Ini juga menangani kasus di mana pengguna telah berhenti berbicara. Seringkali, TimeoutExceeded dianggap sebagai pengenalan yang berhasil karena berarti pengguna telah selesai berbicara. Anda harus menangani kasus ini dalam kode Anda untuk pengalaman pengguna yang baik.

    Perhatikan bahwa peristiwa ResultGenerated dipicu pada thread latar belakang yang tidak dapat memperbarui UI langsung. Jika handler perlu memperbarui UI (seperti yang dilakukan [sampel Ucapan dan TTS] ), Anda harus mengirimkan pembaruan ke utas UI melalui metode RunAsync dari dispatcher.

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

Berikan umpan balik pengenalan yang sedang berlangsung

Ketika orang berbicara, mereka sering mengandalkan konteks untuk sepenuhnya memahami apa yang dikatakan. Demikian pula, pengenal ucapan sering membutuhkan konteks untuk memberikan hasil pengenalan dengan tingkat kepercayaan tinggi. Misalnya, secara sendirian, kata-kata "berat" dan "tunggu" tidak dapat dibedakan sampai lebih banyak konteks dapat diperoleh dari kata-kata di sekitarnya. Sampai pengidentifikasi memiliki keyakinan bahwa sebuah kata, atau kata-kata, telah dikenali dengan benar, itu tidak akan memicu peristiwa ResultGenerated.

Ini dapat mengakibatkan pengalaman yang tidak ideal bagi pengguna karena mereka terus berbicara dan tidak ada hasil yang disediakan sampai pengenal memiliki keyakinan yang cukup tinggi untuk memicu peristiwa ResultGenerated.

Menangani peristiwa HypothesisGenerated untuk mengatasi kurangnya responsivitas yang jelas ini. Peristiwa ini terjadi setiap kali pengenal menghasilkan serangkaian kecocokan potensial baru untuk kata yang sedang diproses. Argumen peristiwa menyediakan properti Hipotesis yang berisi kecocokan saat ini. Perlihatkan ini kepada pengguna saat mereka terus berbicara dan meyakinkan mereka bahwa pemrosesan masih aktif. Setelah keyakinan tinggi dan hasil pengenalan telah ditentukan, ganti hasil Hipotesis sementara dengan Hasil akhir yang disediakan dalam peristiwa ResultGenerated .

Di sini, kami menambahkan teks hipotetis dan elipsis ("... ") ke nilai output saat ini TextBox. Konten kotak teks diperbarui saat hipotesis baru dihasilkan dan sampai hasil akhir diperoleh dari peristiwa ResultGenerated .

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

Mulai dan hentikan pengenalan

Sebelum memulai sesi pengenalan, periksa nilai properti Status pengenal ucapan. Pengenal ucapan harus dalam status Idle.

Setelah memeriksa status pengenal ucapan, kami memulai sesi dengan memanggil metode StartAsync dari properti ContinuousRecognitionSession pengenal ucapan.

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

Pengenalan dapat dihentikan dengan dua cara:

  • StopAsync memungkinkan setiap peristiwa pengenalan yang tertunda selesai (ResultGenerated terus dinaikkan hingga semua operasi pengenalan yang tertunda selesai).
  • CancelAsync segera mengakhiri sesi pengenalan dan membuang hasil yang tertunda.

Setelah memeriksa status pengenal ucapan, kami menghentikan sesi dengan memanggil metode CancelAsync dari properti ContinuousRecognitionSession pengenal ucapan.

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

Nota

Kejadian ResultGenerated dapat terjadi setelah panggilan ke CancelAsync.
Karena multithreading, event ResultGenerated mungkin masih berada di tumpukan saat CancelAsync dipanggil. Jika demikian, peristiwa ResultGenerated masih aktif.
Jika Anda mengatur bidang privat saat membatalkan sesi pengenalan, selalu konfirmasi nilainya di handler ResultGenerated . Misalnya, jangan asumsikan bidang diinisialisasi di handler Anda jika Anda mengaturnya menjadi null saat Anda membatalkan sesi.

 

Sampel