Dettatura continuaContinuous dictation

Scopri come acquisire e riconoscere l'input vocale con dettatura continua in formato lungo.Learn how to capture and recognize long-form, continuous dictation speech input.

API importanti : SpeechContinuousRecognitionSession, ContinuousRecognitionSessionImportant APIs : SpeechContinuousRecognitionSession, ContinuousRecognitionSession

In Riconoscimento vocale hai imparato ad acquisire e riconoscere input vocali relativamente brevi usando i metodi RecognizeAsync o RecognizeWithUIAsync di un oggetto SpeechRecognizer, ad esempio, quando componi un breve SMS o poni una domanda.In Speech recognition, you learned how to capture and recognize relatively short speech input using the RecognizeAsync or RecognizeWithUIAsync methods of a SpeechRecognizer object, for example, when composing a short message service (SMS) message or when asking a question.

Per sessioni più lunghe di riconoscimento vocale continuo, ad esempio la dettatura o l'e-mail, usa la proprietà ContinuousRecognitionSession di SpeechRecognizer per ottenere un oggetto SpeechContinuousRecognitionSession.For longer, continuous speech recognition sessions, such as dictation or email, use the ContinuousRecognitionSession property of a SpeechRecognizer to obtain a SpeechContinuousRecognitionSession object.

Nota

Il supporto del linguaggio di dettatura dipende dal dispositivo in cui è in esecuzione l'app.Dictation language support depends on the device where your app is running. Per PC e portatili viene riconosciuta solo l'it-it, mentre i dispositivi Xbox e i telefoni possono riconoscere tutte le lingue supportate dal riconoscimento vocale.For PCs and laptops, only en-US is recognized, while Xbox and phones can recognize all languages supported by speech recognition. Per altre informazioni, vedere specificare la lingua del riconoscimento vocale.For more info, see Specify the speech recognizer language.

ConfigurareSet up

Alla tua app servono alcuni oggetti per gestire una sessione di dettatura continua:Your app needs a few objects to manage a continuous dictation session:

  • Istanza di un oggetto SpeechRecognizer .An instance of a SpeechRecognizer object.
  • Un riferimento a un dispatcher dell'interfaccia utente per aggiornare l'interfaccia utente durante la dettatura.A reference to a UI dispatcher to update the UI during dictation.
  • Un modo per tenere traccia di tutte le parole pronunciate dall'utente.A way to track the accumulated words spoken by the user.

Qui dichiariamo un'istanza di SpeechRecognizer come campo privato della classe code-behind.Here, we declare a SpeechRecognizer instance as a private field of the code-behind class. L'app deve archiviare un riferimento da un'altra parte se vuoi che la dettatura continua prosegua per più di una pagina XAML (Extensible Application Markup Language).Your app needs to store a reference elsewhere if you want continuous dictation to persist beyond a single Extensible Application Markup Language (XAML) page.

private SpeechRecognizer speechRecognizer;

Durante la dettatura, lo strumento di riconoscimento genera eventi da un thread in background.During dictation, the recognizer raises events from a background thread. Poiché un thread in background non può aggiornare direttamente l'interfaccia utente in XAML, l'app deve usare un dispatcher per aggiornare l'interfaccia utente in risposta a eventi di riconoscimento.Because a background thread cannot directly update the UI in XAML, your app must use a dispatcher to update the UI in response to recognition events.

Qui dichiariamo un campo privato che verrà inizializzato più avanti con il dispatcher dell'interfaccia utente.Here, we declare a private field that will be initialized later with the UI dispatcher.

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

Per tenere traccia di quello che l'utente sta dicendo, devi gestire gli eventi di riconoscimento generati dallo strumento di riconoscimento vocale.To track what the user is saying, you need to handle recognition events raised by the speech recognizer. Questi eventi forniscono i risultati del riconoscimento dei blocchi di enunciati dell'utente.These events provide the recognition results for chunks of user utterances.

Qui usiamo un oggetto StringBuilder per includere tutti i risultati del riconoscimento ottenuti durante la sessione.Here, we use a StringBuilder object to hold all the recognition results obtained during the session. I nuovi risultati vengono aggiunti a StringBuilder non appena vengono elaborati.New results are appended to the StringBuilder as they are processed.

private StringBuilder dictatedTextBuilder;

InizializzazioneInitialization

Durante l'inizializzazione del riconoscimento vocale continuo, devi:During the initialization of continuous speech recognition, you must:

  • Recuperare il dispatcher per il thread dell'interfaccia utente se aggiorni l'interfaccia utente della tua app nei gestori eventi di riconoscimento continuo.Fetch the dispatcher for the UI thread if you update the UI of your app in the continuous recognition event handlers.
  • Inizializzare il riconoscimento vocale.Initialize the speech recognizer.
  • Compilare la grammatica per la dettatura predefinita.Compile the built-in dictation grammar. Nota Il riconoscimento vocale richiede almeno un vincolo per definire un vocabolario riconoscibile.Note Speech recognition requires at least one constraint to define a recognizable vocabulary. Se non si specifica alcun vincolo, viene usata una grammatica per la dettatura predefinita.If no constraint is specified, a predefined dictation grammar is used. Vedi Riconoscimento vocale.See Speech recognition.
  • Configurare i listener di eventi per gli eventi di riconoscimento.Set up the event listeners for recognition events.

In questo esempio si inizializza il riconoscimento vocale nell'evento della pagina OnNavigatedTo .In this example, we initialize speech recognition in the OnNavigatedTo page event.

  1. Poiché gli eventi generati dallo strumento di riconoscimento vocale si verificano in un thread in background, crea un riferimento al dispatcher per gli aggiornamenti del thread dell'interfaccia utente.Because events raised by the speech recognizer occur on a background thread, create a reference to the dispatcher for updates to the UI thread. OnNavigatedTo viene sempre richiamato sul thread UI.OnNavigatedTo is always invoked on the UI thread.
this.dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
  1. Inizializziamo quindi l'istanza di SpeechRecognizer.We then initialize the SpeechRecognizer instance.
this.speechRecognizer = new SpeechRecognizer();
  1. Viene quindi aggiunta e compilata la grammatica che definisce tutte le parole e le frasi che possono essere riconosciute dal SpeechRecognizer.We then add and compile the grammar that defines all of the words and phrases that can be recognized by the SpeechRecognizer.

    Per impostazione predefinita, se non specifichi esplicitamente una grammatica, viene usata una grammatica per la dettatura predefinita.If you don't specify a grammar explicitly, a predefined dictation grammar is used by default. In genere, la grammatica predefinita è ideale per la dettatura generale.Typically, the default grammar is best for general dictation.

    Qui viene chiamato immediatamente CompileConstraintsAsync senza aggiungere una grammatica.Here, we call CompileConstraintsAsync immediately without adding a grammar.

SpeechRecognitionCompilationResult result =
      await speechRecognizer.CompileConstraintsAsync();

Gestire gli eventi di riconoscimentoHandle recognition events

È possibile acquisire una singola frase o breve espressione chiamando RecognizeAsync o RecognizeWithUIAsync.You can capture a single, brief utterance or phrase by calling RecognizeAsync or RecognizeWithUIAsync.

Per acquisire una sessione di riconoscimento continuo più lunga, tuttavia, specifichiamo che i listener di eventi devono essere eseguiti in background mentre l'utente parla e definiamo i gestori per compilare la stringa di dettatura.However, to capture a longer, continuous recognition session, we specify event listeners to run in the background as the user speaks and define handlers to build the dictation string.

Si usa quindi la proprietà ContinuousRecognitionSession del riconoscimento per ottenere un oggetto SpeechContinuousRecognitionSession che fornisce metodi ed eventi per la gestione di una sessione di riconoscimento continuo.We then use the ContinuousRecognitionSession property of our recognizer to obtain a SpeechContinuousRecognitionSession object that provides methods and events for managing a continuous recognition session.

In particolare due eventi sono critici:Two events in particular are critical:

  • ResultGenerated, che si verifica quando il riconoscimento genera risultati.ResultGenerated, which occurs when the recognizer has generated some results.
  • Completed, che si verifica quando termina la sessione di riconoscimento continuo.Completed, which occurs when the continuous recognition session has ended.

L'evento ResultGenerated viene generato quando l'utente parla.The ResultGenerated event is raised as the user speaks. Lo strumento di riconoscimento rimane sempre in ascolto dell'utente e genera regolarmente un evento che passa un blocco di input vocale.The recognizer continuously listens to the user and periodically raises an event that passes a chunk of speech input. È necessario esaminare l'input vocale, usando la proprietà result dell'argomento dell'evento e intraprendere l'azione appropriata nel gestore eventi, ad esempio aggiungendo il testo a un oggetto StringBuilder.You must examine the speech input, using the Result property of the event argument, and take appropriate action in the event handler, such as appending the text to a StringBuilder object.

Come istanza di SpeechRecognitionResult, la proprietà result è utile per determinare se si desidera accettare l'input vocale.As an instance of SpeechRecognitionResult, the Result property is useful for determining whether you want to accept the speech input. Un SpeechRecognitionResult fornisce due proprietà:A SpeechRecognitionResult provides two properties for this:

  • Stato indica se il riconoscimento è stato completato correttamente.Status indicates whether the recognition was successful. Il riconoscimento può non riuscire per diversi motivi.Recognition can fail for a variety of reasons.
  • Confidenza indica la probabilità relativa che il riconoscimento abbia compreso le parole corrette.Confidence indicates the relative confidence that the recognizer understood the correct words.

Ecco i passaggi di base per il supporto del riconoscimento continuo:Here are the basic steps for supporting continuous recognition:

  1. Qui viene registrato il gestore per l'evento di riconoscimento continuo ResultGenerated nell'evento pagina OnNavigatedTo .Here, we register the handler for the ResultGenerated continuous recognition event in the OnNavigatedTo page event.
speechRecognizer.ContinuousRecognitionSession.ResultGenerated +=
        ContinuousRecognitionSession_ResultGenerated;
  1. Controlliamo quindi la proprietà Confidence.We then check the Confidence property. Se il valore di confidenza è medio o superiore, il testo viene aggiunto a StringBuilder.If the value of Confidence is Medium or better, we append the text to the StringBuilder. Aggiorniamo inoltre l'interfaccia utente mentre raccogliamo l'input.We also update the UI as we collect input.

    Si noti che l'evento ResultGenerated viene generato in un thread in background che non può aggiornare direttamente l'interfaccia utente.Note the ResultGenerated event is raised on a background thread that cannot update the UI directly. Se un gestore deve aggiornare l'interfaccia utente (come [ avviene nell'esempio di riconoscimento vocale e TTS ] ), è necessario inviare gli aggiornamenti al thread dell'interfaccia utente tramite il metodo RunAsync del dispatcher.If a handler needs to update the UI (as the [Speech and TTS sample] does), you must dispatch the updates to the UI thread through the RunAsync method of the 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. Viene quindi gestito l'evento Completed , che indica la fine della dettatura continua.We then handle the Completed event, which indicates the end of continuous dictation.

    La sessione finisce quando chiami i metodi StopAsync o CancelAsync (descritti nella prossima sezione).The session ends when you call the StopAsync or CancelAsync methods (described the next section). La sessione può terminare anche quando si verifica un errore o quando l'utente smette di parlare.The session can also end when an error occurs, or when the user has stopped speaking. Controlla la proprietà Status dell'argomento dell'evento per determinare perché la sessione è terminata ( SpeechRecognitionResultStatus).Check the Status property of the event argument to determine why the session ended ( SpeechRecognitionResultStatus).

    Qui registriamo il gestore per l'evento di riconoscimento continuo Completed nell'evento della pagina OnNavigatedTo.Here, we register the handler for the Completed continuous recognition event in the OnNavigatedTo page event.

speechRecognizer.ContinuousRecognitionSession.Completed +=
      ContinuousRecognitionSession_Completed;
  1. Il gestore eventi controlla la proprietà Status per determinare se il riconoscimento è riuscito.The event handler checks the Status property to determine whether the recognition was successful. Gestisce anche il caso in cui l'utente ha smesso di parlare.It also handles the case where the user has stopped speaking. Spesso, un TimeoutExceeded è considerato un riconoscimento riuscito perché significa che l'utente ha terminato di parlare.Often, a TimeoutExceeded is considered successful recognition as it means the user has finished speaking. Per garantire un'esperienza ottimale, dovresti gestire questo caso nel tuo codice.You should handle this case in your code for a good experience.

    Si noti che l'evento ResultGenerated viene generato in un thread in background che non può aggiornare direttamente l'interfaccia utente.Note the ResultGenerated event is raised on a background thread that cannot update the UI directly. Se un gestore deve aggiornare l'interfaccia utente (come [ avviene nell'esempio di riconoscimento vocale e TTS ] ), è necessario inviare gli aggiornamenti al thread dell'interfaccia utente tramite il metodo RunAsync del dispatcher.If a handler needs to update the UI (as the [Speech and TTS sample] does), you must dispatch the updates to the UI thread through the RunAsync method of the 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";
            });
          }
        }
      }

Fornire un feedback sul riconoscimento in corsoProvide ongoing recognition feedback

Quando le persone conversano, spesso si basano sul contesto per comprendere del tutto quello che viene detto.When people converse, they often rely on context to fully understand what is being said. Allo stesso modo, lo strumento di riconoscimento vocale spesso ha bisogno del contesto per fornire risultati relativi al riconoscimento con una probabilità alta.Similarly, the speech recognizer often needs context to provide high-confidence recognition results. Ad esempio le parole "la" e "là" non sono distinguibili se non si raccoglie più contesto dalle parole che le precedono e che le seguono.For example, by themselves, the words "weight" and "wait" are indistinguishable until more context can be gleaned from surrounding words. Fino a quando il riconoscimento non è sicuro che una parola, o parole, sia stata riconosciuta correttamente, non genererà l'evento ResultGenerated .Until the recognizer has some confidence that a word, or words, have been recognized correctly, it will not raise the ResultGenerated event.

Questo può comportare un'esperienza meno significativa per l'utente mentre continua a parlare e nessun risultato viene fornito finché il riconoscimento non dispone di una sicurezza sufficientemente elevata per generare l'evento ResultGenerated .This can result in a less than ideal experience for the user as they continue speaking and no results are provided until the recognizer has high enough confidence to raise the ResultGenerated event.

Gestire l'evento HypothesisGenerated per migliorare questa mancanza apparente di velocità di risposta.Handle the HypothesisGenerated event to improve this apparent lack of responsiveness. Questo evento viene generato ogni volta che lo strumento di riconoscimento genera un nuovo set di potenziali corrispondenze per la parola da elaborare.This event is raised whenever the recognizer generates a new set of potential matches for the word being processed. L'argomento dell'evento fornisce una proprietà di ipotesi che contiene le corrispondenze correnti.The event argument provides an Hypothesis property that contains the current matches. Mostrale all'utente mentre continua a parlare per rassicurarlo che l'elaborazione è ancora attiva.Show these to the user as they continue speaking and reassure them that processing is still active. Se il livello di probabilità è alto e viene determinato un risultato per il riconoscimento, sostituisci i risultati provvisori di Hypothesis con l'oggetto Result finale fornito nell'evento ResultGenerated.Once confidence is high and a recognition result has been determined, replace the interim Hypothesis results with the final Result provided in the ResultGenerated event.

Qui viene aggiunto il testo ipotetico e i puntini di sospensione ("...") al valore corrente della caselladi testo output.Here, we append the hypothetical text and an ellipsis ("…") to the current value of the output TextBox. Il contenuto della casella di testo viene aggiornato quando vengono generate nuove ipotesi e fino a quando non vengono ottenuti i risultati finali dall'evento ResultGenerated .The contents of the text box are updated as new hypotheses are generated and until the final results are obtained from the ResultGenerated event.

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

Avviare e interrompere il riconoscimentoStart and stop recognition

Prima di avviare una sessione di riconoscimento, controlla il valore della proprietà State dello strumento di riconoscimento vocale.Before starting a recognition session, check the value of the speech recognizer State property. Il riconoscimento vocale deve trovarsi in uno stato inattivo .The speech recognizer must be in an Idle state.

Dopo aver verificato lo stato del riconoscimento vocale, avviare la sessione chiamando il metodo startAsync della proprietà ContinuousRecognitionSession del riconoscimento vocale.After checking the state of the speech recognizer, we start the session by calling the StartAsync method of the speech recognizer's ContinuousRecognitionSession property.

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

Il riconoscimento può essere interrotto in due modi:Recognition can be stopped in two ways:

  • StopAsync permette di completare gli eventi di riconoscimento in sospeso ( ResultGenerated continua a essere generato fino al termine di tutte le operazioni di riconoscimento in sospeso).StopAsync lets any pending recognition events complete ( ResultGenerated continues to be raised until all pending recognition operations are complete).
  • CancelAsync termina immediatamente la sessione di riconoscimento ed elimina eventuali risultati in sospeso.CancelAsync terminates the recognition session immediately and discards any pending results.

Dopo aver controllato lo stato dello strumento di riconoscimento vocale, interrompiamo la sessione chiamando il metodo CancelAsync della proprietà ContinuousRecognitionSession dello strumento di riconoscimento vocale.After checking the state of the speech recognizer, we stop the session by calling the CancelAsync method of the speech recognizer's ContinuousRecognitionSession property.

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

Nota

Dopo una chiamata a CancelAsync può verificarsi un evento ResultGenerated.A ResultGenerated event can occur after a call to CancelAsync.
A causa del multithreading, quando viene chiamato CancelAsync, è possibile che nello stack rimanga un evento ResultGenerated.Because of multithreading, a ResultGenerated event might still remain on the stack when CancelAsync is called. In questo caso, viene generato ancora l'evento ResultGenerated .If so, the ResultGenerated event still fires.
Se si impostano campi privati quando si annulla la sessione di riconoscimento, verificare sempre i relativi valori nel gestore ResultGenerated .If you set any private fields when canceling the recognition session, always confirm their values in the ResultGenerated handler. Ad esempio, non dare per scontato che un campo venga inizializzato nel gestore se lo imposti su null quando annulli la sessione.For example, don't assume a field is initialized in your handler if you set them to null when you cancel the session.

EsempiSamples