Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Meer informatie over het vastleggen en herkennen van langlopende spraakinvoer.
Belangrijke API's: SpeechContinuousRecognitionSession, ContinuousRecognitionSession
In Spraakherkenning hebt u geleerd hoe u relatief korte spraakinvoer kunt vastleggen en herkennen met behulp van de methoden RecognizeAsync of RecognizeWithUIAsync van een SpeechRecognizer-object , bijvoorbeeld bij het opstellen van een sms-bericht (short message service) of bij het stellen van een vraag.
Gebruik voor langere, continue spraakherkenningssessies, zoals dicteren of e-mail, de eigenschap ContinuousRecognitionSession van een SpeechRecognizer om een SpeechContinuousRecognitionSession-object te verkrijgen.
Opmerking
De taalondersteuning voor dicteren is afhankelijk van het apparaat waarop uw app wordt uitgevoerd. Voor pc's en laptops wordt alleen en-US herkend, terwijl Xbox en telefoons alle talen kunnen herkennen die worden ondersteund door spraakherkenning. Zie De taal voor spraakherkenning opgeven voor meer informatie.
Inrichten
Uw app heeft enkele objecten nodig om een continue dicteersessie te beheren:
- Een exemplaar van een SpeechRecognizer-object .
- Een verwijzing naar een UI-dispatcher om de gebruikersinterface bij te werken tijdens het dicteren.
- Een manier om de opgesomde woorden bij te houden die door de gebruiker worden gesproken.
Hier declareren we een SpeechRecognizer-exemplaar als een privéveld van de code-behind-klasse. Uw app moet ergens anders een verwijzing opslaan als u continue dicteren wilt behouden buiten één XAML-pagina (Extensible Application Markup Language).
private SpeechRecognizer speechRecognizer;
Tijdens het dicteren genereert de herkenner gebeurtenissen vanuit een achtergrondthread. Omdat een achtergrondthread de gebruikersinterface in XAML niet rechtstreeks kan bijwerken, moet uw app een dispatcher gebruiken om de gebruikersinterface bij te werken als reactie op herkenningsevenementen.
Hier declareren we een privéveld dat later wordt geïnitialiseerd met de 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;
Als u wilt bijhouden wat de gebruiker zegt, moet u herkenningsevenementen afhandelen die door de spraakherkenning worden gegenereerd. Deze gebeurtenissen bieden de herkenningsresultaten voor segmenten van gebruikersuitingen.
Hier gebruiken we een StringBuilder-object om alle herkenningsresultaten op te halen die tijdens de sessie zijn verkregen. Nieuwe resultaten worden toegevoegd aan de StringBuilder terwijl ze worden verwerkt.
private StringBuilder dictatedTextBuilder;
Initialisatie
Tijdens de initialisatie van continue spraakherkenning moet u het volgende doen:
- Haal de dispatcher voor de UI-thread op als u de gebruikersinterface van uw app bijwerkt in de gebeurtenis-handlers voor continue herkenning.
- Initialiseer de spraakherkenning.
- Compileer de ingebouwde grammatica van dicteren. Notitie Voor spraakherkenning is ten minste één beperking vereist om een herkenbare woordenlijst te definiëren. Als er geen beperking is opgegeven, wordt een vooraf gedefinieerde dicteer grammatica gebruikt. Zie Spraakherkenning.
- Stel de gebeurtenislisteners in voor herkenningsevenementen.
In dit voorbeeld initialiseren we spraakherkenning in de paginagebeurtenis OnNavigatedTo .
- Omdat gebeurtenissen die worden gegenereerd door de spraakherkenning op een achtergronddraad plaatsvinden, moet u een verwijzing naar de dispatcher maken voor updates aan de UI-draad. OnNavigatedTo wordt altijd aangeroepen op de UI-thread.
this.dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
- Vervolgens initialiseren we het SpeechRecognizer-exemplaar .
this.speechRecognizer = new SpeechRecognizer();
Vervolgens voegen we de grammatica toe en compileren die alle woorden en woordgroepen definieert die kunnen worden herkend door de SpeechRecognizer.
Als u geen grammatica expliciet opgeeft, wordt standaard een vooraf gedefinieerde dicteer grammatica gebruikt. Normaal gesproken is de standaard grammatica het beste voor algemene dicteren.
Hier roepen we CompileConstraintsAsync onmiddellijk aan zonder een grammatica toe te voegen.
SpeechRecognitionCompilationResult result =
await speechRecognizer.CompileConstraintsAsync();
Het afhandelen van herkenningsevenementen
U kunt een enkele, korte uiting of zin vastleggen door RecognizeAsync of RecognizeWithUIAsync aan te roepen.
Om echter een langere, continue herkenningssessie vast te leggen, geven we gebeurtenislisteners op die op de achtergrond actief zijn terwijl de gebruiker spreekt, en definiëren we handlers om de dicteerreeks op te bouwen.
Vervolgens gebruiken we de eigenschap ContinuousRecognitionSession van onze recognizer om een SpeechContinuousRecognitionSession-object te verkrijgen dat methoden en gebeurtenissen biedt voor het beheren van een continue herkenningssessie.
In het bijzonder zijn twee gebeurtenissen van cruciaal belang:
- ResultGenerated, wat optreedt wanneer de recognizer enkele resultaten heeft gegenereerd.
- Voltooid, wat optreedt wanneer de sessie voor continue herkenning is beëindigd.
De gebeurtenis ResultGenerated wordt gegenereerd terwijl de gebruiker spreekt. De recognizer luistert continu naar de gebruiker en genereert periodiek een gebeurtenis die een stuk spraakinvoer doorgeeft. U moet de spraakinvoer onderzoeken met behulp van de eigenschap Resultaat van het gebeurtenisargument en de juiste actie ondernemen in de gebeurtenis-handler, zoals het toevoegen van de tekst aan een StringBuilder-object.
Als exemplaar van SpeechRecognitionResult is de eigenschap Result handig om te bepalen of u de spraakinvoer wilt accepteren. Een SpeechRecognitionResult biedt twee eigenschappen voor deze:
- Status geeft aan of de herkenning is geslaagd. Herkenning kan om verschillende redenen mislukken.
- Betrouwbaarheid geeft het relatieve vertrouwen aan dat de recognizer de juiste woorden begrijpt.
Hier volgen de basisstappen voor het ondersteunen van continue herkenning:
- Hier registreren we de handler voor de gebeurtenis van continue herkenning ResultGenerated in de paginagebeurtenis OnNavigatedTo.
speechRecognizer.ContinuousRecognitionSession.ResultGenerated +=
ContinuousRecognitionSession_ResultGenerated;
Vervolgens controleren we de eigenschap Betrouwbaarheid . Als de waarde van Betrouwbaarheid gemiddeld of beter is, voegen we de tekst toe aan de StringBuilder. We werken ook de gebruikersinterface bij terwijl we invoer verzamelen.
Let op : de gebeurtenis ResultGenerated wordt gegenereerd op een achtergrondthread die de gebruikersinterface niet rechtstreeks kan bijwerken. Als een handler de gebruikersinterface moet bijwerken (zoals het [spraak- en TTS-voorbeeld] doet), moet u de updates verzenden naar de UI-thread via de RunAsync-methode van de 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();
});
}
}
Vervolgens verwerken we de voltooide gebeurtenis, die het einde van continue dicteren aangeeft.
De sessie wordt beëindigd wanneer u de StopAsync - of CancelAsync-methoden aanroept (beschreven in de volgende sectie). De sessie kan ook eindigen wanneer er een fout optreedt of wanneer de gebruiker is gestopt met spreken. Controleer de eigenschap Status van het gebeurtenisargument om te bepalen waarom de sessie is beëindigd (SpeechRecognitionResultStatus).
Hier registreren we de handler voor het continue herkenningsevent Voltooide in de paginagebeurtenis OnNavigatedTo.
speechRecognizer.ContinuousRecognitionSession.Completed +=
ContinuousRecognitionSession_Completed;
De gebeurtenishandler controleert de eigenschap Status om te bepalen of de herkenning is geslaagd. Het behandelt ook het geval waarin de gebruiker niet meer spreekt. Vaak wordt een TimeoutExceeded beschouwd als geslaagde herkenning, omdat dit betekent dat de gebruiker klaar is met spreken. U moet dit geval in uw code verwerken voor een goede ervaring.
Let op : de gebeurtenis ResultGenerated wordt gegenereerd op een achtergrondthread die de gebruikersinterface niet rechtstreeks kan bijwerken. Als een handler de gebruikersinterface moet bijwerken (zoals het [spraak- en TTS-voorbeeld] doet), moet u de updates verzenden naar de UI-thread via de RunAsync-methode van de 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";
});
}
}
}
Doorlopende feedback over herkenning geven
Wanneer mensen elkaar spreken, vertrouwen ze vaak op context om volledig te begrijpen wat er wordt gezegd. Op dezelfde manier heeft de spraakherkenning vaak context nodig om hoge betrouwbaarheidsherkenningsresultaten te bieden. De woorden 'gewicht' en 'wachten' zijn bijvoorbeeld op zichzelf niet te onderscheiden totdat meer context kan worden opgehaald uit omringende woorden. Totdat de recognizer enig vertrouwen heeft dat een woord of woorden correct zijn herkend, wordt de gebeurtenis ResultGenerated niet gegenereerd .
Dit kan resulteren in een minder dan ideale ervaring voor de gebruiker terwijl de gebruiker verder praat en er geen resultaten worden geleverd totdat de recognizer voldoende vertrouwen heeft om de ResultGenerated-gebeurtenis te activeren.
De gebeurtenis HypothesisGenerated afhandelen om dit zichtbare gebrek aan reactiesnelheid te verbeteren. Deze gebeurtenis wordt gegenereerd wanneer de recognizer een nieuwe set potentiële overeenkomsten genereert voor het woord dat wordt verwerkt. Het gebeurtenisargument heeft een eigenschap Hypothese die de huidige overeenkomsten bevat. Laat deze aan de gebruiker zien terwijl ze verder praten en stel hen gerust dat de verwerking nog steeds actief is. Zodra het vertrouwen hoog is en een herkenningsresultaat is vastgesteld, vervangt u de tussentijdse hypotheseresultaten door het uiteindelijke resultaat dat is opgegeven in de gebeurtenis ResultGenerated .
Hier voegen we de hypothetische tekst en een beletselteken (...) toe aan de huidige waarde van het uitvoertekstvak. De inhoud van het tekstvak wordt bijgewerkt wanneer nieuwe hypothesen worden gegenereerd en totdat de uiteindelijke resultaten worden verkregen van de gebeurtenis 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;
});
}
Starten en stoppen van herkenning
Voordat u een herkenningssessie start, controleert u de waarde van de eigenschap State van de spraakherkenning. De spraakherkenning moet een niet-actieve status hebben.
Nadat de status van de spraakherkenning is gecontroleerd, starten we de sessie door de StartAsync-methode van de eigenschap ContinuousRecognitionSession van de spraakherkenningsherkenning aan te roepen.
if (speechRecognizer.State == SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}
Herkenning kan op twee manieren worden gestopt:
- Met StopAsync kunnen alle in behandeling zijnde herkenningsgebeurtenissen worden voltooid (ResultGenerated blijft actief totdat alle herkenningsbewerkingen in behandeling zijn).
- CancelAsync beëindigt de herkenningssessie onmiddellijk en verwijdert alle resultaten die in behandeling zijn.
Na het controleren van de status van de spraakherkenning stoppen we de sessie door de CancelAsync-methode van de eigenschap ContinuousRecognitionSession van de spraakherkenningsherkenning aan te roepen.
if (speechRecognizer.State != SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.CancelAsync();
}
Opmerking
Een ResultGenerated-gebeurtenis kan optreden na een aanroep naar CancelAsync.
Vanwege multithreading blijft een ResultGenerated-gebeurtenis mogelijk nog steeds op de stack staan wanneer CancelAsync wordt aangeroepen. Als dit het geval is, wordt de ResultGenerated-gebeurtenis nog steeds geactiveerd.
Als u privévelden instelt bij het annuleren van de herkenningssessie, bevestigt u altijd de waarden in de Handler ResultGenerated . Stel bijvoorbeeld niet dat een veld wordt geïnitialiseerd in uw handler als u deze instelt op null wanneer u de sessie annuleert.
Verwante artikelen
Voorbeelden
Windows developer