Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Pomocí rozpoznávání řeči můžete zadat vstup, zadat akci nebo příkaz a provádět úkoly.
Důležitá rozhraní API: Windows.Media.SpeechRecognition
Rozpoznávání řeči se skládá ze spouštěcího modulu řeči, rozhraní API pro programování runtime, předpřipravených gramatik pro diktování a vyhledávání na webu a standardního systémového uživatelského rozhraní, které uživatelům pomáhá zjišťovat a používat funkce rozpoznávání řeči.
Konfigurace rozpoznávání řeči
Aby uživatel mohl podporovat rozpoznávání řeči ve vaší aplikaci, musí se připojit a povolit mikrofon na svém zařízení a přijmout zásady ochrany osobních údajů Microsoftu, které vaší aplikaci udělí oprávnění k jeho používání.
Pokud chcete automaticky vyzvat uživatele s dialogovým oknem systému s žádostí o přístup k zvukovému kanálu mikrofonu a použít ho (například z ukázky rozpoznávání řeči a syntézy řeči uvedené níže), stačí v manifestu balíčku aplikace nastavit funkci zařízeníMikrofon. Další podrobnosti najdete v deklarací funkcích aplikace.
Pokud uživatel klikne na Ano a udělí přístup k mikrofonu, aplikace se přidá do seznamu schválených aplikací na stránce Nastavení –> Ochrana osobních údajů –> Mikrofon. Protože se ale uživatel může rozhodnout toto nastavení kdykoli vypnout, měli byste před pokusem o jeho použití ověřit, jestli má vaše aplikace přístup k mikrofonu.
Pokud chcete také podporovat diktování, Cortanu nebo jiné služby rozpoznávání řeči (například předdefinovanou gramatiku definovanou v omezení tématu), musíte také potvrdit, že je povolené online rozpoznávání řeči (Nastavení –> Ochrana osobních údajů –> Řeč).
Tento fragment kódu ukazuje, jak může aplikace zkontrolovat, jestli je k dispozici mikrofon a jestli má oprávnění k jeho použití.
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;
}
}
});
}
})
Rozpoznávání vstupu řeči
Omezení definuje slova a fráze (slovník), které aplikace rozpozná ve vstupu řeči. Omezení jsou jádrem rozpoznávání řeči a poskytují vaší aplikaci větší kontrolu nad přesností rozpoznávání řeči.
K rozpoznávání vstupu řeči můžete použít následující typy omezení.
Předdefinované gramatiky
Předdefinované gramatiky diktování a vyhledávání na webu poskytují rozpoznávání řeči pro vaši aplikaci, aniž byste museli vytvářet gramatiku. Při použití těchto gramatik se rozpoznávání řeči provádí vzdálenou webovou službou a výsledky se vrátí do zařízení.
Výchozí gramatika diktování volného textu dokáže rozpoznat většinu slov a frází, které uživatel může říct v určitém jazyce, a je optimalizovaný pro rozpoznávání krátkých frází. Předdefinovaná gramatika diktování se použije, pokud pro objekt SpeechRecognizer nezadáte žádná omezení. Diktování volného textu je užitečné, když nechcete omezit druhy věcí, které může uživatel říct. Mezi obvyklé použití patří vytváření poznámek nebo diktování obsahu zprávy.
Gramatika vyhledávání na webu, například gramatika diktování, obsahuje velký počet slov a frází, které může uživatel říct. Je ale optimalizovaná tak, aby rozpoznala termíny, které lidé obvykle používají při vyhledávání na webu.
Poznámka:
Vzhledem k tomu, že předdefinované diktování a gramatiky vyhledávání na webu můžou být velké a protože jsou online (ne na zařízení), nemusí být výkon tak rychlý jako u vlastní gramatiky nainstalované v zařízení.
Tyto předdefinované gramatiky se dají použít k rozpoznávání až 10sekundového vstupu řeči a nevyžadují na vaší straně žádné úsilí o vytváření. Vyžadují však připojení k síti.
Pokud chcete používat omezení webové služby, musí být podpora zadávání řeči a diktování povolená v Nastavení aktivací možnosti "Poznat mě" v Nastavení –> Ochrana osobních údajů –> Řeč, rukopis a psaní.
Tady vám ukážeme, jak otestovat, zda je povolený vstup řeči, a otevřít stránku Nastavení – Ochrana osobních údajů – Řeč, rukopis a psaní, pokud ne.
Nejprve inicializujeme globální proměnnou (HResultPrivacyStatementDeclined) na hodnotu HResult 0x80045509. Viz Zpracování výjimek v jazyce C# nebo Visual Basic.
private static uint HResultPrivacyStatementDeclined = 0x80045509;
Při rozpoznávání pak zachytáme všechny standardní výjimky a otestujeme, jestli je hodnota HResult rovna hodnotě HResultPrivacyStatementDeclined proměnné. Pokud ano, zobrazíme upozornění a zavoláme await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); , abychom otevřeli stránku Nastavení.
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();
}
}
Viz SpeechRecognitionTopicConstraint.
Omezení programového seznamu
Omezení programového seznamu poskytují jednoduchý přístup k vytváření jednoduchých gramatik pomocí seznamu slov nebo frází. Omezení seznamu funguje dobře pro rozpoznávání krátkých, jedinečných frází. Explicitní zadání všech slov v gramatikě také zlepšuje přesnost rozpoznávání, protože modul pro rozpoznávání řeči musí zpracovávat pouze řeč a potvrdit shodu. Seznam lze také aktualizovat prostřednictvím kódu programu.
Omezení seznamu tvoří pole řetězců, které představují hlasový vstup, jenž vaše aplikace přijme pro operaci rozpoznávání. Omezení seznamu v aplikaci můžete vytvořit vytvořením objektu list-constraint pro rozpoznávání řeči a předáním pole řetězců. Potom tento objekt přidejte do kolekce omezení rozpoznávání. Rozpoznávání je úspěšné, když rozpoznávání řeči rozpozná některý z řetězců v poli.
Viz SpeechRecognitionListConstraint.
Gramatiky SRGS
Gramatika SRGS (Speech Recognition Grammar Specification) je statický dokument, který na rozdíl od omezení programového seznamu používá formát XML definovaný SRGS verze 1.0. Gramatika SRGS poskytuje největší kontrolu nad prostředím rozpoznávání řeči tím, že umožňuje zachytit více sémantických významů v jediném rozpoznávání.
Viz SpeechRecognitionGrammarFileConstraint.
Omezení hlasových příkazů
Pomocí souboru XML definice hlasového příkazu (VCD) definujte příkazy, které může uživatel při aktivaci aplikace inicializovat. Další podrobnosti najdete v tématu Aktivace aplikace na popředí pomocí hlasových příkazů prostřednictvím Cortany.
Viz také SpeechRecognitionVoiceCommandDefinitionConstraint/
Poznámka Typ omezení, který použijete, závisí na složitosti prostředí rozpoznávání, které chcete vytvořit. Každá z těchto možností může být nejlepší volbou pro konkrétní úlohu rozpoznávání a můžete najít použití pro všechny typy omezení ve vaší aplikaci. Pokud chcete začít s omezeními, přečtěte si téma Definování omezení vlastního rozpoznávání.
Předdefinovaná gramatika diktování univerzální aplikace pro Windows rozpozná většinu slov a krátkých frází v jazyce. Ve výchozím nastavení se aktivuje, když se vytvoří instance objektu rozpoznávání řeči bez vlastních omezení.
V tomto příkladu si ukážeme, jak:
- Vytvořte rozpoznávání řeči.
- Zkompilujte výchozí omezení univerzální aplikace pro Windows (do sady gramatiky rozpoznávání řeči nebyly přidány žádné gramatiky).
- Začněte naslouchat řeči pomocí základního uživatelského rozhraní pro rozpoznávání a zpětné vazby TTS poskytované metodou RecognizeWithUIAsync . Pokud se výchozí uživatelské rozhraní nevyžaduje, použijte metodu RecognizeAsync .
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();
}
Přizpůsobení uživatelského rozhraní pro rozpoznávání
Když se vaše aplikace pokusí rozpoznat řeč voláním SpeechRecognizer.RecognizeWithUIAsync, zobrazí se několik obrazovek v následujícím pořadí.
Pokud používáte omezení na základě předdefinované gramatiky (diktování nebo vyhledávání na webu):
- Obrazovka Naslouchání
- Obrazovka Thinking.
- Obrazovka Slyšel jsem, že říkáte nebo chybová obrazovka.
Pokud používáte omezení založené na seznamu slov nebo frází nebo omezení na základě gramatického souboru SRGS:
- Obrazovka Naslouchání
- Obrazovka Did you say, pokud by to, co uživatel řekl, mohlo být interpretováno jako více než jeden možný výsledek.
- Obrazovka „Slyšeli jsme, co říkáš“ nebo obrazovka s chybou.
Následující obrázek ukazuje příklad toku mezi obrazovkami pro rozpoznávání řeči, která používá omezení na základě gramatického souboru SRGS. V tomto příkladu bylo rozpoznávání řeči úspěšné.
Na obrazovce Naslouchání můžete uvést příklady slov nebo frází, které aplikace rozpozná. Zde ukazujeme, jak používat vlastnosti SpeechRecognizerUIOptions třídy (získané voláním SpeechRecognizer.UIOptions vlastnost) k přizpůsobení obsahu na obrazovce Naslouchání .
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();
}
Související články
Ukázky
Windows developer