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.
Usare il riconoscimento vocale per fornire input, specificare azioni o comandi ed eseguire attività nell'app 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
Il riconoscimento vocale è costituito da un runtime di riconoscimento vocale, api di riconoscimento per la programmazione del runtime, grammatiche pronte per l'uso per la dettatura e la ricerca Web e un'interfaccia utente di sistema predefinita che consente agli utenti di individuare e usare le funzionalità di riconoscimento vocale.
Configurare il riconoscimento vocale
Per supportare il riconoscimento vocale, l'utente deve connettersi e abilitare un microfono nel dispositivo e accettare l'informativa sulla privacy Microsoft concedendole l'autorizzazione per l'uso dell'app.
Impostare la funzionalità del dispositivo Microfono nel manifesto del pacchetto dell'app per richiedere all'utente l'autorizzazione di accesso al microfono. Per altre informazioni, vedere Dichiarazioni di funzionalità dell'app.
Se l'utente concede l'accesso, l'app viene visualizzata nell'elenco delle applicazioni approvate in Impostazioni > Microfono privacy>. Poiché l'utente può disabilitare questa impostazione in qualsiasi momento, verificare che l'app abbia accesso al microfono prima di tentare di usarla.
Se si vuole anche supportare la dettatura o altri servizi di riconoscimento vocale (ad esempio una grammatica predefinita definita in un vincolo di argomento), verificare che il riconoscimento vocale online (Impostazioni > privacy > voce) sia abilitato.
L'esempio seguente mostra come verificare se è presente un microfono e se l'app dispone dell'autorizzazione per usarlo.
public class AudioCapturePermissions
{
private static int NoCaptureDevicesHResult = -1072845856;
/// <summary>
/// Checks whether the microphone is available and the app has permission to use it.
/// Perform this check every time the app gets focus, because the user can change
/// the setting while the app is suspended or not in focus.
/// </summary>
/// <returns>True if the microphone is available.</returns>
public static async Task<bool> RequestMicrophonePermission()
{
try
{
var settings = new MediaCaptureInitializationSettings
{
StreamingCaptureMode = StreamingCaptureMode.Audio,
MediaCategory = MediaCategory.Speech
};
var capture = new MediaCapture();
await capture.InitializeAsync(settings);
}
catch (TypeLoadException)
{
// Media player components are not available.
return false;
}
catch (UnauthorizedAccessException)
{
// Permission to use the audio capture device is denied.
return false;
}
catch (Exception exception)
{
if (exception.HResult == NoCaptureDevicesHResult)
{
// No audio capture devices are present on this system.
return false;
}
throw;
}
return true;
}
}
Riconoscimento dell'input vocale
Un vincolo definisce le parole e le frasi (vocabolario) riconosciute da un'app nell'input vocale. I vincoli sono al centro del riconoscimento vocale e offrono alla tua app un maggiore controllo sull'accuratezza del riconoscimento.
È possibile usare i tipi di vincoli seguenti.
Grammatiche predefinite
Le grammatiche di dettatura e ricerca Web predefinite forniscono il riconoscimento vocale senza che sia necessario creare una grammatica. Quando si usano queste grammatiche, un servizio Web remoto esegue il riconoscimento e restituisce i risultati al dispositivo.
La grammatica di dettatura a testo libero predefinita riconosce la maggior parte delle parole e delle frasi che un utente può pronunciare in una determinata lingua ed è ottimizzata per le frasi brevi. Se non si specificano vincoli per SpeechRecognizer, viene usata la grammatica di dettatura predefinita.
La grammatica di ricerca Web contiene un numero elevato di parole e frasi, ottimizzate per i termini che le persone usano in genere durante la ricerca sul Web.
Annotazioni
Le grammatiche predefinite di dettatura e ricerca Web possono essere di grandi dimensioni e poiché sono online (non nel dispositivo), le prestazioni potrebbero non essere veloci quanto con una grammatica personalizzata installata localmente.
Queste grammatiche predefinite riconoscono fino a 10 secondi di input vocale e non richiedono alcuna operazione di creazione. Tuttavia, richiedono una connessione di rete.
Vedere SpeechRecognitionTopicConstraint.
Vincoli elenco programmativi
I vincoli elenco a livello di codice offrono un approccio leggero alla creazione di grammatiche semplici usando un elenco di parole o frasi. Un vincolo di elenco funziona bene per il riconoscimento di frasi brevi e distinte. L'impostazione di tutte le parole in una grammatica migliora l'accuratezza del riconoscimento perché il motore di riconoscimento vocale deve solo elaborare il parlato per confermare una corrispondenza. L'elenco può anche essere aggiornato a livello di codice.
Vedere SpeechRecognitionListConstraint.
Grammatiche SRGS
Una grammatica SRGS (Speech Recognition Grammar Specification) è un documento statico che usa il formato XML definito dalla versione 1.0 di SRGS. Una grammatica SRGS offre il massimo controllo sull'esperienza di riconoscimento vocale consentendo di acquisire più significati semantici in un unico riconoscimento.
Vedere SpeechRecognitionGrammarFileConstraint.
Vincoli dei comandi vocali
Usa un file XML VCD (Voice Command Definition) per definire i comandi che l'utente può dire di avviare azioni durante l'attivazione dell'app. Vedere anche SpeechRecognitionVoiceCommandDefinitionConstraint.
Per iniziare a usare i vincoli, vedere Definire vincoli di riconoscimento personalizzati.
Esempio di riconoscimento di base
L'esempio seguente crea un riconoscimento vocale, compila i vincoli di dettatura predefiniti e avvia l'ascolto dell'input vocale.
private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
// Compile the default dictation grammar.
await speechRecognizer.CompileConstraintsAsync();
// Start recognition.
Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
await speechRecognizer.RecognizeAsync();
// Display the recognized text.
if (result.Status == Windows.Media.SpeechRecognition.SpeechRecognitionResultStatus.Success)
{
resultTextBlock.Text = result.Text;
}
}
Annotazioni
Questo esempio usa RecognizeAsync (senza interfaccia utente). Se vuoi usare l'interfaccia utente di riconoscimento predefinita, chiama RecognizeWithUIAsync invece. Vedere SpeechRecognizerUIOptions per le opzioni di personalizzazione.
Personalizzare l'interfaccia utente di riconoscimento
Quando l'app chiama SpeechRecognizer.RecognizeWithUIAsync, il sistema visualizza diverse schermate in sequenza:
- Per le grammatiche predefinite (dettatura o ricerca Web): Ascolto → Elaborazione → Ho sentito (o errore).
- Per vincoli di elenco o SRGS: Ascolto → Hai detto? (se ambiguo) → Ho capito (o errore).
Usare la classe SpeechRecognizerUIOptions (ottenuta tramite SpeechRecognizer.UIOptions) per personalizzare la schermata Di ascolto :
private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
speechRecognizer.RecognitionQualityDegrading += SpeechRecognizer_RecognitionQualityDegrading;
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);
await speechRecognizer.CompileConstraintsAsync();
Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
await speechRecognizer.RecognizeWithUIAsync();
resultTextBlock.Text = result.Text;
}