Bagikan melalui


Dikte berkelanjutan

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

API Penting: SpeechContinuousRecognitionSession, ContinuousRecognitionSession

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

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

Catatan

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

Siapkan

Aplikasi Anda memerlukan beberapa objek untuk mengelola sesi dikte berkelanjutan:

  • Instans 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 berkelanjutan bertahan di luar satu halaman Extensible Application Markup Language (XAML).

private SpeechRecognizer speechRecognizer;

Selama dikte, pengenal mengangkat 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 menyatakan 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 diangkat oleh pengenal ucapan. Peristiwa ini memberikan hasil pengenalan untuk 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.
  • Kompilasi tata bahasa dikte bawaan. Catatan Pengenalan ucapan memerlukan setidaknya satu batasan untuk menentukan kosakata yang dapat dikenali. Jika tidak ada batasan yang ditentukan, tata bahasa dikte yang telah ditentukan akan digunakan. Lihat Pengenalan ucapan.
  • Siapkan pendengar peristiwa untuk peristiwa pengenalan.

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

  1. Karena peristiwa yang diangkat oleh pengenal ucapan terjadi pada utas latar belakang, buat referensi ke dispatcher untuk pembaruan pada utas 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 memanggil CompileConstraintsAsync segera 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 menangkap 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 objek 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 sepotong input ucapan. Anda harus memeriksa input ucapan, menggunakan properti Hasil dari argumen peristiwa, dan mengambil tindakan yang sesuai di penanganan aktivitas, seperti menambahkan teks ke objek StringBuilder.

Sebagai instans SpeechRecognitionResult, properti Hasil berguna untuk menentukan apakah Anda ingin menerima input ucapan. 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 Keyakinan . Jika nilai Keyakinan sedang atau lebih baik, kami menambahkan teks ke StringBuilder. Kami juga memperbarui UI saat mengumpulkan input.

    Perhatikan bahwa peristiwa ResultGenerated dinaikkan pada utas latar belakang yang tidak dapat memperbarui UI secara langsung. Jika handler perlu memperbarui UI (seperti [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 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 berkelanjutan yang selesai di peristiwa halaman OnNavigatedTo .

speechRecognizer.ContinuousRecognitionSession.Completed +=
      ContinuousRecognitionSession_Completed;
  1. Penanganan aktivitas 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 itu berarti pengguna telah selesai berbicara. Anda harus menangani kasus ini dalam kode Anda untuk pengalaman yang baik.

    Perhatikan bahwa peristiwa ResultGenerated dinaikkan pada utas latar belakang yang tidak dapat memperbarui UI secara langsung. Jika handler perlu memperbarui UI (seperti [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 keyakinan tinggi. Misalnya, dengan sendirinya, kata-kata "berat" dan "tunggu" tidak dapat dibedakan sampai lebih banyak konteks dapat dipancarkan dari kata-kata di sekitarnya. Sampai pengenal memiliki beberapa keyakinan bahwa kata, atau kata, telah dikenali dengan benar, itu tidak akan menaikkan peristiwa ResultGenerated .

Ini dapat menghasilkan pengalaman yang kurang ideal bagi pengguna karena mereka terus berbicara dan tidak ada hasil yang diberikan sampai pengenal memiliki keyakinan yang cukup tinggi untuk meningkatkan peristiwa ResultGenerated .

Tangani peristiwa HypothesisGenerated untuk meningkatkan kurangnya responsivitas yang jelas ini. Peristiwa ini dinaikkan setiap kali recognizer menghasilkan serangkaian potensi kecocokan baru untuk kata yang sedang diproses. Argumen peristiwa menyediakan properti Hipotesis yang berisi kecocokan saat ini. Tampilkan 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 TextBox output saat ini. 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;
    });
  }

Memulai dan menghentikan pengenalan

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

Setelah memeriksa status pengenal ucapan, kita 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 sampai 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();
}

Catatan

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

 

Sampel