Taligenkänning i Windows appar

Använd taligenkänning för att ange indata, ange åtgärder eller kommandon och utföra uppgifter i din Windows App SDK app.

Important

Taligenkänning kräver MSIX-paketidentitet. Windows.Media.SpeechRecognition API:erna är endast tillgängliga när din app körs med paketidentitet (paketerad eller paketerad med extern plats). Uppackade appar kan inte använda dessa API:er.

Nyckel-API:er

Översikt

Taligenkänning består av en talkörning, igenkännings-API:er för programmering av körningen, färdiga grammatiker för diktering och webbsökning samt ett standardsystemgränssnitt som hjälper användarna att identifiera och använda taligenkänningsfunktioner.

Konfigurera taligenkänning

För att stödja taligenkänning måste användaren ansluta och aktivera en mikrofon på sin enhet och godkänna Microsoft sekretesspolicy som ger din app behörighet att använda den.

Ange funktionen Mikrofonenhet i appens paketmanifest för att be användaren om behörighet för mikrofonåtkomst. Mer information finns i Appkapacitetsdeklarationer.

Om användaren beviljar åtkomst visas din app i listan över godkända program på Inställningar > Sekretessmikrofon>. Eftersom användaren kan inaktivera den här inställningen när som helst kontrollerar du att appen har mikrofonåtkomst innan du försöker använda den.

Om du också vill stödja diktering eller andra taligenkänningstjänster (till exempel en fördefinierad grammatik som definierats i en ämnesbegränsning) bekräftar du att Online-taligenkänning (Inställningar > Sekretesstal>) är aktiverat.

I följande exempel visas hur du kontrollerar om en mikrofon finns och om din app har behörighet att använda den.

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;
    }
}

Känn igen talinmatning

En begränsning definierar de ord och fraser (ordförråd) som en app känner igen i talindata. Begränsningar är kärnan i taligenkänning och ger din app större kontroll över igenkänningsprecision.

Du kan använda följande typer av begränsningar.

Fördefinierade grammatiker

Fördefinierade dikterings- och webbsöknings grammatiker ger taligenkänning utan att du behöver skriva en grammatik. När du använder dessa grammatiker utför en fjärrwebbtjänst igenkänningen och returnerar resultatet till enheten.

Standardtextdiktationens grammatik identifierar de flesta ord och fraser som en användare kan säga på ett visst språk och är optimerad för korta fraser. Om du inte anger några begränsningar för SpeechRecognizer används den fördefinierade dikterings grammatiken.

Grammatiken för webbsökning innehåller ett stort antal ord och fraser, optimerade för termer som användare vanligtvis använder när de söker på webben.

Anmärkning

Fördefinierade dikterings- och webbsöknings grammatiker kan vara stora, och eftersom de är online (inte på enheten) kanske prestandan inte är lika snabb som med en anpassad grammatik installerad lokalt.

Dessa fördefinierade grammatiker känner igen upp till 10 sekunders talinmatning och kräver ingen redigering. De kräver dock en nätverksanslutning.

Se SpeechRecognitionTopicConstraint.

Programmatiska listbegränsningar

Programmatiska listbegränsningar är ett enkelt sätt att skapa enkla grammatiker med hjälp av en lista med ord eller fraser. En listbegränsning fungerar bra för att identifiera korta, distinkta fraser. Om du anger alla ord i en grammatik förbättras igenkänningsprecisionen eftersom taligenkänningsmotorn bara behöver bearbeta tal för att bekräfta en matchning. Listan kan också uppdateras programmatiskt.

Se SpeechRecognitionListConstraint.

SRGS-grammatik

En grammatik för taligenkänning (SRGS) är ett statiskt dokument som använder DET XML-format som definieras av SRGS version 1.0. En SRGS-grammatik ger dig den största kontrollen över taligenkänningsupplevelsen genom att låta dig fånga flera semantiska betydelser i en enda igenkänning.

Se SpeechRecognitionGrammarFileConstraint.

Begränsningar för röstkommandon

Använd en XML-fil för röstkommandodefinition (VCD) för att definiera de kommandon som användaren kan säga för att initiera åtgärder när du aktiverar din app. Se SpeechRecognitionVoiceCommandDefinitionConstraint.

Information om hur du kommer igång med begränsningar finns i Definiera begränsningar för anpassad igenkänning.

Exempel på grundläggande igenkänning

Följande exempel skapar en taligenkänning, kompilerar standardbegränsningarna för diktering och börjar lyssna efter talindata.

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;
    }
}

Anmärkning

Det här exemplet använder RecognizeAsync (utan användargränssnitt). Om du vill använda det inbyggda igenkänningsgränssnittet anropar RecognizeWithUIAsync du i stället. Se SpeechRecognizerUIOptions för anpassningsalternativ.

Anpassa användargränssnittet för igenkänning

När appen anropar SpeechRecognizer.RecognizeWithUIAsync visar systemet flera skärmar i följd:

  • För fördefinierad grammatik (diktering eller webbsökning): LyssnaTänkandeHörde dig säga (eller fel).
  • För list- eller SRGS-begränsningar: LyssnandeSa du (om tvetydigt) → Hörde dig säga (eller fel).

Använd klassen SpeechRecognizerUIOptions (hämtas via SpeechRecognizer.UIOptions) för att anpassa lyssningsskärmen :

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;
}