Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Scopri come acquisire e riconoscere l'input vocale di dettatura continua di lunga durata nella tua app basata su SDK per app di Windows.
Importante
Il riconoscimento vocale richiede l'identità del pacchetto MSIX. Le Windows.Media.SpeechRecognition API sono disponibili solo quando l'app viene eseguita con l'identità del pacchetto (in pacchetto o in pacchetto con posizione esterna). Le app non in pacchetto non possono usare queste API.
API chiave
Overview
In Riconoscimento vocale si apprenderà come acquisire e riconoscere l'input vocale breve usando RecognizeAsync o RecognizeWithUIAsync. Per sessioni prolungate di riconoscimento vocale continuo, come la dettatura o le email, utilizzare la proprietà ContinuousRecognitionSession di un oggetto SpeechRecognizer per ottenere un oggetto SpeechContinuousRecognitionSession.
Annotazioni
Il supporto della lingua di dettatura dipende dal dispositivo in cui è in esecuzione l'app. Per PC e portatili, solo en-US viene riconosciuto per la dettatura, mentre Xbox può riconoscere tutte le lingue supportate dal riconoscimento vocale. Per altre informazioni, vedere Specificare la lingua del riconoscimento vocale.
Configurazione
L'app richiede gli oggetti seguenti per gestire una sessione di dettatura continua:
- Istanza di un
SpeechRecognizeroggetto . - Riferimento al dispatcher dell'interfaccia utente che consente di aggiornare l'interfaccia utente durante la dettatura.
- Un modo per tenere traccia delle parole accumulate pronunciate dall'utente.
Dichiara un'istanza SpeechRecognizer e un oggetto StringBuilder per accumulare i risultati del riconoscimento come campi della classe della pagina:
private SpeechRecognizer speechRecognizer;
private StringBuilder dictatedTextBuilder;
In WinUI 3 si usa DispatcherQueue per inviare gli aggiornamenti dell'interfaccia utente dai thread in background (non CoreDispatcher):
// Get the DispatcherQueue for the current thread (UI thread).
private Microsoft.UI.Dispatching.DispatcherQueue dispatcherQueue =
Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread();
Initialize
Durante l'inizializzazione, è possibile:
- Inizializzare il riconoscimento vocale.
- Compilare la grammatica di dettatura predefinita (o aggiungere vincoli personalizzati).
- Configura i listener per gli eventi di riconoscimento.
// Initialize the speech recognizer.
speechRecognizer = new SpeechRecognizer();
// Compile the default dictation grammar.
SpeechRecognitionCompilationResult result =
await speechRecognizer.CompileConstraintsAsync();
// Subscribe to continuous recognition events.
speechRecognizer.ContinuousRecognitionSession.ResultGenerated +=
ContinuousRecognitionSession_ResultGenerated;
speechRecognizer.ContinuousRecognitionSession.Completed +=
ContinuousRecognitionSession_Completed;
speechRecognizer.HypothesisGenerated +=
SpeechRecognizer_HypothesisGenerated;
dictatedTextBuilder = new StringBuilder();
Gestire gli eventi di riconoscimento
Risultato generato
L'evento ResultGenerated viene generato quando l'utente parla. Il riconoscitore trasmette periodicamente un segmento di input vocale. Controllare la Confidence proprietà per decidere se accettare il risultato.
Poiché questo evento viene generato in un thread in background, usare DispatcherQueue.TryEnqueue per aggiornare l'interfaccia utente:
private void ContinuousRecognitionSession_ResultGenerated(
SpeechContinuousRecognitionSession sender,
SpeechContinuousRecognitionResultGeneratedEventArgs args)
{
if (args.Result.Confidence == SpeechRecognitionConfidence.Medium ||
args.Result.Confidence == SpeechRecognitionConfidence.High)
{
dictatedTextBuilder.Append(args.Result.Text + " ");
dispatcherQueue.TryEnqueue(() =>
{
dictationTextBox.Text = dictatedTextBuilder.ToString();
btnClearText.IsEnabled = true;
});
}
}
Finito
L'evento Completed indica che la sessione di riconoscimento continuo è terminata. La sessione termina quando si chiama StopAsync o CancelAsync, o quando si verifica un errore o quando l'utente ha smesso di parlare.
private void ContinuousRecognitionSession_Completed(
SpeechContinuousRecognitionSession sender,
SpeechContinuousRecognitionCompletedEventArgs args)
{
if (args.Status != SpeechRecognitionResultStatus.Success)
{
dispatcherQueue.TryEnqueue(() =>
{
if (args.Status == SpeechRecognitionResultStatus.TimeoutExceeded)
{
dictationTextBox.Text = dictatedTextBuilder.ToString();
}
});
}
}
IpotesiGenerata
Gestire l'evento HypothesisGenerated per visualizzare i risultati provvisori mentre lo strumento di riconoscimento è ancora in fase di elaborazione. Ciò migliora la velocità di risposta fornendo all'utente commenti e suggerimenti prima che sia disponibile un risultato finale:
private void SpeechRecognizer_HypothesisGenerated(
SpeechRecognizer sender,
SpeechRecognitionHypothesisGeneratedEventArgs args)
{
string hypothesis = args.Hypothesis.Text;
string textboxContent = dictatedTextBuilder.ToString() + " " + hypothesis + " ...";
dispatcherQueue.TryEnqueue(() =>
{
dictationTextBox.Text = textboxContent;
btnClearText.IsEnabled = true;
});
}
Avvia e ferma il riconoscimento
Controllare lo stato del riconoscitore prima di avviare o arrestare una sessione:
// Start continuous recognition.
if (speechRecognizer.State == SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}
// Stop continuous recognition (lets pending events complete).
if (speechRecognizer.State != SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.StopAsync();
}
Per annullare immediatamente ed eliminare i risultati in sospeso, chiamare CancelAsync invece di StopAsync.
Annotazioni
Un evento ResultGenerated potrebbe attivarsi dopo aver chiamato CancelAsync a causa del multithreading. Se si impostano campi privati durante l'annullamento della sessione di riconoscimento, convalidare sempre i relativi valori nel ResultGenerated gestore.