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.
Gebruik spraakherkenning om invoer te bieden, een actie of opdracht op te geven en taken uit te voeren.
Belangrijke API's: Windows.Media.SpeechRecognition
Spraakherkenning bestaat uit een spraakruntime, herkennings-API's voor het programmeren van de runtime, kant-en-klare grammatica's voor dicteren en zoeken op internet, en een standaardsysteeminterface waarmee gebruikers functies voor spraakherkenning kunnen detecteren en gebruiken.
Spraakherkenning configureren
Om spraakherkenning met uw app te ondersteunen, moet de gebruiker verbinding maken met een microfoon op het apparaat en een microfoon inschakelen en het Privacybeleid van Microsoft accepteren dat toestemming verleent voor uw app om deze te gebruiken.
Als u de gebruiker automatisch met een systeemdialoogvenster wilt vragen om toegang te krijgen tot en de audiofeed van de microfoon te gebruiken (bijvoorbeeld uit het hieronder weergegeven voorbeeld van spraakherkenning en spraaksynthese), stelt u de mogelijkheid microfoonapparaat in het app-pakketmanifest in. Zie App-mogelijkhedenverklaringen voor meer informatie.
Als de gebruiker op Ja klikt om toegang te verlenen tot de microfoon, wordt uw app toegevoegd aan de lijst met goedgekeurde toepassingen op de pagina Instellingen -> Privacy -> Microfoon. Aangezien de gebruiker er echter voor kan kiezen om deze instelling op elk gewenst moment uit te schakelen, moet u bevestigen dat uw app toegang heeft tot de microfoon voordat u deze probeert te gebruiken.
Als u ook dicteren, Cortana of andere spraakherkenningsservices wilt ondersteunen (zoals een vooraf gedefinieerde grammatica die is gedefinieerd in een onderwerpbeperking), moet u ook bevestigen dat online spraakherkenning (Instellingen -> Privacy -> Spraak) is ingeschakeld.
Dit codefragment laat zien hoe uw app kan controleren of er een microfoon aanwezig is en of deze gemachtigd is om deze te gebruiken.
public class AudioCapturePermissions
{
// If no microphone is present, an exception is thrown with the following HResult value.
private static int NoCaptureDevicesHResult = -1072845856;
/// <summary>
/// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
/// the Cortana/Dictation privacy check.
///
/// You should perform this check every time the app gets focus, in case the user has changed
/// the setting while the app was suspended or not in focus.
/// </summary>
/// <returns>True, if the microphone is available.</returns>
public async static Task<bool> RequestMicrophonePermission()
{
try
{
// Request access to the audio capture device.
MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();
settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
settings.MediaCategory = MediaCategory.Speech;
MediaCapture capture = new MediaCapture();
await capture.InitializeAsync(settings);
}
catch (TypeLoadException)
{
// Thrown when a media player is not available.
var messageDialog = new Windows.UI.Popups.MessageDialog("Media player components are unavailable.");
await messageDialog.ShowAsync();
return false;
}
catch (UnauthorizedAccessException)
{
// Thrown when permission to use the audio capture device is denied.
// If this occurs, show an error or disable recognition functionality.
return false;
}
catch (Exception exception)
{
// Thrown when an audio capture device is not present.
if (exception.HResult == NoCaptureDevicesHResult)
{
var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
await messageDialog.ShowAsync();
return false;
}
else
{
throw;
}
}
return true;
}
}
/// <summary>
/// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
/// the Cortana/Dictation privacy check.
///
/// You should perform this check every time the app gets focus, in case the user has changed
/// the setting while the app was suspended or not in focus.
/// </summary>
/// <returns>True, if the microphone is available.</returns>
IAsyncOperation<bool>^ AudioCapturePermissions::RequestMicrophonePermissionAsync()
{
return create_async([]()
{
try
{
// Request access to the audio capture device.
MediaCaptureInitializationSettings^ settings = ref new MediaCaptureInitializationSettings();
settings->StreamingCaptureMode = StreamingCaptureMode::Audio;
settings->MediaCategory = MediaCategory::Speech;
MediaCapture^ capture = ref new MediaCapture();
return create_task(capture->InitializeAsync(settings))
.then([](task<void> previousTask) -> bool
{
try
{
previousTask.get();
}
catch (AccessDeniedException^)
{
// Thrown when permission to use the audio capture device is denied.
// If this occurs, show an error or disable recognition functionality.
return false;
}
catch (Exception^ exception)
{
// Thrown when an audio capture device is not present.
if (exception->HResult == AudioCapturePermissions::NoCaptureDevicesHResult)
{
auto messageDialog = ref new Windows::UI::Popups::MessageDialog("No Audio Capture devices are present on this system.");
create_task(messageDialog->ShowAsync());
return false;
}
throw;
}
return true;
});
}
catch (Platform::ClassNotRegisteredException^ ex)
{
// Thrown when a media player is not available.
auto messageDialog = ref new Windows::UI::Popups::MessageDialog("Media Player Components unavailable.");
create_task(messageDialog->ShowAsync());
return create_task([] {return false; });
}
});
}
var AudioCapturePermissions = WinJS.Class.define(
function () { }, {},
{
requestMicrophonePermission: function () {
/// <summary>
/// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
/// the Cortana/Dictation privacy check.
///
/// You should perform this check every time the app gets focus, in case the user has changed
/// the setting while the app was suspended or not in focus.
/// </summary>
/// <returns>True, if the microphone is available.</returns>
return new WinJS.Promise(function (completed, error) {
try {
// Request access to the audio capture device.
var captureSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
captureSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio;
captureSettings.mediaCategory = Windows.Media.Capture.MediaCategory.speech;
var capture = new Windows.Media.Capture.MediaCapture();
capture.initializeAsync(captureSettings).then(function () {
completed(true);
},
function (error) {
// Audio Capture can fail to initialize if there's no audio devices on the system, or if
// the user has disabled permission to access the microphone in the Privacy settings.
if (error.number == -2147024891) { // Access denied (microphone disabled in settings)
completed(false);
} else if (error.number == -1072845856) { // No recording device present.
var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
messageDialog.showAsync();
completed(false);
} else {
error(error);
}
});
} catch (exception) {
if (exception.number == -2147221164) { // REGDB_E_CLASSNOTREG
var messageDialog = new Windows.UI.Popups.MessageDialog("Media Player components not available on this system.");
messageDialog.showAsync();
return false;
}
}
});
}
})
Spraakinvoer herkennen
Een beperking definieert de woorden en woordgroepen (woordenlijst) die een app herkent in spraakinvoer. Beperkingen vormen de kern van spraakherkenning en geven uw app meer controle over de nauwkeurigheid van spraakherkenning.
U kunt de volgende typen beperkingen gebruiken voor het herkennen van spraakinvoer.
Vooraf gedefinieerde grammatica's
Vooraf gedefinieerde dicteer- en webzoekopdrachten bieden spraakherkenning voor uw app zonder dat u een grammatica hoeft te schrijven. Wanneer u deze grammatica gebruikt, wordt spraakherkenning uitgevoerd door een externe webservice en worden de resultaten geretourneerd naar het apparaat.
De standaard grammatica van vrije tekst kan de meeste woorden en woordgroepen herkennen die een gebruiker in een bepaalde taal kan zeggen en is geoptimaliseerd voor het herkennen van korte zinnen. De vooraf gedefinieerde grammatica voor dicteren wordt gebruikt als u geen beperkingen opgeeft voor uw SpeechRecognizer-object . Dicteren in vrije tekst is handig als u de soorten dingen die een gebruiker kan zeggen niet wilt beperken. Typische toepassingen zijn onder andere het maken van notities of het dicteren van de inhoud voor een bericht.
De grammatica van de webzoekopdrachten, zoals een dicteer grammatica, bevat een groot aantal woorden en woordgroepen die een gebruiker kan zeggen. Het is echter geoptimaliseerd om termen te herkennen die mensen doorgaans gebruiken bij het zoeken op internet.
Opmerking
Omdat vooraf gedefinieerde dicteren en grammatica's voor zoeken op internet groot kunnen zijn en omdat ze online zijn (niet op het apparaat), zijn de prestaties mogelijk niet zo snel als bij een aangepaste grammatica die op het apparaat is geïnstalleerd.
Deze vooraf gedefinieerde grammatica's kunnen worden gebruikt voor het herkennen van maximaal 10 seconden spraakinvoer en vereisen geen ontwerpinspanningen voor uw deel. Ze hebben echter wel een verbinding met een netwerk nodig.
Als u beperkingen voor webservices wilt gebruiken, moet de ondersteuning voor spraakinvoer en dicteren zijn ingeschakeld in Instellingen door de optie 'Kennismaken met mij' in te schakelen in Instellingen - Privacy ->> Spraak, handschrift en typen.
Hier laten we zien hoe u kunt testen of spraakinvoer is ingeschakeld en hoe u de pagina Instellingen -> Privacy -> Spraak, handschrift en typpagina opent, indien niet.
Eerst initialiseren we een globale variabele (HResultPrivacyStatementDeclined) naar de HResult-waarde van 0x80045509. Zie Uitzonderingsafhandeling voor in C# of Visual Basic.
private static uint HResultPrivacyStatementDeclined = 0x80045509;
We vangen vervolgens eventuele standaard uitzonderingen tijdens de herkenning en test of de HResult-waarde gelijk is aan de waarde van de variabele HResultPrivacyStatementDeclined. Zo ja, dan geven we een waarschuwing weer en roepen we await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); aan om de Instellingenpagina te openen.
catch (Exception exception)
{
// Handle the speech privacy policy error.
if ((uint)exception.HResult == HResultPrivacyStatementDeclined)
{
resultTextBlock.Visibility = Visibility.Visible;
resultTextBlock.Text = "The privacy statement was declined." +
"Go to Settings -> Privacy -> Speech, inking and typing, and ensure you" +
"have viewed the privacy policy, and 'Get To Know You' is enabled.";
// Open the privacy/speech, inking, and typing settings page.
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts"));
}
else
{
var messageDialog = new Windows.UI.Popups.MessageDialog(exception.Message, "Exception");
await messageDialog.ShowAsync();
}
}
Zie SpeechRecognitionTopicConstraint.
Programmeerbare lijstbeperkingen
Programmatische lijstbeperkingen bieden een eenvoudige benadering voor het maken van eenvoudige grammatica met behulp van een lijst met woorden of woordgroepen. Een lijstbeperking werkt goed voor het herkennen van korte, afzonderlijke zinnen. Het expliciet opgeven van alle woorden in een grammatica verbetert ook de nauwkeurigheid van de herkenning, omdat de spraakherkenningsengine alleen spraak moet verwerken om een overeenkomst te bevestigen. De lijst kan ook programmatisch worden bijgewerkt.
Een lijstbeperking bestaat uit een matrix met tekenreeksen die spraakinvoer vertegenwoordigt die uw app accepteert voor een herkenningsbewerking. U kunt een lijstbeperking maken in uw app door een lijstbeperkingsobject voor spraakherkenning te maken en een matrix met tekenreeksen door te geven. Voeg vervolgens dat object toe aan de beperkingenverzameling van de recognizer. Herkenning is geslaagd wanneer de spraakherkenning een van de tekenreeksen in de matrix herkent.
Zie SpeechRecognitionListConstraint.
SRGS-grammatica's
Een SRGS-grammatica (Speech Recognition Grammar Specification) is een statisch document dat, in tegenstelling tot een programmatische lijstbeperking, de XML-indeling gebruikt die is gedefinieerd door de SRGS-versie 1.0. Een SRGS-grammatica biedt de grootste controle over de spraakherkenningservaring door meerdere semantische betekenissen in één herkenning vast te leggen.
Zie SpeechRecognitionGrammarFileConstraint.
Beperkingen voor spraakopdrachten
Gebruik een VCD-bestand (Voice Command Definition) om de opdrachten te definiëren die de gebruiker kan zeggen om acties te starten bij het activeren van uw app. Zie Een voorgrond-app activeren met spraakopdrachten via Cortana voor meer informatie.
Zie SpeechRecognitionVoiceCommandDefinitionConstraint/
Notitie Het type beperking dat u gebruikt, is afhankelijk van de complexiteit van de herkenningservaring die u wilt maken. Elke optie kan de beste keuze zijn voor een specifieke herkenningstaak en u vindt mogelijk gebruik voor alle typen beperkingen in uw app. Zie Aangepaste herkenningsbeperkingen definiëren om aan de slag te gaan met beperkingen.
De vooraf gedefinieerde universele Windows-app-dicteer grammatica herkent de meeste woorden en korte woordgroepen in een taal. Deze wordt standaard geactiveerd wanneer een spraakherkenningsobject wordt geïnstantieerd zonder aangepaste beperkingen.
In dit voorbeeld laten we het volgende zien:
- Een spraakherkenning maken.
- Compileer de standaardbeperkingen voor universele Windows-apps (er zijn geen grammatica's toegevoegd aan de grammaticaset van de spraakherkenning).
- Begin te luisteren naar spraak met behulp van de basisherkenningsinterface en TTS-feedback van de methode RecognizeWithUIAsync . Gebruik de methode RecognizeAsync als de standaardgebruikersinterface niet is vereist.
private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
// Create an instance of SpeechRecognizer.
var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
// Compile the dictation grammar by default.
await speechRecognizer.CompileConstraintsAsync();
// Start recognition.
Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
// Do something with the recognition result.
var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
await messageDialog.ShowAsync();
}
De herkenningsinterface aanpassen
Wanneer uw app spraakherkenning probeert aan te roepen door SpeechRecognizer.RecognizeWithUIAsync aan te roepen, worden verschillende schermen weergegeven in de volgende volgorde.
Als u een beperking gebruikt op basis van een vooraf gedefinieerde grammatica (dicteren of zoeken op internet):
- Het luisterscherm .
- Het Denken-scherm.
- Het Heard you say-scherm of het foutscherm.
Als u een beperking gebruikt op basis van een lijst met woorden of woordgroepen of een beperking op basis van een SRGS-grammaticabestand:
- Het luisterscherm .
- Het scherm Hebt u gezegd , als wat de gebruiker zei als meer dan één potentieel resultaat kan worden geïnterpreteerd.
- Het Heard you say-scherm of het foutscherm.
In de volgende afbeelding ziet u een voorbeeld van de stroom tussen schermen voor een spraakherkenning die gebruikmaakt van een beperking op basis van een SRGS-grammaticabestand. In dit voorbeeld is spraakherkenning geslaagd.
Het luisterscherm kan voorbeelden bevatten van woorden of woordgroepen die de app kan herkennen. Hier laten we zien hoe u de eigenschappen van de klasse SpeechRecognizerUIOptions gebruikt (verkregen door de eigenschap SpeechRecognizer.UIOptions aan te roepen) om inhoud op het scherm Luisteren aan te passen.
private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
// Create an instance of SpeechRecognizer.
var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
// Listen for audio input issues.
speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;
// Add a web search grammar to the recognizer.
var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");
speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
speechRecognizer.Constraints.Add(webSearchGrammar);
// Compile the constraint.
await speechRecognizer.CompileConstraintsAsync();
// Start recognition.
Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
//await speechRecognizer.RecognizeWithUIAsync();
// Do something with the recognition result.
var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
await messageDialog.ShowAsync();
}
Verwante artikelen
Voorbeelden
Windows developer