Audiobeschreibungen mit der Sprachausgabe

Abgeschlossen

Die Sprachsynthese hat im Vergleich zu den Roboterstimmen und der unnatürlichen Aussprache vergangener Tage enorme Fortschritte gemacht. Die Sprachausgabe bietet unter Windows eine integrierte Sprachausgabe, die besonders für Benutzer mit eingeschränktem Sehvermögen eine hervorragende Unterstützung sein kann. Allerdings muss unsere App konfiguriert werden, um diese Sprachausgabe verwenden zu können.

In dieser Lerneinheit lernen Sie Folgendes:

  • Aktivieren und Testen der Sprachausgabe in einer App ohne besondere Sprachausgabenattribute
  • Hinzufügen spezieller Attribute zu einer App zur Verbesserung des Sprachausgabeflusses
  • Bereinigen von Nachlässigkeiten in Zeichenfolgen für eine bessere Aussprache
  • Füllen von Lücken in der Sprachausgabe mit einer benutzerdefinierten Instanz eines Sprachsynthesizers

Die Sprachausgabe

Stellen Sie sicher, dass die wissenschaftliche Rechner-App ordnungsgemäß ausgeführt wird. Sie müssen die XAML und CodeBehind ändern, um Benutzern die bestmögliche Erfahrung mit der Sprachausgabe zu bieten.

Aktivieren und Testen der Sprachausgabe

  1. Geben Sie „narrator settings“ (Sprachausgabe Einstellungen) in der Windows-Suchleiste ein, und wählen Sie dann Ease of Access Narrator settings (Einstellungen für die erleichterte Bedienung der Sprachausgabe) aus. Daraufhin sollte der folgende Bildschirm angezeigt werden.

Turning on the narrator.

  1. Aktivieren Sie den Schalter Use Narrator (Sprachausgabe verwenden), und minimieren Sie anschließend dieses Fenster. Es wird empfohlen, dieses Fenster geöffnet zu lassen, da bei der Sprachausgabe Probleme auftreten können, wenn Sie zwischen Apps und Entwicklersoftware wechseln. Auf diese Weise können Sie den Schalter deaktivieren, wenn Sie Ihren Code verändern und anschließend zum Testen wieder aktivieren.

  2. Markieren Sie die Schaltfläche Show constants (Konstanten anzeigen) des Rechners, und beobachten Sie, wie die Sprachausgabe die Beschreibung verarbeitet: Schaltfläche „show constants (pause)“ (Konstanten anzeigen (Anhalten)) Wir verwenden die integrierten Funktionen der Sprachausgabe, um die Beschreibungen möglichst hilfreich zu gestalten. Eine dieser Funktionen ist es, den Typ des Benutzeroberflächenelements bekanntzugeben (hier „Schaltfläche“).

  3. Wählen Sie jetzt die Schaltfläche Sqrt (Quadratwurzel) aus, und achten Sie auf die Aussprache. „Sqrt“ ist eine allgemeine Kurzschriftform für „square root“ (Quadratwurzel) in der Mathematik. Die Sprachausgabe weiß dies allerdings nicht. Auf ähnliche Weise erkennt sie Sin, Asin, Acos etc. besonders dann nicht, wenn spezielle Begriffe wie gängige englische Wörter betont werden können. Daher ist es erforderlich, die Sprachausgabe bei der korrekten Aussprache zu unterstützen.

  4. Wählen Sie verschiedene andere Schaltflächen (Vorgänge und Nummern) aus, und achten Sie darauf, wie gut die Sprachausgabe diese verarbeitet. In manchen Bereichen funktioniert dies problemlos, in anderen besteht Verbesserungsbedarf.

  5. Wechseln Sie zurück zur Schaltfläche Show constants (Konstanten anzeigen), und wählen Sie diese aus. Wählen Sie daraufhin die verschiedenen Konstanten aus, und achten Sie darauf, wie gut die Sprachausgabe diese verarbeitet. Wählen Sie einige der Konstanten aus, und bewerten Sie, ob die Aussprache dieser Konstanten verwendet werden kann oder nicht. Die Aussprache mancher Kurzformen (z. B. „Gms“, „Ozs“, „Cms“ etc.) kann nicht verwendet werden. Abgekürzte Begriffe sind nicht nützlich, wenn die Benutzer diese nicht verstehen.

  6. Geben Sie abschließend die folgende Gleichung ein: SqrtAtan0,5. Markieren Sie die Textanzeige der Gleichung ohne = auszuwählen, und achten Sie darauf, wie gut die Sprachausgabe diese verarbeitet. Drücken Sie nun =, und wählen Sie noch mal die Textanzeige aus. Glücklicherweise kann die Sprachausgabe lange Zahlen sehr gut verarbeiten.

  7. Öffnen Sie das Fenster für die Einstellungen der Sprachausgabe, und deaktivieren Sie die Sprachausgabe vorläufig.

Der Test der Sprachausgabe mit dem Rechner hat gezeigt, dass ein paar Probleme im Zusammenhang mit der Aussprache mathematischer Funktionen, mathematischer Vorgänge und der Liste der Konstanten behoben werden müssen.

Natürliche Aussprache von Textzeichenfolgen

In diesem Abschnitt unterstützen wir die Sprachausgabe dabei, beim Verwenden einer Funktion des Rechners natürlich zu klingen. Stellen Sie sicher, dass Visual Studio mit dem Projekt des wissenschaftlichen Rechners geöffnet ist.

  1. Wenn ein Benutzeroberflächenelement markiert ist und ausgesprochen wird, sucht die Sprachausgabe zuerst die Eigenschaft AutomationProperites.Name. Wenn ein Benutzeroberflächenelement gefunden wird, wird dieses Wort oder dieser Satz verwendet. Wenn keines gefunden wird, wird stattdessen die EigenschaftInhalt verwendet. Daher muss für alle Benutzeroberflächenelemente, die nicht deutlich ausgesprochen werden, die Eigenschaft AutomationProperites.Name mit dem deutlich ausgesprochenen Namen hinzugefügt werden. Fügen Sie in der Datei „MainPage.xaml“ die folgenden Nameneigenschaften zu den jeweiligen XAML-Einträgen hinzu. Die es sich um eine lange Liste handelt, sollten Sie ausreichend Zeit dafür einplanen, die Einträge nacheinander hinzuzufügen. Verwenden Sie hierfür entweder „Ausschneiden“ und „Einfügen“ oder die Funktion der schnellen Attributeinträge von Visual Studio.
 <Button x:Name="ButtonNMemoryPlus" AutomationProperties.Name="Memory plus" Content="M+"
 <Button x:Name="ButtonNMemoryMinus" AutomationProperties.Name="Memory minus" Content="M-"
 <Button x:Name="ButtonNMemoryMultiply" AutomationProperties.Name="Memory times" Content="M*"
 <Button x:Name="ButtonNMemoryDivide" AutomationProperties.Name="Memory divided by" Content="M/"
 <Button x:Name="ButtonLeft" AutomationProperties.Name="Open" Content="("
 <Button x:Name="ButtonSqrt" AutomationProperties.Name="Square root" Content="Sqrt"
 <Button x:Name="ButtonPow" AutomationProperties.Name="to the Power of" Content="^"
 <Button x:Name="ButtonPi" AutomationProperties.Name="Pi" Content="&#928;"
 <Button x:Name="ButtonRight" AutomationProperties.Name="Close" Content=")"
 <Button x:Name="ButtonArcsine" AutomationProperties.Name="Arc sine" Content="Asin"
 <Button x:Name="ButtonArccosine" AutomationProperties.Name="Arc cosine" Content="Acos"
 <Button x:Name="ButtonArctangent" AutomationProperties.Name="Arc tangent" Content="Atan"
 <Button x:Name="ButtonSin" AutomationProperties.Name="Sine" Content="Sin"
 <Button x:Name="ButtonCos" AutomationProperties.Name="Cosine" Content="Cos"
 <Button x:Name="ButtonTan" AutomationProperties.Name="Tangent" Content="Tan"
 <Button x:Name="ButtonNegative" AutomationProperties.Name="Negative" Content="-N"
 <Button x:Name="ButtonPlus" AutomationProperties.Name="plus" Content="+"
 <Button x:Name="ButtonMinus" AutomationProperties.Name="minus" Content="-"
 <Button x:Name="ButtonMultiply" AutomationProperties.Name="times" Content="*"
 <Button x:Name="ButtonDivide" AutomationProperties.Name="divided by" Content="/"
 <Button x:Name="ButtonEquals" AutomationProperties.Name="equals" Content="="
 <TextBox x:Name="TextDisplay" AutomationProperties.Name="Calculation"
 <Button x:Name="ButtonClr" AutomationProperties.Name="Clear" Content="Clr"
 <Button x:Name="ButtonDel" AutomationProperties.Name="Delete" Content="Del"
   />
  1. Als nächstes kümmern wir uns um die Nachlässigkeiten in der Liste der Konstanten. Öffnen Sie die MainPage.xaml.cs-Datei, und suchen Sie die LoadConstants-Methode.

  2. Ersetzen Sie die Liste der Zeichenfolgen durch die im Folgenden dargestellten Zeichenfolgen. Hier wurden alle Kurzformen durch die vollständig ausgeschriebene Form ersetzt.

string[] initialConstants = {
                "Acceleration due to gravity = 9.80665",
                "Bars to pounds per square inch = 14.5037738",
                "Centimeters to inches = 0.393700787",
                "Degrees to radians = 0.0174532925",
                "Feet to meters = 0.3048",
                "Grams to ounces = 0.035273",
                "Inches to centimeters = 2.540",
                "Inches to millimeters = 25.4",
                "Kilograms to pounds = 2.20462262",
                "Kilometers to miles = 0.621371192",               
                "Liters to pints = 2.11337642",
                "Meters to feet= 3.2808",
                "Miles to kilometers = 1.609344",
                "Millimeters to inches = 0.0393700787",
                "Ounces to grams = 28.3495",
                "Pints to liters = 0.473176473",   
                "Pounds per square inch to bars = 0.0689475729",
                "Pounds to kilograms = 0.45359237",                            
                "Radians to degrees = 57.2957795",
                "Speed of light in meters per second = 299792458",
                "Speed of light in miles per second = 186282.397"
            };
  1. Führen Sie die App aus, und aktivieren Sie die Sprachausgabe. Stellen Sie sicher, dass Sie diesen Schritt für alle mathematischen Funktionen, Vorgänge und Konstanten durchführen, sodass diese nun von der Sprachausgabe deutlich ausgesprochen werden. Werden auch wirklich alle natürlich ausgesprochen und sind gut verständlich? Falls dies nicht der Fall ist, können Sie Korrekturen an den Zeichenfolgen vornehmen oder die Eigenschaft AutomationProperites.Name hinzufügen oder anpassen.

  2. Geben Sie eine Gleichung mit Klammern und mehreren mathematischen Funktionen ein, und markieren Sie die Textanzeige. Mithilfe von Code können wir dieses Problem beheben.

Hinzufügen von Code zur Unterstützung der Sprachausgabe

Dank unserer Änderungen funktioniert die Sprachausgabe hinsichtlich der Aussprache von Benutzeroberflächenelementen nun hervorragend. In einigen Fällen wäre eine gesprochene Nachricht hilfreich, allerdings handelt es sich beim auslösenden Ereignis nicht um ein Benutzeroberflächenelement. Wir würden auch gern die Aussprache der Gleichung verbessern. Deshalb wird hier ein Sprachsynthesizer zum Verarbeiten von Fehlermeldungen hinzugefügt und einige kurze Codes geändert, um die Gleichung zu verarbeiten.

  1. Öffnen Sie die Datei MainPage.xaml.cs, und aktualisieren Sie die Using-Anweisungen, um folgendes einzuschließen.
using System.Threading.Tasks;
using Windows.Media.SpeechSynthesis;
using Windows.UI.Xaml.Automation;
  1. Fügen Sie Folgendes zur Liste der globalen Variablen hinzu.
        // Declare variables needed for speech output.
        SpeechSynthesizer speech;
        MediaElement mediaElement;
  1. Initialisieren Sie diese Variablen in der MainPage-Methode, sodass sie nun wie folgt aussieht:
        public MainPage()
        {
            this.InitializeComponent();

            // Hide the error field.
            textError.Visibility = Visibility.Collapsed;

            LoadConstants();

            calculation = new ArrayList();
            backupCalculation = new ArrayList();

            mode = Emode.Calculate;

            // The objects for controlling and playing audio.
            speech = new SpeechSynthesizer();
            mediaElement = new MediaElement();
        }
  1. Sie sollten einen Umschalter oder ein anderes Benutzeroberflächenelement hinzufügen, sodass der Benutzer entscheiden kann, ob er die Sprachausgabe als Hilfe in Anspruch nehmen möchte. Fügen Sie in der MainPage.xaml-Datei direkt über dem Eintrag listConstants (in der Nähe der letzten Einträge der Benutzeroberflächenelemente) folgendes ein:
        <ToggleSwitch x:Name="ToggleNarration"
            Margin="551,407,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Header="Narration help"
            IsOn="True" />

Hinweis

Es ist wichtig, diese Elemente in der XAML-Datei in der richtigen Reihenfolge abzurufen. Andernfalls kann es sein, dass dieser Eintrag z. B. in der Liste der Konstanten angezeigt wird.

  1. Fügen Sie in der MainPage.xaml.cs-Datei eine SayAsync-Methode hinzu, sodass eine Textzeile ausgesprochen werden kann. Beachten Sie die Verwendung der zuvor hinzugefügten Variablen speech und mediaElement. Hierbei handelt es sich um einen asynchronen Vorgang.
        private async Task SayAsync(string text)
        {
            // Narrate the given text if narration help is on.
            if (ToggleNarration.IsOn == true)
            {
                // Generate the audio stream from plain text.
                SpeechSynthesisStream stream = await speech.SynthesizeTextToStreamAsync(text);

                // Send the stream to the media object, then play it.
                mediaElement.SetSource(stream, stream.ContentType);
                mediaElement.Play();
            }
        }
  1. Nun müssen der SayAsync-Methode Aufrufe hinzugefügt werden. Beginnen Sie mit dem catch-Block der CalculateAsync-Methode.
            catch
            {
                TextError.Visibility = Visibility.Visible;
                CopyCalculation(backupCalculation, calculation);
                await SayAsync("Oops, there is an error in your calculation.");
            }
  1. Fügen Sie in der CalculateAsync-Methode SayAsync außerdem nach den hier gezeigten Zeilen den folgenden Aufruf hinzu.
                    // Add the entry to the next calculation, just in case the user wants to add to it.
                    OneEntry resultEntry = new OneEntry(Etoken.Number, result, txt);
                    calculation.Add((object)resultEntry);

                    await SayAsync($"The result is: {txt}");
  1. Suchen Sie jetzt die Button_Click-Methode, und ändern Sie den Eintrag Standard: im Schalterblock folgendermaßen: Dadurch kann die Gleichung ausgesprochen werden.
                default:

                    // User has clicked a math or digit button.
                    string tag = b.Tag.ToString();
                    string txt = "";

                    // If in narrative mode, then use a full English string for the display text, if a full string has been specified.
                    if (ToggleNarration.IsOn == true)
                    {
                        txt = b.GetValue(AutomationProperties.NameProperty).ToString();
                    }

                    // Use the content of the button as the equation text.
                    if (txt.Length == 0)
                    {
                        txt = b.Content.ToString();
                    }

                    MathEntry(txt, tag);
                    break;
  1. Testen Sie den Code, indem Sie die App ausführen. Stellen Sie sicher, dass die Sprachausgabe und die Umschaltfläche Narration help (Sprachausgabe als Hilfe) eingeschaltet sind. Geben Sie eine unsinnige Gleichung ein. Sqrt ( wird dann beispielsweise als Square root Open (Quadratwurzel, Klammer auf) angezeigt. Erhalten Sie eine natürlich klingende Fehlermeldung, wenn Sie = auswählen? Achten Sie darauf, wie die gleiche Stimme für die SayAsync-Methode und die Sprachausgabe verwendet wird. Auf diese Weise werden angenehme Audiofunktionen ermöglicht.

  2. Vervollständigen Sie die Gleichung, und achten Sie darauf, dass der Text im Anzeigebereich angezeigt wird. Wenn Sie dann die Anzeige auswählen, wird die Gleichung deutlich von der Sprachausgabe vorgelesen. Obwohl einige Vorgänge zum Markieren möglicherweise noch kleinere Herausforderungen darstellen, wird dank dieser Verbesserung dennoch eine angenehmere Nutzung ermöglicht.

Fügen Sie in Ihrer App eine Option für die Sprachsynthese hinzu, um Lücken in der Sprachausgabe zu füllen und somit den Benutzern die Bedienung zu vereinfachen. Da dies hochgradig App-spezifisch ist, sollte die Priorität auf einer benutzerfreundlichen Sprachausgabe der Benutzeroberflächenelemente liegen. Wie in diesem Fall kann es sein, dass bereits eine minimal verbesserte Sprachausgabe zu einer angenehmeren Bedienung für den Benutzer führt.

Zusammenfassung der Lerneinheit

In dieser Lerneinheit haben Sie erfahren, dass die Sprachsynthese im Vergleich zu früher erstaunlich gut funktioniert. Die Funktion der Sprachausgabe ist in Windows kostenlos und kann sofort genutzt werden, wenn Sie die Sprachausgabe aktivieren. Jedoch waren beim Verwenden der Sprachausgabe Nachlässigkeiten in den Zeichenfolgen von Nachrichten erkennbar. Die Zeichenfolgen von Nachrichten müssen vollständig sein und dürfen keine Fehler enthalten, um sicherzustellen, dass die App problemlos funktioniert.

Außerdem ist die Sprachausgabe noch nicht perfekt und muss in manchen Bereichen verbessert werden. Mathematische Begriffe wie „sin“ (Sinus) werden beispielsweise nicht korrekt betont, da dieses abgekürzte Wort einem anderen vollständigen Wort entspricht. Allerdings sind leicht implementierbare XAML-Einstellungen verfügbar, um diese Probleme zu beheben.